私はダニエル・フリードマンのリトル・シェマーの本を読んでいます。本のすべての関数がラムダ式で書かれている理由がわかりません。
(define fun1
(lambda (x1 x2)
(+ x1 x2)))
(define (fun2 x1 x2)
(+ x2 x2))
2 つの関数は同じことを行いますが、2 番目の関数の方が優れています。どこでもラムダを使用する理由に興味があります。
この場合、DrRacket を使用しました。
私はダニエル・フリードマンのリトル・シェマーの本を読んでいます。本のすべての関数がラムダ式で書かれている理由がわかりません。
(define fun1
(lambda (x1 x2)
(+ x1 x2)))
(define (fun2 x1 x2)
(+ x2 x2))
2 つの関数は同じことを行いますが、2 番目の関数の方が優れています。どこでもラムダを使用する理由に興味があります。
この場合、DrRacket を使用しました。
(define (x . a) ...)
の単なる略語です
(define x (lambda a ...))
1975 年の最初の計画報告書には、この略語はありませんでした。1978年からの改訂報告では、それが導入されました。
little Schemer は、1974 年のThe little Lisper の最新版です。Schemeより前のバージョンであり、Scheme に従うように修正されたとき、可能な限りオリジナルに近づけようとしました。また、使用する場合(define x (lambda (arg1) ...))
、プロシージャバインディングが他の変数バインディングと変わらないことは明らかです。ただし、それが指すオブジェクトはデータではなくクロージャコードです。
SICP のビデオ講義を見ると、Abelson と Sussman にはこれと混同している学生がいることがわかります。そのため、おそらくこれらのうちの 1 つだけを使用するのが最善です。構文糖の代わりに明示的なラムダを使用した形式。
ラムダ式は、(たとえば) 3 が整数リテラルであるように、関数リテラルです。大きな式で 3 を使用できず、変数を定義して 3 に初期化する必要があるプログラミング言語を想像できます。それでも機能しますが、不便で邪魔になります。ほとんどの言語は関数の場合に似ていますが (一度定義してから呼び出すことができます)、関数型言語を使用すると、関数を他の変数と同じように扱うことができ、文字どおりに参照することもできます。
特定の整数が必要だが変数を気にする必要がない場合に整数リテラルを使用するのと同じように、関数が必要であるが名前を付ける必要がない場合にラムダ式を使用します。
一般的な使用法は、引数として関数を取り、その関数を他の引数のすべての要素に適用する mapcar のような関数です。場合によっては、名前を付ける必要なく、1 回限りの関数をその関数にスローしたいことがあります。
その特定の例を見るだけで、私は彼らがスキームと Lisp の違いを指摘していると思います (Lisp は多少異なっています)。