0

我需要实现一个有一个参数的函数obj——它返回一个 Scheme 表达式,在评估时,它将返回obj.

关于如何解决问题的任何想法?

4

2 回答 2

1

我猜你的意思是写“一个函数 expr-returning [接受] obj [and] 返回一个 Scheme 表达式,在评估时,......”

假设是这种情况:您真正需要的是设计配方。首先:写下你的函数接受什么以及它返回什么的例子。这将澄清你想要做什么,对他人和(可能更重要的是)对你自己。

希望这会有所帮助;抱歉这么不透明……

于 2011-02-24T17:11:32.193 回答
1

如果您希望您的过程能够复制任何对象,那么该对象可以是 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)
等等
于 2011-02-24T21:13:17.523 回答