更新 2:誤解を招くため、例を削除しました。以下のものはより関連性があります。
私の質問:
そのような構造を持つプログラミング言語はありますか?
更新: 考えてみると、Prolog にも似たようなものがあります。定義行で操作を定義することもできます。(バックトラックとリレーションは忘れてください - 構文について考えてください)
私がこの質問をしたのは、言語に対称性があることは素晴らしいことだと信じているからです。「入力」パラメーターと「出力」パラメーターの対称性。
そのような値を返すのが簡単なら、設計された言語で明示的に返すことをやめることができます。
ペアを再帰しています...これはハックだと思います。複数のパラメーターを関数に渡すためのデータ構造は必要ありません。
更新 2:
私が探している構文の例を挙げると:
f (s, d&) = // & indicates 'out' variable
d = s+s.
main =
f("say twice", &twice) // & indicates 'out' variable declaration
print(twice)
main2 =
print (f("say twice", _))
または機能的+プロローグスタイルで
f $s (s+s). // use $ to mark that s will get it's value in other part of the code
main =
f "say twice" $twice // on call site the second parameter will get it's value from
print twice
main2 =
print (f "Say twice" $_) // anonymous variable
提案された言語では、すべての戻り値がパラメーターを介して行われるため、式はありません。これは、深い階層関数呼び出しが自然な状況では面倒です。Lisp の例:
(let x (* (+ 1 2) (+ 3 4))) // equivalent to C x = ((1 + 2) * (3 + 4))
すべての一時変数の言語名に次のものが必要です。
+ 1 2 res1
+ 3 4 res2
* res1 res2 x
そこで、関数呼び出し全体をこの変数の値に変換する無名変数を提案します。
* (+ 1 2 _) (+ 3 4 _)
これはあまり自然なことではありません。なぜなら、私たちが持っているすべての文化的な荷物があるからです。しかし、現在私たちが持っている構文に関するすべての先入観を捨てたいと思います。