【发布时间】:2015-06-23 09:05:56
【问题描述】:
我们有一门课程,其项目是在 C++ 中实现一个微方案解释器。在我的实现中,我将 'if'、'define'、'lambda' 视为过程,因此在我的实现中对 eval ' 是有效的if'、'define' 或 'lambda',也可以写成 '(apply define (quote (a 1)))' 这样的表达式,它将 'a' 绑定到 1。
但我发现在球拍和 mit-scheme 中,'if'、'define'、'lambda' 是不可评估的。例如,
它们似乎不是程序,但我无法弄清楚它们是什么以及它们是如何实现的。 有人可以向我解释这些吗?提前致谢。
【问题讨论】:
-
这些是核心“表单”或宏。你在编译器中实现它们。
-
在你的实现中,如果你这样做
(if #f (display true) (display false))会发生什么? -
我的实现没有关键字'display',所以表达式会出错。但是如果它变成(if #f (print 'true) (print 'false)), (#f (print 'true) (print 'false)) 将传递给程序if,它会首先eval #f 并找到条件为假,然后它会eval(打印'false),所以它会打印出“假”
-
我必须澄清一下,我所实现的只是一个解释器,而不是一个编译器
-
@KaoLian sepp2k 试图说明的一点是,您描述的条件评估类型(检查条件,然后执行 either then 或 else 部分)是不是 function 应用程序通常在 Scheme(以及 Lisp 家族中的大多数其他语言)中处理的方式。例如,如果您评估
(foo (print 'true) (print 'false)),则评估两个参数。如果您的解释器以不同方式处理if,那么您并没有真正将其视为函数/过程。这很好,因为您不想评估if、define、lambda等的所有参数。