Почему (eq?'bitBlt (строка-›символ bitBlt)) -> #f

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"

(предположительно, это означает «мИССИСИппи»)

а также

(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

person philcolbourn    schedule 12.02.2012    source источник


Ответы (1)


пример, который вы цитируете, "предположим[s ] что стандартный регистр реализации — нижний регистр». Это означает, что выражение 'bitBlt на самом деле расширяется до символа bitblt. Символы на самом деле не чувствительны к регистру; read может нормализовать регистр.

Семантика string->symbol отличается от семантики read, и процедура может возвращать символ смешанного регистра:

Эта процедура может создавать символы с именами, содержащими специальные символы или буквы в нестандартном регистре, но обычно создание таких символов является плохой идеей, поскольку в некоторых реализациях Scheme они не могут быть прочитаны сами по себе.

В вашей реализации string->symbol, похоже, также нормализует регистр. Проверьте вывод

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

быть уверенным.

(Мой предыдущий ответ был неправильным.)

person Fred Foo    schedule 12.02.2012
comment
Я добавил вывод сеанса в вопрос. Спасибо. Я не уверен, что это дело случая. Если бы это был случай, то, конечно, выражение 3 или 4 должно было быть верным? Так как он есть в R4RStest.scm подозреваю что-то более глубокое, но не вижу что. Аналогично (угадывание) строка-›символ должна создавать уникальный символ, а не повторно использовать хранилище существующего символа. Меня волнует не "лось" - это может быть неправильно - я пытаюсь понять R5RS и, как я полагаю, этот файл R4RStest.scm. Мне кажется, что такого рода странности поставили бы в тупик таких тупиц, как я, которые никогда не поймут, что происходит не так. - person philcolbourn; 12.02.2012
comment
@philcolbourn: это довольно очевидно, ваш read нормализует регистр, а string->symbol нет. Результат (string->symbol (symbol->string 'bitBlt)) должен быть напечатан как bitblt, так как исходный ввод нормализован к этому. - person Fred Foo; 12.02.2012
comment
Это была моя первая мысль, но почему тогда (eq? 'bitblt (string-›symbol bitBlt)) ==> #f? (4-й результат из вывода сеанса) и почему он заботится о регистре символов, когда (eq? 'mISSISSIPpi 'mississippi) ==> #t? (7-й результат) - person philcolbourn; 13.02.2012
comment
@philcolbourn: в (eq? 'bitblt (string->symbol "bitBlt")) второй символ не нормализован, потому что он происходит от string->symbol. В (eq? 'mISSISSIppi 'mississippi) оба символа нормализованы по регистру, поскольку они взяты из read (неявно). - person Fred Foo; 13.02.2012
comment
Ok. Я понимаю! Ваша настойчивость достойна восхищения. Спасибо! - person philcolbourn; 13.02.2012