私はスキームについての本を読んで、それは次の例があります。スキーム - 動的スコープとinfinteループ
(define map
(lambda (f s)
(if (null? s)
'()
(cons (f (car s))
(map f (cdr s)))))
(map (lambda (s)
(set! s '(1 2 3 4))
'hello)
'(a b c d))
それはダイナミックスコープでは、我々は無限ループに入ることを言います。しかし、なぜ?私が理解できるように、我々はアプリケーションを適用した後、我々は
f = (lambda (s)
(set! s '(1 2 3 4))
'hello)
とs = '(a b c d)
にマッピングするために到着しました。さて、最初の実行のために、我々は(car '(a b c d)
にf
を適用します。
((lambda (s)
(set! s '(1 2 3 4))
'hello)
(car '(a b c d)))
そして今、それは(1 2 3 4)
するa
を変更します。それで、ここにループはどこにありますか?
これは質問にはまったく関係ありませんが、 'f'の呼び出しは' 'a'を' '(1 2 3 4)' 'に変更することは間違っています。 Schemeは関数パラメータを値で渡すので、 '(set!s ...)'は現在のスコープ内の変数 's'の値だけを変更できます。元のリストの 'a'を置き換えるには、関数は引数として全体のリストを取り、その上に' set-car! 'を呼び出さなければなりません。 –