我需要实现一个有一个参数的函数obj
——它返回一个 Scheme 表达式,在评估时,它将返回obj
.
关于如何解决问题的任何想法?
我猜你的意思是写“一个函数 expr-returning [接受] obj [and] 返回一个 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 的调用封装在没有参数的 lambda 表达式中:
(define (expr-returning obj)
(lambda () (copy-object obj)))
然后你可以做类似的事情
诡计>(定义 x(列表 1 2 3 4)) guile> (define y (expr-returning x)) 诡计>(定义cx(y)) 诡计> x (1 2 3 4) 诡计>cx (1 2 3 4) 诡计> (set-cdr!x 'foo) 诡计> x (1 . foo) 诡计>z (1 2 3 4) 等等