jII*_*jII 5 lisp scheme symbols identifier mit-scheme
我试图了解Scheme元循环求值器如何以不同于符号数据的方式处理引用表达式。
接受的答案 Stack Overflow 问题lisp/scheme 中的符号到底是什么?在Scheme中定义了“symbol”数据对象:
在Scheme和Racket中,符号就像一个不可变的字符串,恰好被保留
接受的答案写道,在Scheme中,标识符和符号之间存在内置的对应关系:
要调用方法,您可以查找与方法名称相对应的符号。Lisp/Scheme/Racket 使这变得非常容易,因为该语言已经在标识符(语言语法的一部分)和符号(语言中的值)之间建立了内置的对应关系。
为了理解对应关系,我阅读了“方案及其实现简介”中的“关于标识符的注释”页面,其中说
方案标识符(变量名称和特殊形式名称和关键字)与方案符号对象字符序列具有几乎相同的限制,这并非巧合。大多数Scheme的实现都是用Scheme编写的,并且在解释器或编译器中使用符号对象来表示变量名。
基于上述内容,我想知道我对以下会话中发生的事情的理解是否正确:
user@host:/home/user $ scheme
MIT/GNU Scheme running under GNU/Linux
Type `^C' (control-C) followed by `H' to obtain information about interrupts.
Copyright (C) 2011 Massachusetts Institute of Technology
This is free software; see the source for copying conditions. There is NO warranty; not even for
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Image saved on Sunday February 7, 2016 at 10:35:34 AM
Release 9.1.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/x86-64 4.118 || Edwin 3.116
1 ]=> (define a (lambda (i) (+ i 1)))
;Value: a
1 ]=> a
;Value 13: #[compound-procedure 13 a]
1 ]=> (quote a)
;Value: a
1 ]=> (eval a (the-environment))
;Value 13: #[compound-procedure 13 a]
1 ]=> (eval (quote a) (the-environment))
;Value 13: #[compound-procedure 13 a]
1 ]=>
Run Code Online (Sandbox Code Playgroud)
第一个define语句是求值器捕获的特殊形式,它为符号创建a到全局环境中的复合过程对象的绑定。
a在顶层写入会导致求值器接收符号对象 ,该符号对象求值为指向全局环境中的'a复合过程对象。'a
(quote a)在顶层写入会使评估器接收符号列表 ('quote 'a));该表达式是求值器捕获的特殊形式,其求值结果为引用的表达式,即符号对象'a。
写入(eval a (the-environment))使求值器接收符号列表('eval 'a ...)(忽略环境)。求值器执行 的查找'eval,生成 eval 编译过程对象,查找'a,生成复合过程。最后,顶级求值器将 eval 过程应用于其参数,因为复合过程是自求值的(在Scheme48中不是这样),所以表达式的最终值是复合过程本身。
写入(eval (quote a) (the-environment))使求值器接收符号列表('eval ('quote 'a) ...)。求值器执行查找'eval,生成 eval 编译过程对象。('quote 'a)它计算产生符号对象的表达式'a。最后,顶级求值器将 eval 过程应用于'a,它是一个符号对象,因此调用生成复合过程的环境查找。
这个解释是否正确地(在高层次上)描述了Scheme解释器如何区分语言中的符号对象和标识符?这些描述是否存在根本性的误解?
R6RS 方案报告在 4.2 词法语法中使用术语identifer来指代字符级语法。也就是说,粗略地说,标识符意味着类似于词汇标记的东西,当表达式成为对象时,可以从该词汇标记构造符号。然而,在文本的其他地方,标识符似乎可以自由地用作符号的同义词。例如,“方案允许标识符代表包含值的位置。这些标识符称为变量。” (1.3 变量和绑定)。基本上,规范对于这个术语似乎很宽松。根据上下文,标识符要么与符号(对象)相同,要么<identifier>是词法语法中的语法类别。
在一个句子中,比如某个字符可能出现或不出现在标识符中,上下文显然是词汇语法,因为符号对象是一个原子而不是字符串;它不包含任何东西。但是,当我们谈论表示内存位置(作为变量)的标识符时,这就是符号;我们已经解决了哪种标记可以在文本源代码中生成符号的问题。
问题中链接的方案及其实现简介教程使用其自己独特的标识符定义,这与方案语言不一致。它意味着标识符是“变量名称、特殊形式名称和关键字”(因此不是变量名称的符号不是标识符,规范不支持这一点)。