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

Lor*_*Cat 3 scheme case-sensitive case-insensitive racket

根据我的阅读,Scheme中的符号不​​区分大小写 - 即(eq? 'Hello 'hello)求值为#t(因为两者都由符号表示'hello,而scheme具有两个具有相同名称的符号是同一对象的属性).然而,这似乎并没有这样的情况对我来说,事情似乎是大小写敏感的,我是否尝试使用#lang scheme,#lang racket#lang eopl计划的口味.有没有人有任何想法?

Ale*_*ing 6

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

鉴于你提到#langs,很明显你使用的是Racket.Racket是Scheme的后代,但它不符合任何现有的Scheme标准.然而,球拍是可扩展的,它可以支持很多的语言,甚至是用户定义的人,所以方案的不同迭代由球拍支持.

哪些方案区分大小写?

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

  • R5RS始终不区分大小写.
  • R6RS始终区分大小写.
  • 默认情况下,R7RS区分大小写,但#!fold-case指令或include-ci表单可以禁用区分大小写.

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

您使用的是哪种方案?

他们都不是.也许是令人困惑的,甚至#lang scheme不是任何Scheme标准的实现.事实上,#lang scheme一种被弃用的语言已被完全取代#lang racket(前者在PLT Scheme重命名为Racket之前存在,很大程度上是为了减少对其"Scheme"不是实际Scheme实现的混淆).

所以,您可能会问,如何在Racket中获得实际的Scheme?好吧,Racket确实提供了各种Scheme标准的实现.双方#lang r5rs#lang r6rs有相关方案的标准内置的实现.#lang r7rs通过r7rs包提供R7RS实现.

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