たとえば、私は次のように書きます。
x = 2
y = x + 4
print(y)
x = 5
print(y)
そしてそれは出力します:
6 (=2+4)
9 (=5+4)
また、これが実際に役立つ場合はありますか?
明確化:はい、ラムダなどがこの問題を解決します(これらは私がこのアイデアにたどり着いた方法でした)。これがデフォルトである特定の言語があるかどうか疑問に思いました。関数やラムダキーワードは必要ありません。
たとえば、私は次のように書きます。
x = 2
y = x + 4
print(y)
x = 5
print(y)
そしてそれは出力します:
6 (=2+4)
9 (=5+4)
また、これが実際に役立つ場合はありますか?
明確化:はい、ラムダなどがこの問題を解決します(これらは私がこのアイデアにたどり着いた方法でした)。これがデフォルトである特定の言語があるかどうか疑問に思いました。関数やラムダキーワードは必要ありません。
x
基本的にすべてが関数ですが、変数は一度しかバインドされない (つまり、同じスコープで再割り当てできない) ため、Haskell は途中であなたに会います。
y = x + 4
変数の割り当てを考えるのは簡単ですが、 y = map (+4) [1..]
(つまり、無限リストのすべての数字に 1 から 4 を追加することを意味します) を見ると、y
今は何でしょう? 無限リストですか、それとも無限リストを返す関数ですか? (ヒント: 2 つ目です。) この場合、変数を関数として扱うことは、 lazinessを利用するときに、絶対に必要ではないにしても、非常に有益です。
実際、Haskell では、 の定義y
は、引数を受け入れずに を返す関数x+4
でx
あり、 も引数をとらず、値 2 を返す関数です。
一次関数を使用する言語では、無名関数を変数に割り当てるのは簡単ですが、ほとんどの言語では、関数呼び出しを示すために括弧を追加する必要があります。
Lua コードの例:
x = function() return 2 end
y = function() return x() + 4 end
print(y())
x = function() return 5 end
print(y())
$ lua x.lua 6 9
または、Python で同じこと (一次関数に固執しますが、単純な整数を に使用することもできますx
):
x = lambda: 2
y = lambda: x() + 4
print(y())
x = lambda: 5
print(y())
$ python x.py 6 9
C#でfunc式を使用できます
Func<int, int> y = (x) => x + 5;
Console.WriteLine(y(5)); // 10
Console.WriteLine(y(3)); // 8
... また ...
int x = 0;
Func<int> y = () => x + 5;
x = 5;
Console.WriteLine(y()); // 10
x = 3;
Console.WriteLine(y()); // 8
...本当に機能的なスタイルでプログラムしたい場合は、最初のオプションがおそらく最適です。
F#、Haskell、Scalaなどのさまざまな関数型言語をチェックしてください。Scalaは関数をapply()メソッドを持つオブジェクトとして扱い、他の種類のオブジェクトと同じように、関数を変数に格納して渡すことができます。ただし、Scala関数の定義をコードとして出力できるかどうかはわかりません。
更新:少なくともいくつかのLispでは、関数をコードとしてきれいに印刷できることを思い出しているようです(たとえば、Schemeのきれいな印刷関数)。
プログラミング言語Lucidはこれを行いますが、関数ではなく呼び出しx
と「ストリーム」を行います。y
プログラムは次のように記述されます。
y
where
y = x + 4
end
そして、次のように入力します。
x(0): 2
y = 6
x(1): 5
y = 7
もちろん、Lucid は (ほとんどの興味深いプログラミング言語と同様に) あまり知られていないため、誰も見つけられなかったとしても不思議ではありません。(またはそれを探した)
これがスプレッドシートの仕組みです。
また、関数の引数を評価するための名前セマンティクスによる呼び出しにも関連しています。Algol 60 にはそれがありましたが、実装が複雑すぎて普及しませんでした。
これらの中で私が見た中で最も近いものは、チャートコンポーネントのテクニカル分析システムの一部です。(トレードステーション、メタストックなど)が、主にメタデータの複数のセット(購入/販売シグナルなど)を返すことに重点を置いており、メタデータまたは財務データを受け入れるか、直接プロットする他の関数にフィードできます。
私の2c:あなたが提案する言語は、控えめに言っても非常に混乱するでしょう。関数は通常、正当な理由でr値です。このコード(javascript)は、r値として機能を強制することで読みやすさ(したがってメンテナンス)がn倍に向上することを示しています。
var x = 2;
var y = function() { return x+2; }
alert(y());
x= 5;
alert(y());
Selfはフィールドとメソッドを区別しません。どちらもスロットであり、まったく同じ方法でアクセスできます。スロットには値または関数を含めることができます (したがって、これら 2 つは依然として別個のエンティティです) が、その区別はスロットのユーザーには関係ありません。
Scala では、関数に遅延値と名前による呼び出し引数があります。
def foo(x : => Int) {
println(x)
println(x) // x is evaluated again!
}
何らかの方法で、これはあなたが探していた効果を持つことができます。