が、私は次の2つのコードスニペットを理解しようとしている字句-てみましょう:のelispのラムダ、引用、および
(defun make-adder1 (n) `(lambda (x) (+ ,n x)))
(defun make-adder2 (n) (lexical-let ((n n)) (lambda (x) (+ n x))))
これらの両方は、呼び出し可能オブジェクトを生成するように見える:
(funcall (make-adder1 3) 5) ;; returns 8
(funcall (make-adder2 3) 5) ;; returns 8
これらの両方の仕事を。私は2つの主な質問があります:
1)私は2つのアプローチの間の "引用レベル"の相違を理解していません。最初のケースでは、ラムダ式が引用されています。つまり、値の代わりに "シンボル自体"が返されます。 2番目のケースでは、ラムダのステートメントが評価されるように見えるので、ラムダの値が返されます。しかし、これらはどちらもfuncall
で動作します。 funcall
をed関数で使用する場合は、引用符で囲む必要があります。レキシカルでは何らかの引用が自動的に行われますか?これは驚くべきことではありませんか?
2)このトピックに関する他の記事を読むと、最初のアプローチは特定の状況下では破壊され、他の言語ではラムダと高次関数を使用することで期待されるものから逸脱することを理解しています。デフォルトでは動的スコープがあります。誰かがこの違いを明白にして説明するコードの具体的な例を挙げることはできますか?
はこれが重複しなければなりませんが、私はそれを探すために時間を持っていません... – Drew