我试图理解Scheme元循环评估器如何处理引用的表达式而不是符号数据。
接受的答案Stack Overflow问题What exactly is a symbol in lisp/scheme?定义了"符号" Scheme中的数据对象:
在Scheme和Racket中,符号就像一个碰巧被实习的不可变字符串
接受的答案写道,在Scheme中,标识符和符号之间存在内置的对应关系:
要调用方法,请查找与方法名称对应的符号。 Lisp / Scheme / Racket使这非常简单,因为语言已经在标识符(语言的语法的一部分)和符号(语言中的值)之间建立了内在的对应关系。
为了理解相应性,我在方案简介及其实施中阅读了"A Note on Identifiers"页面,其中说明了
方案标识符(变量名和特殊形式名称和关键字)与Scheme符号对象字符序列具有几乎相同的限制,并非巧合。 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 ]=>
第一个define
语句是评估者捕获的一种特殊形式,它为符号a
创建一个绑定到全局环境中的复合过程对象。
在顶层编写a
会导致求值程序接收符号对象 'a
,该对象将计算{{1}的复合过程对象}指向全球环境。
在顶层写'a
会导致评估者收到符号列表 (quote a)
;此表达式是由求值程序捕获的特殊形式,它计算引用的表达式,即符号对象('quote 'a))
。
编写'a
会使评估者收到符号列表(eval a (the-environment))
(忽略环境)。求值程序执行('eval 'a ...)
的查找,它会生成eval编译过程对象,查找'eval
,从而生成复合过程。最后,顶级计算器将eval过程应用于其参数,因为复合过程是自我评估的(在Scheme48中不是真的),表达式的最终值是复合过程本身。
编写'a
会使评估者收到符号列表(eval (quote a) (the-environment))
。求值程序对('eval ('quote 'a) ...)
执行查找,从而生成eval编译过程对象。它计算表达式'eval
,它产生符号对象('quote 'a)
。最后,顶级评估程序将eval过程应用于'a
,这是一个符号对象,因此调用环境查找来生成复合过程。
这种解释是否正确地描述了(在较高层次上)Scheme解释器如何区分符号对象和语言中的标识符?这些描述中存在根本的误解吗?
答案 0 :(得分:3)
4.2词法语法中的R6RS方案报告使用术语标识符来引用字符级语法。也就是说,粗略地,标识符意味着类似于词法标记,当表达式成为对象时,符号从该标记中构造。但是,在文本的其他地方, identifier 似乎可以自由地用作 symbol 的同义词。例如。 “Scheme允许标识符代表包含值的位置。这些标识符称为变量。”(1.3变量和绑定)。基本上,关于这个术语,规范似乎是松散的。根据上下文,标识符与符号(对象)相同,或者<identifier>
:词法语法中的语法类别。
在一个句子中,某个字符可能会或可能不会出现在标识符中,上下文显然是词法语法,因为符号对象是原子而不是字符串;它不包含任何东西。但是当我们谈论表示内存位置(作为变量)的标识符时,那就是符号;我们已经过了一个问题,即什么类型的令牌可以在文本源代码中产生符号。
该问题中链接的方案简介及其实现教程使用了自己独特的 identifier 定义,这与Scheme语言不一致。它意味着标识符是“变量名称,特殊表单名称和关键字”(因此,非变量名称的符号不是标识符,规范不支持)。
答案 1 :(得分:2)
ObPreface:提前道歉,告诉你已经知道的事情!
你的第一句话就是为我提出了大问题。你写的“我试图理解Scheme元循环评估器如何处理引用的表达式而不是符号数据。” “计划元循环评估员”是什么意思?另外,“符号数据”是什么意思?这两个术语都告诉我你想提出一些更高层次的问题。
无论如何,您的标题提出了有关标识符和符号之间差异的问题。区别在于:
“标识符”是一种语法类别。也就是说,假设我们采用文本文件并将其分解为令牌。其中一些令牌将是左翼。有些人会是正确的。有些人会是数字。有些将是标识符。每种语言都有自己的一组语法类别,但是其中许多语言使用名称“identifier”作为“类似于字的东西,通常可以是函数名称或变量名称等等。”
另一方面,“符号”是Scheme和Lisp系统中的一种特殊值。 Scheme有许多不同的值:数字,布尔,字符串,对,符号等。在Scheme中,在开发解析器/解释器/编译器等时,使用符号(值)来表示标识符(语法实体)非常方便。具体而言,“quote”具有将某些主语言标记序列转换为符号,数字,字符串和布尔值列表的特殊能力。您不需要利用这一点,但它消除了大量代码。