我有一项任务,我正在与一个metacircular评估员合作,我定义了一个新的cond
:
(define cond 3)
以及else
:
(define (else x) (/ x 2)
我的问题是为什么这(下面)确实有效?
(cond ((= cond 2) 0)
(else (else 4)))
如何通过条件cond
和else
知道哪个cond
是我定义的cond和else
?
(随意修改标题,因为我不知道如何制定我的问题)
答案 0 :(得分:1)
在Scheme中没有保留标识符。在许多语言中都有一个保留标识符(关键字)列表,不能用作变量名称。
在Scheme中你可以这样做:
> (let ((cond +))
(cond 1 2))
3
与大多数语言不同的是,程序是宏扩展的。
运行Scheme计划:
read -> macro expansion -> compilation -> execution
解释宏扩展算法的工作原理并非易事。 我可以推荐章节"语法抽象:语法案例扩展器"作者:R。Kent Dybvig在书中的作品#34; Beautiful Code"。
答案 1 :(得分:1)
这取决于您在metacircular评估员中如何实施cond
。通常它会检查一些运算符是否为quote
和cond
等符号,然后执行某些特殊操作。因此,操作员位置中的cond
将扩展为cond
,而其他情况下的cond
将被评估为变量。