引数が 1 つの関数を実装する必要があります -- obj
-- これは、評価されると のコピーを返す Scheme 式を返しますobj
。
問題を進める方法についてのアイデアはありますか?
私はあなたが「expr-returning [それを受け入れる] obj [そして] 評価されたときにScheme式を返す関数」を書くつもりだったと推測しています...
これが事実であると仮定すると、ここで本当に必要なのは設計レシピです。まず、関数が受け入れるものと返すものの例を書き留めます。これにより、あなたが何をしようとしているのかが明確になります。
これが役に立てば幸いです。不透明ですみません…
プロシージャで任意のオブジェクトを複製できるようにする場合、そのオブジェクトは、Scheme の基本型のいずれかにすることができます。 異なるタイプであるため、それらは異なる「性質」または構造、またはあなたが持っているものを持っているため、あるタイプのオブジェクトのコピーを作成することは、異なるタイプの別のオブジェクトのコピーを作成することとは異なる戦略を必然的に伴います。タイプ。
したがって、これにどのようにアプローチするかは、Scheme の各型 (または、処理に関心のある Scheme の型のサブセット) を調べて、その型のオブジェクトを複製することの意味を理解することです。これを明白な方法で行うと、COPY-NUMBER、COPY-SYMBOL などの一連の特殊な手順になるはずです (ネタバレ: これらの手順の多くはあまり面白くありません)。
これらの特殊化されたプロシージャを、指定した任意のオブジェクトを複製できる単一のプロシージャに結合するには、オブジェクトの実際のタイプを決定し、COPY-FOO プロシージャを呼び出して作業を実行します (プロシージャをインラインで展開することもできます)。これは、COND と型決定述語を使用して非常に簡単に整理できます。
(define (copy-object obj)
(cond ((number? obj) (copy-number obj))
((boolean? obj) (copy-boolean obj))
...
))
これは、タイプに関係なくデータムに対して操作を実行するための一般的な設計パターンであり、「ディスパッチ オン タイプ」と呼ばれます。これは、実際にはジェネリック プログラミングを行うには非常に貧弱な方法ですが、この状況ではそれほど重要ではありません。
最後に、コピーを取得するために評価できるものを返すという追加のしわがあります。COPY-OBJECT への呼び出しを、引数のないラムダ式内にカプセル化します。
(define (expr-returning obj)
(lambda () (copy-object obj)))
次に、次のようなことができます
guile> (define x (list 1 2 3 4)) guile> (定義 y (expr を返す x)) guile> (定義 cx (y)) ガイル>× (1 2 3 4) ガイル> cx (1 2 3 4) ガイル> (set-cdr! x 'foo) ガイル>× (1 . フー) ガイル> z (1 2 3 4) 等