1

我有这个任务,我正在使用元循环评估器,我定义了一个cond这样的新任务:

(define cond 3)

以及else

(define (else x) (/ x 2)

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

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

Scheme 怎么知道cond我定义的 cond 和 my else,而不是条件condand else

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

4

2 回答 2

1

这取决于您cond在元循环评估器中的实施方式。通常它会检查一些运算符中的符号,例如quote然后cond做一些特别的事情。因此cond,在操作员位置将被扩展,condcond在其他情况下将被评估为好像它是一个变量。

于 2017-05-11T17:49:21.317 回答
1

在 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”一章。

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

于 2017-05-11T12:38:27.523 回答