为什么我可以定义一个新的 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 如何通过条件 cond
和 else
知道哪个 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"
这取决于您如何在元循环求值器中实现 cond
。通常它会检查一些运算符的符号,如 quote
和 cond
,然后做一些特殊的事情。因此,运算符位置中的 cond
将扩展为 cond
,而其他情况下的 cond
将被评估为变量。
我有这个任务,我正在使用一个 metacircular 求值器,我定义了一个新的 cond
像这样:
(define cond 3)
以及else
:
(define (else x) (/ x 2)
我的问题是为什么这个(下图)真的有效?
(cond ((= cond 2) 0)
(else (else 4)))
Scheme 如何通过条件 cond
和 else
知道哪个 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"这取决于您如何在元循环求值器中实现 cond
。通常它会检查一些运算符的符号,如 quote
和 cond
,然后做一些特殊的事情。因此,运算符位置中的 cond
将扩展为 cond
,而其他情况下的 cond
将被评估为变量。