1

私はスキームが初めてです。次のコードを実行すると

(define lst '(1))

(let ((func1 (lambda lst 
               (begin (display lst)
                      lst))))
  (begin (display lst) 
         (func1 lst)))

(1)((1))'((1))つまり、lst は 4 行目で呼び出されたときのように表示されますが(1)、関数に渡すfunc1と になり((1))ます。ここで正確に何が起こったのですか?

4

2 に答える 2

3

(lambda Args E)意味: この関数の可変長引数リストを にバインドしますArgs。例えば

(define f (lambda args `(got ,(length args) arguments)))
(display (f 'foo 'bar 'baz))

印刷されます(got 3 arguments)lambda表現を変えると

(lambda (lst) (begin (display lst) lst))
;;;     ^---^

次に、関数はその単一の引数を出力して返します。

于 2012-09-21T13:25:23.813 に答える
2

フォームで、これlambdaを書くと:

(lambda x <body>)

... 0 個以上の要素を持つパラメーターxリストであると宣言しています。一方、これは:

(lambda (x) <body>)

x...それは単一のパラメーターであると述べています。質問では、このコード(begina の本体部分には不要ですlambda):

((lambda lst (display lst) lst) '(1))

... パラメータのリストを表示して返します。渡す'(1)と、次のように評価され'((1))ます: たまたまリストである単一の要素を持つリスト。

確かに、代わりにこれを行うつもりでした:

((lambda (lst) (display lst) lst) '(1))

...これは、受け取った単一のパラメーターを表示して返します-上記の式を渡す場合、パラメーター自体に'(1)評価されます。'(1)

于 2012-09-21T14:42:23.090 に答える