【问题标题】:Case sensitivity in Scheme symbols方案符号中的大小写敏感性
【发布时间】:2015-11-12 17:21:56
【问题描述】:

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

【问题讨论】:

  • “对我来说似乎不是这种情况”:解释一下。
  • 例如,表达式 (eq? 'Hello 'hello) 的计算结果为 false。或者,在“交互模式”下,如果我在提示符下键入“Hello”,则会打印“Hello”,而应该打印“hello”。

标签: scheme racket case-sensitive case-insensitive


【解决方案1】:

简短/简单的答案:区分大小写的标准因标准而异,并且您使用的特定实现具有区分大小写的标识符。但是这些信息单独来看可能不是很有帮助。那么到底出了什么问题呢?

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

哪些方案区分大小写?

在撰写本文时,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 之前就存在,很大程度上是为了减少人们对其“Scheme”不是实际的 Scheme 实现的混淆) .

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

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

【讨论】:

  • 您可能想提及(read-case-sensitive) 过程。
  • 优秀的概述。请注意,在 Racket 中,#ci 可用于为以下表达式打开不区分大小写。 IE。 #ci(eq? 'Hello 'hello) 计算结果为 #t
【解决方案2】:

当我运行这个程序时:

#lang r5rs

(display (equal? 'abc 'ABC))

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

但是,如果您随后键入

(equal? 'abc 'ABC)

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

【讨论】:

  • 我同意这是一个错误。 repl中可能没有设置区分大小写参数。
  • 是的,对我来说听起来像是一个错误。 Racket 将顶级阅读器与模块阅读器分开处理 #langs 因为top-level is hopeless,所以很容易忽略。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-26
  • 2013-07-23
  • 1970-01-01
  • 2017-02-21
  • 2012-09-02
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多