Schemeで使用するマクロとして実装set-car!
およびset-cdr!
移植可能ですか?set!
それとも、基盤となるストレージシステムへの特別なアクセスが必要ですか?
私は自分のSchemeインタープリターを実装しているので、質問しています。Schemeコードをできるだけ多く使用したいと思います。
私の最初の試みset-cdr!
は:
(define-syntax set-cdr!
(syntax-rules ()
((set-cdr! location value)
(set! location (cons (car location) value)))))
これはほとんど機能しますが、循環リストでは機能しません。
#; mickey> (define x (list 1 2))
#; mickey> x
(1 2)
#; mickey> (set-cdr! x x)
#; mickey> x
(1 1 2)
マクロ本体をラップするlet
ことも役に立ちませんでした。なぜなら、私がそうするとき(set! (cons (car location) value)
、それvalue
はすでにであると評価されているからです'(1 2)
。