Scheme 符号区分大小写

Case sensitivity in Scheme symbols

根据我的阅读,Scheme 中的符号不​​区分大小写 - 即 (eq? 'Hello 'hello) 计算为 #t(因为两者都由符号 'hello 表示,并且 scheme 具有 属性 即两个同名的符号是同一个对象)。然而,这对我来说似乎不是这种情况,而且事情似乎是区分大小写的,无论我尝试使用 #lang scheme#lang racket 还是 #lang eopl 风格的 Scheme。有人知道为什么吗?

当我运行这个程序时:

#lang r5rs

(display (equal? 'abc 'ABC))

结果是#t。所以你在这里变得不区分大小写。

但是,如果您随后键入

(equal? 'abc 'ABC)

在互动 window 中,您得到 #f。我想我可能会认为这是一个错误,但它可能很难修复。

short/simple 答案:区分大小写因标准而异,您使用的特定实现具有区分大小写的标识符。但是这些信息单独使用可能不是很有帮助。那么 "wrong" 发生了什么?

鉴于您提到了 #lang,很明显您使用的是 Racket。 Racket 是 Scheme 的后代,但它不符合 any 现有的 Scheme 标准。然而,Racket 是可扩展的——它可以支持多种语言,甚至是用户定义的语言——因此 Racket 支持 Scheme 的不同迭代。

哪些方案区分大小写?

在撰写本文时存在三个相关版本的 Scheme 标准,R5RS、R6RS 和 R7RS。

  • R5RS 始终不区分大小写。
  • R6RS 始终区分大小写。
  • R7RS 默认区分大小写,但 #!fold-case 指令或 include-ci 形式可以禁用区分大小写。

正如你所看到的,这个问题确实不是很明确:它在过去的三个标准中并没有保持一致。事实上,鉴于 R7RS 和 R6RS 默认情况下都区分大小写,现在说 Scheme 区分大小写可能更准确。然而,虽然 R5RS 已经过时了很长时间,但它继续存在,因为 "The Scheme" 在许多书籍、解释器和编译器以及其他材料中使用,因此可能的结论是 "Scheme is case-insensitive."

您使用的是哪种方案?

None 个。也许令人困惑的是,甚至 #lang scheme 也不是任何 Scheme 标准的实现。事实上,#lang scheme 是一种已弃用的语言,已被 #lang racket 完全取代(前者在 PLT Scheme 重命名为 Racket 之前就已存在,部分原因是为了减少对其 "Scheme" 的混淆,而不是是一个实际的 Scheme 实现)。

所以,你可能会问,如何才能在 Racket 中获取实际的 Scheme 呢?好吧,Racket 确实提供了各种 Scheme 标准的实现。 #lang r5rs#lang r6rs 都是相关 Scheme 标准的内置实现。 R7RS 实现可通过 r7rs 包作为 #lang r7rs 使用。

Racket 的所有语言都可以互操作,因此您选择的语言取决于您,尽管 RnRS 语言在 Racket 社区中往往未被使用(#lang racket 有用 用于编写程序而不是任何 Scheme 实现),但是如果你想编写 运行 在不同 Scheme 实现上的程序,它们会很有用。