4

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)

4

3 に答える 3

4

(set! location (cons (car location) value))

式は新しいペアを(cons (car location) value)割り当てます。

の目的はset-cdr!、既存のペアを変更することです。

したがって、実装set-cdr!には、基盤となるストレージへの「特別な」アクセスが必要です。

于 2012-07-25T21:56:52.527 に答える
2

これは、短所、車、Cdr、セットカーを実装する例です!とSet-cdr!クロージャを使用します。

(define (Cons x y)
  (lambda (message . val)
    (cond
      [(eq? message 'car) x]
      [(eq? message 'cdr) y]
      [(eq? message 'set-car!) 
       (set! x (car val))]
      [(eq? message 'set-cdr!) 
       (set! y (car val))]
      [else 'unknown-message])))

(define (Car pair)
  (pair 'car))

(define (Cdr pair)
  (pair 'cdr))

(define (Set-cdr! pair val)
  (pair 'set-cdr! val))

(define (Set-car! pair val)
  (pair 'set-car! val))

(define p (Cons 1 2))
(Car p)
(Cdr p)
(Set-car! p 3)
(Car p)
(Set-cdr! p 4)
(Cdr p)
于 2012-07-25T22:13:13.893 に答える
1

基本的にセットを実装できます!setなし!ですが、set-car!/ set-cdr!を実装できるとは思いません。ペアを変更したり、ペアをシミュレートしたりすることなく(soegaardの例のように)

スキームでSchemeの実装を行っているように見えるので、set-car!/ set-cdr!を使用します。インタプリタに実装するか、まったく実装しません。私はdefine、if、quote、pair?、eq?、cons、car、cdr(LISPのルーツに似ていますが、よりスキーム的です)から始めて、基本的な最小実装を開始し、さらに拡張しました。

とにかく..あなたの実装は、あなたが実装するならば、それはこれをすることができるはずです:

(define odds (list 1 3 5 7 9 11))
(set-car! (cddr odds) #f)
odds
===> (1 3 #f 7 9 11)
于 2012-08-04T01:36:53.323 に答える