Scheme 在racket中定义报价流程?

Scheme 在racket中定义报价流程?,scheme,racket,Scheme,Racket,我有几句台词是在drracket上运行的, 我无法理解输出 > (define 'a 5) > 'b . . ..\..\Program Files\Racket\share\pkgs\drracket\drracket\private\rep.rkt:1088:24: b: undefined; cannot reference an identifier before its definition > '0 5 报价重新定义了吗? 为什么“b”不起作用而“0”是5?首先

我有几句台词是在drracket上运行的, 我无法理解输出

> (define 'a 5)
> 'b
. . ..\..\Program Files\Racket\share\pkgs\drracket\drracket\private\rep.rkt:1088:24: b: undefined;
 cannot reference an identifier before its definition
> '0
5
报价重新定义了吗?
为什么“b”不起作用而“0”是5?

首先,符号是原子值。不能将它们视为变量

无论如何,您的第一行扩展为:

(define (quote a) 5)
这是定义球拍功能的简写。是的,您正在重新定义
quote

当您尝试运行
'b
时,您运行的是
(引号b)
,其中它希望变量
b
具有一些值,而变量
没有。这就是为什么您会收到错误,
无法在标识符定义之前引用它

当您尝试运行
'0
时,您正在运行
(引用0)
。0是有效值,它将成为新函数中
a
的值。因此,函数的计算结果为正常值,并返回5

换句话说,不仅0是一个有效参数

> (define 'a 5)
> (define b 12345)
> 'b
5
> '0
5
> '123454321
5


看看这本书。符号不包含值;它们是价值观。您将希望改用变量(
(定义一个5)

ಠ_ಠ 引用参数“a”的有效值时,如何知道引号所期望的类型?当我定义符号a时,我创建了一个lambda,返回值5或将要引用的值添加到全局环境中?您将
quote
重新定义为一个lambda,它接受一个参数并返回5。所以,假设您使用的是非类型的球拍,任何值都可以。当我说“valid value”时,我的意思是你不能,例如,用一个未定义的变量调用函数。这就是您试图运行
'b
时发生的情况。这种“混乱”来自这样一个事实,即
'
只是一个读卡器宏,而实现只看到
(引号b)
。与其他语言不同,您可以重新定义关键字,如
quote
,这基本上使语法
在会话的其余部分不可用。要定义一个变量
a
,您需要
(定义一个5)
和预期的
a;=>5