2012-01-13 120 views

回答

7

当且仅当它们具有相同的名称时,实名符号是eq?。未插入的符号不是eq?任何其他符号,所以它们是一种具有附加字符串的唯一标记。实时符号是由默认阅读器生成的种类。在宏中生成代码时,无间断符号可以用作标识符,这样的标识符不能被任何其他标识符遮蔽。大多数Lisp方言都有这个概念,在Scheme中很少见,因为卫生宏应该减少它的用处。

2

Common Lisp有未插入的符号。正如Juho的回答所说,一个未中断的符号保证不会与任何其他值相等。

为了正确编写许多宏(特别是其扩展需要引入和绑定新变量的宏),常见Lisp样式需要无限制的符号,因为任何在宏扩展中使用的实际符号可能会在其扩展中捕获或映射绑定现场。

另一方面,Scheme的卫生宏观系统没有这个问题,所以Scheme系统不需要提供无间断的符号。尽管如此,他们中的很多人都这样为什么?几个原因:

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

另外两个很好的答案却没有提到interned值的优点,那就是他们可以在不断的时间进行比较。这通常意味着这些值被表示为指向表的指针而没有重复。在Racket中,就在几个月前[*],其他值 - 例如用作文字的浮点值和字符串 - 也将被实施。除了允许更快的比较外,我相信这可以实现更好的编译时优化,因为这些值可以在不运行代码的情况下相互比较。

是否有其他系统可以执行此类操作?我敢打赌有。

[*]我确定有人会纠正我,如果我错了:)。