0

R5RS6.3.3によると

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

これはそれを意味しますか

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

elkは#tを返します!

R5RSも言います

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

(おそらくこれは'mISSISSIppiを意味します)

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

これは、symbol-> stringが標準の場合(この例では小文字)で文字列を返すことを意味します。

したがって、2番目の例を拡張すると

(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

右?しかし、R5Rは#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

あなたが引用するは、「実装の標準大文字小文字が小文字であると仮定します」。これは、式'bitBltが実際にシンボルに展開されることを意味しますbitblt。記号は実際には大文字と小文字を区別しません。readケースを正常化する可能性があります。

string->symbolのセマンティクスはのセマンティクスとは異なりread、プロシージャは大文字と小文字が混在する記号を返す場合があります。

この手順では、非標準の場合に特殊文字または文字を含む名前の記号を作成できますが、Schemeの一部の実装ではそれ自体として読み取ることができないため、通常、このような記号を作成することはお勧めできません。

あなたの実装では、string->symbolケースも正規化するようです。の出力を確認してください

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

念のため。

(私の前の答えは間違っていました。)

于 2012-02-12T13:09:45.097 に答える