首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方案中标识符和符号之间的区别?

方案中标识符和符号之间的区别?
EN

Stack Overflow用户
提问于 2018-01-23 01:54:55
回答 2查看 1.8K关注 0票数 4

我试图了解如何使用Scheme元循环计算器来处理引用的表达式,而不是符号数据。

接受的答案堆栈溢出问题lisp/方案中的符号究竟是什么?在Scheme中定义了“符号”数据对象:

在Scheme和球拍中,符号就像一个不变的字符串,恰好被嵌入。

公认的答案写道,在Scheme中,标识符和符号之间存在内在的对应关系:

若要调用方法,请查找与方法名称相对应的符号。Lisp/Scheme/Racket使这非常容易,因为语言已经在标识符(语言语法的一部分)和符号(语言中的值)之间建立了内在的对应关系。

为了理解对应关系,我阅读了“关于标识符的说明”页面,介绍了该方案及其实现,内容如下

方案标识符(变量名、特殊形式名和关键字)与Scheme符号对象字符序列有着几乎相同的限制,这不是巧合。大多数Scheme的实现都是用Scheme编写的,在解释器或编译器中使用符号对象来表示变量名。

基于以上所述,我想知道我对下一次会议中发生的事情的理解是否正确:

代码语言:javascript
复制
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 ]=>
  1. 第一个define语句是计算程序捕获的一个特殊形式,它为符号a创建一个绑定到全局环境中的复合过程对象。
  2. 在顶层写入a将使评估器接收符号对象'a,该符号对象的计算结果为'a在全局环境中指向的复合过程对象。
  3. 在顶层写入(quote a)将使计算程序接收符号('quote 'a))的列表;此表达式是由计算程序捕获的特殊形式,它的计算结果为引用的表达式,即符号对象'a
  4. 编写(eval a (the-environment))会使计算程序接收符号列表( ('eval 'a ...) )(忽略环境)。求值器对'eval执行查找,这将生成eval编译过程对象,查找'a,从而生成复合过程。最后,顶级评估器将eval过程应用于其参数,因为复合过程是自我评估的(在Scheme48中不正确),表达式的最终值是复合过程本身。
  5. 写入(eval (quote a) (the-environment))将使计算程序接收符号('eval ('quote 'a) ...)的列表。求值器对'eval执行查找,这将生成eval编译的过程对象。它计算表达式('quote 'a),该表达式生成符号对象'a。最后,顶级评估器将eval过程应用于'a,这是一个符号对象,因此调用了生成复合过程的环境查找。

这个解释是否正确地描述了(在高层) Scheme解释器如何区分语言中的符号对象和标识符?这些描述中是否存在根本性的误解?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-23 02:15:55

R6RS方案报告,在4.2词汇语法中,使用标识符一词来指字符级的语法。也就是说,粗略地说,标识符意味着类似于词法标记的东西,当表达式成为对象时,符号就是从该标记构造的。然而,在文本的其他地方,标识符似乎被自由地用作符号的同义词。例如。“方案允许标识符代表包含值的位置。这些标识符称为变量。”(1.3变量和绑定)。基本上,对于这个术语,规范似乎是松散的。根据上下文,标识符要么与符号(对象)相同,要么是<identifier>:词法语法中的语法类别。

在一个句子中,某个字符可能出现也可能不会出现在标识符中,上下文显然是词法语法,因为符号对象是原子,而不是字符串;它不包含任何内容。但是当我们谈到一个标识符表示一个内存位置(作为一个变量)时,它就是一个符号;我们已经忽略了在文本源代码中什么类型的标记可以产生符号的问题。

在问题中所连结的“计划简介”及其实施指南,是使用与本计划语言不一致的独特的识别符定义。这意味着标识符是“变量名称,特殊形式名称和关键字”(因此,非变量名称的符号不是标识符,规范不支持)。

票数 4
EN

Stack Overflow用户

发布于 2018-01-23 18:59:53

ObPreface:提前道歉告诉你你已经知道的事情了!

你的第一句话就是为我提出重大的XY问题。您可以这样写:“我正试图了解Scheme元循环计算器如何处理引用的表达式,而不是符号数据。”你所说的“计划元循环评估员”是什么意思?另外,你所说的“符号数据”是什么意思?这两个术语都向我暗示你想问一些更高层次的问题。

无论如何,您的标题提出了一个关于标识符和符号之间的区别的问题。不同之处在于:

“标识符”是一个句法范畴。也就是说,假设我们获取一个文本文件并将其分解为令牌。其中一些代币将是左撇子。有些会是正确的父母。有些是数字。其中一些将是标识符。每种语言都有自己的句法分类,但其中许多语言都使用名称“标识符”来表示“通常可以是函数名或变量名或其他什么的类似单词的事物”。

另一方面,“符号”是Scheme和Lisp系统中的一种特殊价值。方案有许多不同的价值:数字,布尔人,字符串,对,符号等。

在Scheme中,在开发解析器/解释器/编译器/任何东西时,使用符号(值)来表示标识符(句法实体)是非常方便的。具体来说,“引号”有一种特殊的能力,可以将某些主机语言标记序列转换为符号、数字、字符串和布尔值的列表。您不需要利用这一点,但它消除了大量代码。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48393025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档