Scheme符​​号中的区分大小写

时间:2015-11-12 17:21:57

标签: scheme racket case-sensitive case-insensitive

根据我的阅读,Scheme中的符号不​​区分大小写 - 即(eq? 'Hello 'hello)计算为#t(因为两者都由符号'hello表示,而scheme具有两个属性具有相同名称的符号是相同的对象)。但是,对我来说情况似乎并非如此,无论我是否尝试使用#lang scheme#lang racket#lang eopl类型的Scheme,事情似乎都区分大小写。有没有人有任何想法?

2 个答案:

答案 0 :(得分:6)

简短答案:区分大小写从标准到标准不等,您使用的特定实现具有区分大小写的标识符。但是这些信息在隔离方面可能不是很有用。那么什么是“错误的”?

鉴于您提到了#lang,很明显您使用的是Racket。 Racket是Scheme的后代,但它不符合任何现有的Scheme标准。但是,Racket是可扩展的 - 它可以支持许多语言,甚至是用户定义的语言 - 所以Racket支持不同的Scheme 迭代。

哪些方案区分大小写?

撰写本文时,有三个相关版本的方案标准,即R5RS,R6RS和R7RS。

  • 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。我想我可能会认为这是一个错误,但可能很难修复。