2012-02-12 8 views
0

R5RS 6.3.3はなぜ(EQ「のBitBlt(はstring->シンボル "のBitBlt")?)である - > #fを

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

が、これは

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

ヘラジカは#を返すことを意味していますと言いますt!

R5RSも

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

を言います(おそらくこれは「ミシシッピを意味する)

シンボル - >文字列は、標準的なケースでは、文字列を返すことを意味
(symbol->string 'Martin) ==> "martin" 

(この例では小文字)。

だから私は私の第二の例を展開する場合

(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

実際のセッションの例:あなたは「実装の標準ケースが下部ケースであることを[s]と仮定引用

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 

答えて

1

example "つまり、式'bitBltは実際にはシンボルbitbltに展開されます。シンボルは実際には大文字小文字を区別しません。 readは大文字小文字を正規化することがあります。

string->symbolの意味はreadのそれとは異なり、手順が混在する場合のシンボルを返すことがあります。

この手順では、非標準の場合には、特殊文字や文字を含む名前のシンボルを作成することができますが、そのようなシンボルを作成するのは悪い考えです。なぜなら、Schemeの実装によっては、それ自体では読み取ることができないからです。

実装では、string->symbolも同様に正規化されているようです。

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

の出力を確認してください。

(これまでの回答は間違っていました)

+0

質問のセッション出力を追加しました。ありがとう。私はそれが事件の問題であるとは確信していない。ケースの問題だったならば、確かに式3または4が真であったはずですか? R4RStest.scmにあるので、私はもっと深い疑いを持っていますが、私は何が見えません。同様の(推測)文字列 - >シンボルは、固有のシンボルを生成し、既存のシンボルの記憶を再利用してはならない。私が心配しているのは「エルク」ではありません。間違っている可能性があります。私はR5RSを理解しようとしており、このR4RStest.scmファイルも想定しています。このような奇妙なことは私のようなダミーを切り詰めて、何がうまくいかないのか決して分からないように思えます。 – philcolbourn

+0

@philcolbourn: 'read'は大文字小文字を区別しますが、' string-> symbol'は大文字小文字を区別しません。 '(string-> symbol(symbol-> string 'bitBlt))'の結果は、初期入力が正規化されているので 'bitblt'として出力されます。 –

+0

これは私の最初の考えでしたが、なぜそれが(eq? 'bitblt(string-> symbol "bitBlt"))==> #fですか? (セッション出力からの4番目の結果)、なぜ(eq? 'mISSISSIppi' mississippi)==> #t? (第7の結果) – philcolbourn

関連する問題