Scheme 如何返回对象的副本?

Scheme 如何返回对象的副本?,scheme,racket,r6rs,Scheme,Racket,R6rs,我需要实现一个单参数函数--obj,该函数返回一个Scheme表达式,当对该表达式求值时,将返回一个obj的副本 关于如何处理这个问题,你有什么想法吗?我猜你的意思是写“一个函数expr返回[接受]obj[并]返回一个Scheme表达式,在计算时,…” 假设情况是这样的:这里真正需要的是设计配方。首先:写下函数接受什么和返回什么的例子。这将明确你想对他人和(可能更重要的)你自己做什么 希望这是有帮助的;很抱歉这么不透明…如果您希望您的过程能够复制任何对象,那么该对象可以是Scheme的任何一个对

我需要实现一个单参数函数--
obj
,该函数返回一个Scheme表达式,当对该表达式求值时,将返回一个
obj
的副本


关于如何处理这个问题,你有什么想法吗?

我猜你的意思是写“一个函数expr返回[接受]obj[并]返回一个Scheme表达式,在计算时,…”

假设情况是这样的:这里真正需要的是设计配方。首先:写下函数接受什么和返回什么的例子。这将明确你想对他人和(可能更重要的)你自己做什么


希望这是有帮助的;很抱歉这么不透明…

如果您希望您的过程能够复制任何对象,那么该对象可以是Scheme的任何一个对象,因为它们具有不同的类型,它们具有不同的“性质”或结构,或者诸如此类,因此,复制一种类型的对象必然涉及不同的策略,而不是复制另一种类型的对象

因此,您如何处理这一问题是检查每个Scheme的类型(或者更确切地说,是您关心处理的Scheme类型的子集),并弄清复制该类型的对象意味着什么。如果你以一种显而易见的方式来做这件事,你应该会得到一套专门的程序,比如拷贝编号、拷贝符号等等(扰流板:这些程序中的很多都不会很有趣)

要将这些专门化的过程合并为一个可以复制任何对象的过程,只需确定对象的实际类型并调用COPY-FOO过程即可(您也可以将过程内联展开)。您可以使用COND和类型确定谓词非常轻松地组织这一过程:

(define (copy-object obj)
  (cond ((number? obj) (copy-number obj))
        ((boolean? obj) (copy-boolean obj))
        ...
        ))
这是一种通用的设计模式,用于在数据上执行操作,而不管其类型是什么,称为“类型上的分派”。实际上,这是一种非常糟糕的通用编程方法,在这种情况下,这并不重要

最后一件事是退回一件你可以评估以获得副本的东西,这会增加麻烦。不妨直截了当地告诉您:将对COPY-OBJECT的调用封装在不带参数的lambda表达式中:

(define (expr-returning obj)
  (lambda () (copy-object obj)))
然后你可以做像这样的事情

guile> (define x (list 1 2 3 4)) guile> (define y (expr-returning x)) guile> (define cx (y)) guile> x (1 2 3 4) guile> cx (1 2 3 4) guile> (set-cdr! x 'foo) guile> x (1 . foo) guile> z (1 2 3 4) etc. guile>(定义x(列表1 2 3 4)) guile>(定义y(表达式返回x)) guile>(定义cx(y)) guile>x (1 2 3 4) guile>cx (1 2 3 4) guile>(设置cdr!x'foo) guile>x (1.foo) guile>z (1 2 3 4) 等
你指的是什么样的对象?为什么不直接返回obj?我想你是在计划破坏性的修改。为什么不创建一个函数,返回一个修改过的副本,然后用一个continuation将其包装起来,以提供所需的行为呢?