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

Why can i define a new cond, and Scheme will not get confused with my new cond over the conditional cond?

我有这个任务,我正在使用一个 metacircular 求值器,我定义了一个新的 cond 像这样:

(define cond 3)

以及else:

(define (else x) (/ x 2)

我的问题是为什么这个(下图)真的有效?

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

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

(请随意编辑标题,因为我不确定如何表述我的问题)

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

在 Scheme 中你可以这样做:

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

Scheme 与大多数语言的区别在于程序是宏扩展的。

运行一个Scheme程序:

read -> macro expansion -> compilation -> execution

解释宏扩展算法的工作原理并非易事。 我可以推荐 "Beautiful Code".

一书中 R. Kent Dybvig 的章节 "Syntactic Abstraction: The syntax-case expander"

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

这取决于您如何在元循环求值器中实现 cond。通常它会检查一些运算符的符号,如 quotecond,然后做一些特殊的事情。因此,运算符位置中的 cond 将扩展为 cond,而其他情况下的 cond 将被评估为变量。