Scheme “和”的区别是什么;实习;及;“不感兴趣的”;符号

Scheme “和”的区别是什么;实习;及;“不感兴趣的”;符号,scheme,racket,Scheme,Racket,“实习”和“非实习”符号之间的区别是什么。是不是只有Racket有不可理解的符号,还是scheme或lisp的其他方言有它们?内部符号是eq?当且仅当它们有相同的名称时。非预期符号不是任何其他符号的eq?,因此它们是一种带有附加字符串的唯一标记。插入符号是由默认读取器生成的类型。在宏中生成代码时,可以将不需要的符号用作标识符,这样的标识符不能被任何其他标识符遮挡。大多数Lisp方言都有这样的概念,在Scheme中更为罕见,因为卫生宏被认为会降低它的有用性。常见的Lisp有一些不需要的符号。正如J

“实习”和“非实习”符号之间的区别是什么。是不是只有Racket有不可理解的符号,还是scheme或lisp的其他方言有它们?

内部符号是
eq?
当且仅当它们有相同的名称时。非预期符号不是任何其他符号的
eq?
,因此它们是一种带有附加字符串的唯一标记。插入符号是由默认读取器生成的类型。在宏中生成代码时,可以将不需要的符号用作标识符,这样的标识符不能被任何其他标识符遮挡。大多数Lisp方言都有这样的概念,在Scheme中更为罕见,因为卫生宏被认为会降低它的有用性。

常见的Lisp有一些不需要的符号。正如Juho的回答所说,一个非预期符号保证不等于任何其他值

公共Lisp样式需要不需要的符号才能正确编写许多宏(特别是宏的扩展需要引入和绑定新变量),因为在宏扩展中使用的任何插入符号都可能在其扩展站点中捕获或隐藏绑定

另一方面,Scheme的宏系统不存在这个问题,因此Scheme系统不需要提供不需要的符号。尽管如此,他们中的许多人还是这样做了。为什么?有几个原因:

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

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

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

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