web-dev-qa-db-ja.com

スキームまたは一般的に使用される「サンク」とは何ですか?

Schemeや同様の領域に関連するコードやドキュメントの多くの場所で「サンク」という言葉に出くわします。プロシージャの総称であり、正式な引数が1つしかないのではないかと思います。あれは正しいですか?はいの場合、それ以上のものはありますか?いいえの場合、お願いしますか?

例えば。 SRFI 18 の「手順」セクション。

56
user59634

とても簡単です。プログラムに3を5に追加するなどの計算がある場合、そのサンクを作成すると、直接計算することを意味しますnot代わりに、引数がゼロの関数を作成して、実際の値が必要です。

(let ((foo (+ 3 5))) ; the calculation is performed directly, foo is 8
  ;; some other things
  (display foo)) ; foo is evaluated to 8 and printed

(let ((foo (lambda () (+ 3 5)))) ; the calculation is delayed, foo is a
                                 ; function that will perform it when needed
  ;; some other things
  (display (foo))) ; foo is evaluated as a function, returns 8 which is printed

2番目のケースでは、fooはサンクと呼ばれます。

怠惰な言語は、変数を値にバインドすることとその値を返す関数を作成することの間の境界線を曖昧にするため、上記の最初の形式のようなものを書くことは、実際には2番目の形式のように扱われます。

68
Svante

「サンク」は、正式な引数のないプロシージャオブジェクトです。 SRFIリンクから:

(lambda () (write '(b1)))

B1変数は囲んでいるブロックにバインドされており、これにより、文法の不備についてのジョークに依存する「サンク」という単語の語源の手がかりが得られます。

引数なしの関数にはパラメーターがないため、呼び出されたパラメーターに基づいて動作を変更する方法はありません。したがって、関数の操作全体が設定されます。実行されるのを待っているだけです。コンピュータの側でこれ以上「思考」は必要ありません。すべての「思考」が実行されました。アクションは完全に「サンク」されます。

これがすべて「サンク」であり、このSRFIのコンテキストにあります。引数のないプロシージャです。

39
Steven Huwig

ウィキペディア 次の答えがあります:

関数型プログラミングでは、「サンク」はnullary関数(引数をとらない関数)の別名です。サンクは、遅延評価をシミュレートする手段として、厳密な言語で頻繁に使用されます。サンク自体が関数の引数の計算を遅らせ、関数はサンクに実際の値を取得するように強制します。このコンテキストでは、サンクはしばしば一時停止または(スキームでは)約束と呼ばれます。

Schemeの遅延評価例 を追加します。ここで、約束はサンクの別の言葉です。

13
Johan Kotlinski