対のリストを定義します。スキームIスキームで起こる何かのinterstingを把握しようとするシンボル
(define last-pair
(lambda (x)
(if (null? (cdr x))
x
(last-pair (cdr x)))))
私はこのようにfooの定義された:3回
(define foo
(lambda()
(let ((s (list 'he 'said:)))
(set-cdr! (last-pair s)
(list 'ha 'ha))
s)))
と実行FOOを、I得た:
(he said: ha ha)
(he said: ha ha)
(he said: ha ha)
しかし、私はこのようにfooの定義:
(define foo
(lambda()
(let ((s '(he said:)))
(set-cdr! (last-pair s)
(list 'ha 'ha))
s)))
とのfooを3回実行して、私が得た:
(he said: ha ha)
(he said: ha ha ha ha)
(he said: ha ha ha ha ha ha)
しかし、なぜ?私の最初の考えは、最初にfoo
に新しいリストを作成し、2番目には新しいリストを作成しないことでした。しかし、私はそれがいかに機能しているか理解していませんでした。 2番目のfoo
でアドレスを定義し、何をするか? 2番目のfooにもリストとして定義されていますか?またはシンボル?
ありがとうございました。
あなたはどのSchemeの通訳者を使用していますか?私はラケットでその振る舞いを再現できませんでした。なぜなら '(abc)構文は不変のリストを生成するので、常に変更可能なリストを作成するために 'mlist'を使用する必要があるからです。 –
@ÓscarLópez:Dr.SchemeまたはchezSchemeを使用します –
古いバージョンではRacketと呼ばれていますが、他の多くの新機能の中でも、リストが明示的に変更可能であると宣言されていない限り、リストの変更は禁止されています。多分あなたはバグを見つけましたか?あまりに面倒でないならラケットを試してみることをお勧めします –