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将其包装起来,以提供所需的行为呢?