質問するログイン新規登録

回答編集履歴

3

補足追加

2026/02/11 03:51

投稿

otn
otn

スコア86548

answer CHANGED
@@ -25,7 +25,7 @@
25
25
  上記の通り、毎回クロージャー相当を作成するコストが追加なのと、初回かどうかあたりですね。
26
26
  プログラムサイズ的には正格評価の方が小さい。実行時間は「すべての仮引数が評価される」ならこれも正格評価。「評価されないかもしれない実引数」場合はその重さと確率とでの総合評価ですが、「この引数が参照されるのはとてもレア」という関数はあまりないであろうと思います。
27
27
 
28
- あと、単に「遅延評価」というと「仮引数の初回参照時に一度だけ実引数を評価」を指すと思いますが、「仮引数が参照されるたびに実引数を評価する」言語だと、こんな感じです。
28
+ あと、単に「遅延評価」というと「仮引数の初回参照時に一度だけ実引数を評価」を指すと思いますが、「仮引数が参照されるたびに実引数を評価する」言語だと、こんな感じです。実装はさておき、概念的には、実引数のgetterとsetterがクロージャーとして関数にわたり、関数側では参照・代入の際にgetter・setterを呼ぶ。
29
29
  ```call_by_nameの架空言語
30
30
  foo(int x, int y){
31
31
  print(x, y); // 出力は 0 1 となるのは普通の言語と同じ;

2

表現修正

2026/02/11 03:39

投稿

otn
otn

スコア86548

answer CHANGED
@@ -25,7 +25,7 @@
25
25
  上記の通り、毎回クロージャー相当を作成するコストが追加なのと、初回かどうかあたりですね。
26
26
  プログラムサイズ的には正格評価の方が小さい。実行時間は「すべての仮引数が評価される」ならこれも正格評価。「評価されないかもしれない実引数」場合はその重さと確率とでの総合評価ですが、「この引数が参照されるのはとてもレア」という関数はあまりないであろうと思います。
27
27
 
28
- あと、「仮引数が参照されるたびに実引数を評価する」言語だと、こんな感じです。
28
+ あと、単に遅延評価」というと「仮引数の初回参照時に一度だけ実引数を評価」を指すと思います、「仮引数が参照されるたびに実引数を評価する」言語だと、こんな感じです。
29
29
  ```call_by_nameの架空言語
30
30
  foo(int x, int y){
31
31
  print(x, y); // 出力は 0 1 となるのは普通の言語と同じ;

1

追記した

2026/02/11 03:37

投稿

otn
otn

スコア86548

answer CHANGED
@@ -14,3 +14,24 @@
14
14
 
15
15
 
16
16
  ※:「前から後ろ」と言いつつ、C/C++の場合は、引数が複数個あった場合に「引数がどの順番で評価されるのかは言語規格上は不定であり、経験上、多くの処理系では最後の引数が最初に評価され、第一引数が最後に評価される」というのが少し直感的ではないです。
17
+
18
+ -----
19
+ 追記:
20
+ 朝書き始めて続き書いて投稿する間にコメント増えてた。
21
+
22
+ > 正格評価だと、それらの実行時のコストは掛からないのですか?
23
+ > 正格評価と遅延評価は評価のタイミングが違うだけでやる処理の内容は同じなのかと私は理解しました。
24
+
25
+ 上記の通り、毎回クロージャー相当を作成するコストが追加なのと、初回かどうかあたりですね。
26
+ プログラムサイズ的には正格評価の方が小さい。実行時間は「すべての仮引数が評価される」ならこれも正格評価。「評価されないかもしれない実引数」場合はその重さと確率とでの総合評価ですが、「この引数が参照されるのはとてもレア」という関数はあまりないであろうと思います。
27
+
28
+ あと、「仮引数が参照されるたびに実引数を評価する」言語だと、こんな感じです。
29
+ ```call_by_nameの架空言語
30
+ foo(int x, int y){
31
+ print(x, y); // 出力は 0 1 となるのは普通の言語と同じ;
32
+ x = 10;
33
+ print(x, y); // 出力は 10 1 じゃなくて 10 11 になる
34
+ }
35
+ int a=0;
36
+ foo(a, a+1);
37
+ ```