“interned”和“uninterned”符号有什么区别?是否只有拥有无间断符号的球拍或其他计划或口语方言拥有它们?“interned”和“uninterned”符号有什么区别
3
A
回答
7
当且仅当它们具有相同的名称时,实名符号是eq?
。未插入的符号不是eq?
任何其他符号,所以它们是一种具有附加字符串的唯一标记。实时符号是由默认阅读器生成的种类。在宏中生成代码时,无间断符号可以用作标识符,这样的标识符不能被任何其他标识符遮蔽。大多数Lisp方言都有这个概念,在Scheme中很少见,因为卫生宏应该减少它的用处。
2
Common Lisp有未插入的符号。正如Juho的回答所说,一个未中断的符号保证不会与任何其他值相等。
为了正确编写许多宏(特别是其扩展需要引入和绑定新变量的宏),常见Lisp样式需要无限制的符号,因为任何在宏扩展中使用的实际符号可能会在其扩展中捕获或映射绑定现场。
另一方面,Scheme的卫生宏观系统没有这个问题,所以Scheme系统不需要提供无间断的符号。尽管如此,他们中的很多人都这样为什么?几个原因:
- 一些Scheme系统提供Common Lisp风格的
defmacro
功能。 - 在其他情况下,卫生宏观系统的实现可能会在内部使用未被干扰的符号,但可能会暴露未被干扰的符号的概念。
- 在许多使用s表达式来表示语言并将此语言转换为另一种s-expr语言的程序中,无间断符号可能很有用。这些类型的任务通常能够产生一个保证为新的标识符的能力。
2
另外两个很好的答案却没有提到interned值的优点,那就是他们可以在不断的时间进行比较。这通常意味着这些值被表示为指向表的指针而没有重复。在Racket中,就在几个月前[*],其他值 - 例如用作文字的浮点值和字符串 - 也将被实施。除了允许更快的比较外,我相信这可以实现更好的编译时优化,因为这些值可以在不运行代码的情况下相互比较。
是否有其他系统可以执行此类操作?我敢打赌有。
[*]我确定有人会纠正我,如果我错了:)。
相关问题
- 1. nohup和&符号有什么区别
- 2. 零售符号和选中符号有什么区别?
- 3. SIGCLD和SIGCHLD信号有什么区别?
- 4. IND和NAN号码有什么区别
- 5. Ruby中的字符串和符号有什么区别?
- 6. Ruby中的字符串和符号有什么区别?
- 7. NTFS连接点和符号链接有什么区别?
- 8. CSS选择器中管道和帽符号有什么区别?
- 9. 赋值符号=,:=和< - 之间有什么区别?
- 10. LISP中的变量和符号有什么区别?
- 11. Common Lisp中的原子和符号有什么区别?
- 12. 有什么区别`和$(Bash中有什么区别?
- 13. 有符号和无符号二进制之间的区别是什么
- 14. ==和===有什么区别?
- 15. ==和===有什么区别?
- 16. 有什么区别? :和||
- 17. ==和===有什么区别?
- 18. '=='和'==='有什么区别?
- 19. `&`和`ref`有什么区别?
- 20. 有什么区别:。!和:r!?
- 21. | 0和~~有什么区别?
- 22. Appender和〜有什么区别?
- 23. 信号量和临界区域有什么区别?
- 24. 猪的双引号和单引号有什么区别?
- 25. swift中的问号和感叹号有什么区别?
- 26. 什么使反引号和撇号之间有很大区别?
- 27. xtype和别名有什么区别?
- 28. mamp和xamp和端口号有什么区别?
- 29. 有什么区别
- 30. 有什么区别