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 实现上的程序,它们会很有用。
根据我的阅读,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 实现上的程序,它们会很有用。