Scheme
2つの機能を検討する
; Define function
(define (square n) (* n n ))
(square 12)
144
; Another way to define same function
(define square (lambda (n) (* n n)))
(square 12)
144
どちらも同じ結果になるようです。
これらの関数宣言の間に機能的な違いはありますか?状況によっては、一方を他方よりも優先する必要がありますか?
2つの定義に違いはありません。前者は後者の糖衣構文です。
どちらを好むかはスタイルの問題ですが、私の印象では、前者の方がやや簡潔で読みやすいため、関数を定義する方法として一般的に好まれています。
紹介テキストでは、名前付き関数が単にラムダを保持する変数であることを明確にするために後者を使用することがよくあります。これは、最初のバリアントを使用する場合はそれほど明確ではありません。
sepp2kは、定義する2つの手順が同一であるという点で完全に正しいです。このような単純な手順の定義では、どちらかが正しく、好みの問題になります。
明示的なlambda
ステートメントを使用することが理にかなっている1つのケースは、プロシージャ内のある種の状態を追跡する必要がある場合です。たとえば、次のようなカウンターを作成できます。
(define counter
(let ((count 0))
(lambda ()
(set! count (+ count 1))
count)))
(counter) ;=> 1
(counter) ;=> 2
(counter) ;=> 3