定数リストと動的に作成されたリストを区別する方法は?

私は学生ですが、明日のテストをして、昨年、この質問がありました: '(ab)(list' a 'b)と区別するスキームコードを書いてください。 set set-car! ..)を使用せずに 私はこれをどうやって行うのか分かりません。誰にもアイデアはありますか?

違いがあるのは、 '(a b)が参照されるメモリ内に静的オブジェクトを作成するためです。また、(list 'a' b)は動的メモリオブジェクトを作成するアプリケーションです。


私の先生は、入力に応じて異なる答えを出すか、または入力が無限ループを引き起こすコードを期待しています。

副作用を使用するコードの例:

(define lst (lambda() '(a b)))
(set-car! (lst) 'g)
(display (lst)) (newline)
;;; prints (g b)

(define lst1 (lambda() (list 'a 'b)))
(set-car! (lst1) 'g)
(display (lst1)) (newline)
;;; prints (a b)

その理由は、 lambda が値の計算を延期しているため、(list 'a' b) code>(lst1)が呼び出されます。

質問がうまくいかないと不平を言う人のために:コースはコンパイラに関するもので、コード生成までにどのような影響があるかを理解してほしい。

2
動的に書く? (タイトルを参照)
追加された 著者 Coffee,
私はそれが一般に可能であるとは思わない。たぶん特定の実装では、私はその点を見ていない。
追加された 著者 Rhangaun,
合意した前述のようなクイズの問題は、実装が実装に依存する(つまり、未定義の動作)場所には不快なほど近くに位置するため、構築が難しいようです。 mutablityを使用しないことは、実際のプログラマーにとって、この主題を実際に有用にするものを殺してしまいます。
追加された 著者 dyoo,

1 答え

オブジェクトはメモリの場所によって区別できるという前提があります。 6.1節の同義語の述語、特に eqv?。

具体的には:

(define x '(a b))
(define y (list 'a 'b))

(eqv? x y)
(eqv? y x)
(eqv? x x)
(eqv? y y)

すべてが明確な値を持っています。

あなたが注意するように、

(eqv? '(a b) '(a b))

実装固有のものです。あなたの試験問題が未定義の突然変異で何が起こるかを尋ねる場合、私は非常に「Foo」に返答したいと思っています。 :)それ以上の文脈がなければ、それはナンセンスな質問です。

一方、

(eqv? (list 'a 'b) (list 'a 'b))

よく定義されています。

3
追加された
それは、とeqv?その不特定。それはどのように役立ちますか? 2.標準スキームでもそうですか?または単にR5RSで?
追加された 著者 Ramzi Kahil,
さて、問題が良いかどうかは、私には関係がありません - 私は答えますか、あるいは得点を得ません。 - eqvについて? (eqv? '(ab)'(ab)) - (例えばchezスキームで)テストされたかどうかは分かりません(eqv? '(ab)'(ab) ab)(list 'a' b)) - 質問を更新しました。
追加された 著者 Ramzi Kahil,
すべてが未定義であるとは限りません。あなたのクイズの質問によって記述された非常に狭い、狭い状況については、eq?とeqv? '(1 2)と(リスト1 2)の違いを知ることができます。しかし、以前にコメントしたように、ええ、この質問はそれほど大きくはありません。問題をより関連性のあるものにするのは、ベクトルのように、質問を理解するために記憶の精神モデルを持つことが実際問題となる可変値を比較することです。
追加された 著者 dyoo,
指定するには:あなたは、2つの値が別々の場所にあると述べました。このシナリオでは、eqv?が定義される。
追加された 著者 dyoo,
私は他のインストラクターのために話すことができませんが、私は、なぜ質問が良いものではないのかよく言葉の説明がフルポイントの価値があるはずだと主張する。
追加された 著者 John Clements,