質問: 定数リストと動的に作成されたリストを区別する方法は? 私は学生ですが、明日のテストをして、昨年、この質問がありました: `'(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)が呼び出されます。 質問がうまくいかないと不平を言う人のために:コースはコンパイラに関するもので、コード生成までにどのような影響があるかを理解してほしい。
回答: オブジェクトはメモリの場所によって区別できるという前提があります。 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)) ``` よく定義されています。**