【问题标题】:Why is (eq? 'bitBlt (string->symbol "bitBlt")) -> #f为什么是 (eq?'bitBlt (string->symbol "bitBlt")) -> #f
【发布时间】:2023-03-09 01:07:01
【问题描述】:

R5RS 6.3.3 说

(eq? 'bitBlt (string->symbol "bitBlt")) ==>  #f

这是否意味着

(eq? 'bitBlt (string->symbol (symbol->string 'bitBlt))) ==> #f?

麋鹿返回#t!

R5RS 也说

(string->symbol "mISSISSIppi") ==> the symbol with name "mISSISSIppi"

(大概这意味着'mISSISSIPpi)

(symbol->string 'Martin) ==> "martin"

表示 symbol->string 返回标准大小写的字符串(本例中为小写)。

所以如果我扩展我的第二个例子

(symbol->string 'bitBlt) ==> "bitblt"
(string->symbol (symbol->string 'bitBlt)) ==> 'bitblt

因此

(eq? 'bitBlt (string->symbol (symbol->string 'bitBlt))) ==> #t

因为 R5RS 中的符号不​​区分大小写

(eq? 'mISSISSIppi 'mississippi) ==> #t

所以如果我扩展我原来的问题

(string->symbol "bitBlt") ==> 'bitblt

因此

(eq? 'bitBlt (string->symbol "bitBlt")) ==>  #t

对吗?但是 R5Rs 说#f!

我哪里错了?

为什么要指定这种行为?

参考:

http://people.csail.mit.edu/jaffer/r5rs_8.html#SEC49

http://bugs.call-cc.org/browser/numbers/r4rstest.scm?rev=1 第 468 行

实际会话示例:

3> (display 'bitBlt)
bitblt
3> (display (string->symbol "bitBlt"))
bitBlt
3> (eq? 'bitBlt (string->symbol "bitBlt"))
#f
3> (eq? 'bitblt (string->symbol "bitBlt"))
#f
3> (eq? 'bitblt (string->symbol "bitblt"))
#t
3> (eq? 'bitBlt (string->symbol (symbol->string 'bitBlt)))
#t
3> (eq? 'mISSISSIppi 'mississippi)
#t

【问题讨论】:

    标签: string scheme symbols r5rs


    【解决方案1】:

    您引用的example“假设[s] 实现的标准大小写是小写”。这意味着表达式'bitBlt 实际上扩展为符号bitblt。符号实际上不区分大小写。 read 可以规范化大小写。

    string->symbol 的语义与read 的语义不同,并且该过程可能会返回一个大小写混合的符号:

    此过程可以创建名称包含特殊字符或非标准大小写字母的符号,但创建此类符号通常不是一个好主意,因为在某些 Scheme 实现中它们不能被读取为本身。

    在您的实现中,string->symbol 似乎也可以规范大小写。检查输出

    (display 'bitBlt)
    (display (string->symbol "bitBlt"))
    

    确定。

    (我之前的回答错了。)

    【讨论】:

    • 我将会话输出添加到问题中。谢谢。我不确定这是一个案例问题。如果这是一个案例问题,那么表达式 3 或 4 肯定应该是正确的吗?因为它在 R4RStest.scm 我怀疑更深层次的东西,但我看不出是什么。 Like (guessing) string->symbol 必须产生一个唯一的符号,而不是重复使用现有符号的存储。我关心的不是“麋鹿”——它可能是错的——我试图理解 R5RS,我想也理解这个 R4RStest.scm 文件。在我看来,这种怪异现象会难倒像我这样可能永远无法弄清楚问题所在的傻瓜。
    • @philcolbourn:很明显,你的 read 规范化大小写,而 string->symbol 没有。 (string->symbol (symbol->string 'bitBlt)) 的结果应打印为 bitblt,因为初始输入已标准化。
    • 这是我的第一个想法,但为什么是 (eq?'bitblt (string->symbol "bitBlt")) ==> #f? (来自会话输出的第 4 个结果)以及为什么它在 (eq?'mISSISSIPi 'mississippi) ==> #t 时关心符号大小写? (第 7 个结果)
    • @philcolbourn:在(eq? 'bitblt (string->symbol "bitBlt")) 中,第二个符号未标准化,因为它来自string->symbol。在(eq? 'mISSISSIppi 'mississippi) 中,这两个符号都是大小写规范化的,因为它们来自read(隐式)。
    • 好的。我懂了!你的坚持令人钦佩。谢谢!
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 2014-02-27
    • 2013-05-31
    • 2018-06-12
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多