0

手順から取得したリストを別のリストに追加する方法について少し混乱しています。これがassoc私が持っているものです:

(define new-list (list 'test))
(define source-a (list '(a foo) '(b bar) '(c hello)))
(append new-list (assoc 'a source-a))
(display new-list)

出力はちょうど(test)で、なぜそうでないのかわかりません(test a foo)。このように追加することは可能ですか?

4

1 に答える 1

2

これappendは、 が変化関数ではないためです。引数が一緒に追加された新しいリストを返します。Scheme の慣習により、突然変異を実行する関数は のように感嘆符で終わりset!ます。

次のように、更新されるように変更するために使用できます。set!new-list

(set! new-list (append new-list (assoc 'a source-a)))

ただし、Scheme ではこれは非常に推奨されません。命令型プログラミングはミューテーションを多用しますが、関数型プログラミング言語 (Scheme を含む) はミューテーションと副作用を回避しようとします。

理想的には、既存のバインディングを更新するのではなく、新しい値で新しいバインディングを宣言するだけです。このようなものはうまくいきます:

(define original-list (list 'test))
(define source-a (list '(a foo) '(b bar) '(c hello)))
(define new-list (append original-list (assoc 'a source-a)))
(display new-list)
于 2015-03-10T11:47:08.660 に答える