我有这个任务,我正在使用元循环评估器,我定义了一个cond
这样的新任务:
(define cond 3)
以及else
:
(define (else x) (/ x 2)
我的问题是为什么这(下)实际上有效?
(cond ((= cond 2) 0)
(else (else 4)))
Scheme 怎么知道cond
我定义的 cond 和 my else
,而不是条件cond
and else
?
(请随意编辑标题,因为我不确定如何提出我的问题)
我有这个任务,我正在使用元循环评估器,我定义了一个cond
这样的新任务:
(define cond 3)
以及else
:
(define (else x) (/ x 2)
我的问题是为什么这(下)实际上有效?
(cond ((= cond 2) 0)
(else (else 4)))
Scheme 怎么知道cond
我定义的 cond 和 my else
,而不是条件cond
and else
?
(请随意编辑标题,因为我不确定如何提出我的问题)
这取决于您cond
在元循环评估器中的实施方式。通常它会检查一些运算符中的符号,例如quote
然后cond
做一些特别的事情。因此cond
,在操作员位置将被扩展,cond
而cond
在其他情况下将被评估为好像它是一个变量。
在 Scheme 中没有保留标识符。在许多语言中,都有一个不能用作变量名称的保留标识符(关键字)列表。
例如,在 Scheme 中,您可以这样做:
> (let ((cond +))
(cond 1 2))
3
Scheme与大多数语言的不同之处在于程序是宏扩展的。
运行一个 Scheme 程序:
read -> macro expansion -> compilation -> execution
解释宏扩展算法的工作原理并非易事。我可以推荐 R. Kent Dybvig 在“Beautiful Code”一书中的“Syntactic Abstraction: The syntax-case expander”一章。