0

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"

(大概这意味着'mISSISSIPi)

(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
4

1 回答 1

1

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

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

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

在您的实现中,string->symbol似乎也使大小写正常化。检查输出

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

为了确定。

(我之前的回答是错误的。)

于 2012-02-12T13:09:45.097 回答