Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 方案符号中的区分大小写_Scheme_Racket_Case Sensitive_Case Insensitive - Fatal编程技术网

Scheme 方案符号中的区分大小写

Scheme 方案符号中的区分大小写,scheme,racket,case-sensitive,case-insensitive,Scheme,Racket,Case Sensitive,Case Insensitive,根据我所读的内容,Scheme中的符号不区分大小写,即(eq?'Hello'Hello)求值为#t(因为两者都由符号'Hello表示,Scheme具有两个同名符号是同一对象的属性)。然而,我的情况似乎并非如此,无论我尝试使用#lang scheme、#lang racket还是#lang eopl风格的scheme,事情似乎都是区分大小写的。有人知道为什么吗?当我运行此程序时: #lang r5rs (display (equal? 'abc 'ABC)) 结果是#t。所以你对案件不敏感 但

根据我所读的内容,Scheme中的符号不区分大小写,即
(eq?'Hello'Hello)
求值为
#t
(因为两者都由符号
'Hello
表示,Scheme具有两个同名符号是同一对象的属性)。然而,我的情况似乎并非如此,无论我尝试使用
#lang scheme
#lang racket
还是
#lang eopl
风格的scheme,事情似乎都是区分大小写的。有人知道为什么吗?

当我运行此程序时:

#lang r5rs

(display (equal? 'abc 'ABC))
结果是
#t
。所以你对案件不敏感

但是,如果您随后键入

(equal? 'abc 'ABC)

在交互窗口中,您可以看到
#f
。我想我可能会认为这是一个bug,但这可能是一个很难解决的问题。

< P>简短的简单答案:区分大小写的标准不同,而且您使用的特定实现具有区分大小写的标识符。但这些信息单独来看可能没有多大帮助。那么“错”在哪里呢

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

哪些方案区分大小写? 在撰写本文时,存在三个相关版本的方案标准:R5RS、R6RS和R7RS

  • R5RS始终不区分大小写
  • R6RS始终区分大小写
  • 默认情况下,R7RS区分大小写,但是
    #!fold case
    指令或
    include ci
    表单可禁用区分大小写功能
正如你所看到的,这个问题其实并不明确:在过去的三个标准中,它并没有保持一致。事实上,考虑到默认情况下R7RS和R6RS都是区分大小写的,现在说Scheme区分大小写可能更准确。然而,尽管R5RS已经过时很长一段时间了,但它仍然作为“Scheme”存在于许多书籍、口译员和编译器以及其他材料中,因此可能得出“Scheme不区分大小写”的结论

你用的是哪种方案? 没有。也许令人困惑的是,即使是
#lang scheme
也不是任何scheme标准的实现。事实上,
#lang scheme
是一种不受欢迎的语言,已被
#lang racket
完全取代(前者存在于PLT scheme更名为racket之前,在很大程度上是为了减少对其“scheme”不是实际方案实现的混淆)

所以,你们可能会问,你们怎样才能在球拍内部得到实际的方案呢?Racket确实提供了各种方案标准的实现。
#lang r5rs
#lang r6rs
都是相关方案标准的内置实现。R7RS实现可以通过
R7RS
软件包以
#lang R7RS
的形式提供


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

“对我来说似乎不是这样”:解释。例如,表达式
(eq?'Hello'Hello)
的计算结果为false。或者,在“交互模式”中,如果我在提示符处键入“Hello”,则会打印Hello,此时应打印“Hello”。您可能需要提及
(区分大小写)
过程。非常好的概述。请注意,在Racket
#ci
中,可以为以下表达式启用不区分大小写。例如,
#ci(eq?'Hello'Hello)
的计算结果为
#t
。我同意这是一个bug。在repl中可能没有设置区分大小写的参数。是的,听起来像个bug。Racket将顶级读卡器与
#lang
s的模块读卡器分开处理,因为它的。