“interned”和“uninterned”符号之间有什么区别

时间:2012-01-13 18:47:58

标签: scheme racket

“interned”和“uninterned”符号之间有什么区别。只有Racket有没有未加工的符号或做其他方案的方案或者lisp有吗?

3 个答案:

答案 0 :(得分:7)

当且仅当它们具有相同名称时,实际符号为eq?。未处理的符号与任何其他符号不是eq?,因此它们是一种带有附加字符串的唯一标记。 Interned符号是默认阅读器生成的类型。当在宏中生成代码时,未加密的符号可以用作标识符,这样的标识符不能被任何其他标识符遮蔽。大多数Lisp方言都有这个概念,在Scheme中它很少见,因为卫生宏被认为会降低它的用途。

答案 1 :(得分:2)

Common Lisp有无符号的符号。正如Juho的回答所说,保证符号不会与任何其他值相等。

Common Lisp-style需要未加密的符号才能正确编写许多宏(特别是扩展需要引入和绑定新变量的宏),因为在宏扩展中使用的任何实例符号可能会捕获或隐藏其扩展站点中的绑定

另一方面,Scheme的卫生宏系统没有这个问题,因此Scheme系统不需要提供不间断的符号。他们中的许多人仍然这样做。为什么?有几个原因:

  • 某些Scheme系统提供Common Lisp风格的defmacro功能。
  • 在其他情况下,卫生宏系统的实现可能会在内部使用未加工的符号,但可能会暴露未加工符号的概念。
  • 未使用的符号在许多使用s表达式表示语言的程序中很有用,并将此语言转换为另一种s-expr语言。这些类型的任务通常可以从生成保证为新的标识符的能力中受益。

答案 2 :(得分:2)

然而,其他两个优秀的答案一般都没有提到实习价值的优点,即它们可以在不变的时间内进行比较。这通常意味着这些值表示为没有重复的表的指针。在Racket中,截至几个月前[*],其他值 - 浮点值和用作文字的字符串 - 也将被实现。除了允许更快的比较之外,我相信这可以实现更好的编译时优化,因为可以在不运行代码的情况下比较这些值的相等性。

还有其他系统可以做这样的事吗?我敢打赌。

[*]如果我错了,我相信有人会纠正我。)。