为什么我可以定义一个新的cond,并且Scheme不会与我对条件cond的新cond混淆?

时间:2017-05-10 13:36:03

标签: scheme evaluator metacircular

我有一项任务,我正在与一个metacircular评估员合作,我定义了一个新的cond

(define cond 3)

以及else

(define (else x) (/ x 2)

我的问题是为什么这(下面)确实有效?

(cond ((= cond 2) 0) 
(else (else 4)))

如何通过条件condelse知道哪个cond是我定义的cond和else

(随意修改标题,因为我不知道如何制定我的问题)

2 个答案:

答案 0 :(得分:1)

在Scheme中没有保留标识符。在许多语言中都有一个保留标识符(关键字)列表,不能用作变量名称。

在Scheme中你可以这样做:

> (let ((cond +))
    (cond 1 2))
3

与大多数语言不同的是,程序是宏扩展的。

运行Scheme计划:

read -> macro expansion -> compilation -> execution

解释宏扩展算法的工作原理并非易事。 我可以推荐章节"语法抽象:语法案例扩展器"作者:R。Kent Dybvig在书中的作品#34; Beautiful Code"。

https://www.cs.indiana.edu/~dyb/pubs/bc-syntax-case.pdf

答案 1 :(得分:1)

这取决于您在metacircular评估员中如何实施cond。通常它会检查一些运算符是否为quotecond等符号,然后执行某些特殊操作。因此,操作员位置中的cond将扩展为cond,而其他情况下的cond将被评估为变量。