根据我的阅读,Scheme中的符号不区分大小写 - 即(eq? 'Hello 'hello)
计算为#t
(因为两者都由符号'hello
表示,而scheme具有两个属性具有相同名称的符号是相同的对象)。但是,对我来说情况似乎并非如此,无论我是否尝试使用#lang scheme
,#lang racket
或#lang eopl
类型的Scheme,事情似乎都区分大小写。有没有人有任何想法?
答案 0 :(得分:6)
简短答案:区分大小写从标准到标准不等,您使用的特定实现具有区分大小写的标识符。但是这些信息在隔离方面可能不是很有用。那么什么是“错误的”?
鉴于您提到了#lang
,很明显您使用的是Racket。 Racket是Scheme的后代,但它不符合任何现有的Scheme标准。但是,Racket是可扩展的 - 它可以支持许多语言,甚至是用户定义的语言 - 所以Racket支持不同的Scheme 迭代。
撰写本文时,有三个相关版本的方案标准,即R5RS,R6RS和R7RS。
#!fold-case
指令或include-ci
表单可以禁用区分大小写。正如你所看到的,这个问题确实不明确:它在过去的三个标准中并没有保持一致。事实上,鉴于R7RS和R6RS默认情况下都是区分大小写的,因此现在可能更准确地说Scheme是区分大小写的。然而,虽然R5RS已经过时了很长时间,但它仍然继续存在于许多书籍,口译员和编制者以及其他材料中使用的“方案”,因此可能得出结论“方案不区分大小写。”
他们都不是。也许令人困惑的是,即使#lang scheme
也不是任何Scheme标准的实现。实际上,#lang scheme
是一种被弃用的语言,已被#lang racket
完全取代(前者在PLT Scheme重命名为Racket之前存在,很大程度上是为了减少对其“方案”不一致的混淆实际的方案实施)。
所以,您可能会问,如何在Racket中获得实际的Scheme?好吧,Racket确实提供了各种Scheme标准的实现。 #lang r5rs
和#lang r6rs
都是相关Scheme标准的内置实现。通过#lang r7rs
包,r7rs
可以使用R7RS实施。
所有Racket的语言都可以互操作,因此您选择的语言取决于您,尽管RnRS语言在Racket社区中往往未被使用(#lang racket
更多有用编写程序而不是任何Scheme实现),但是如果你想编写在不同的Scheme实现上运行的程序,它们会很有用。
答案 1 :(得分:3)
当我运行此程序时:
#lang r5rs
(display (equal? 'abc 'ABC))
结果是#t
。所以你在这里得到了不区分大小写。
但是,如果您再键入
(equal? 'abc 'ABC)
在互动窗口中,您获得#f
。我想我可能会认为这是一个错误,但可能很难修复。