LINUX.ORG.RU

Вопрос вам, общие лисцперы

 


0

2

А вот как вы считаете, должен ли ридер читать такую конструкцию? А стандарт как считает?

`#(#x4f #x67 #x67 #x53 ; OggS
        #x00 #x02           ; First page of logical bitstream
        #x00 #x00 #x00 #x00
        #x00 #x00 #x00 #x00 ; 0 absolute granule position
        #xbe #xba #xfe #xca ; Stream serial number
        #x00 #x00 #x00 #x00 ; Page number
        #x93 #x11 #xba #x36 ; CRC
        #x02                ; 2 segments
        #xff #x00           ; 1 255-bytes packet
        ,@(loop repeat 256 collect 1))

Дело в том, что старые sbcl'и читают это одним образом, а новые - другим

Не знаю, но с чтением всё нормально, вот только с вычислением у clisp облом.

ados ★★★★★
()
Последнее исправление: ados (всего исправлений: 1)

По стандарту должен считаться simple-vector. У вас тип отличается или значение? Насколько старый должен быть sbcl? (проверил в текущем и в 1.0.50, результат не отличается)

У вас получается разный тип или разное содержимое? (Не удивлюсь, если когда-то такое считывалось как (simple-array (unsigned-byte 8)), например. Но правильно как сейчас, см. clhs 2.4.8.3).

LeninGad
()
Ответ на: комментарий от LeninGad

Не удивлюсь, если когда-то такое считывалось как

Это simple-vector. Дело в том, что в вашем sbcl `#(1 2 ,@(loop repeat 3 collect 1)) даст #(1 2 1 1 1), а в sbcl 1.2.2 будет #(1 2 (1 1 1)). Такие дела. А clisp схавает в репле, но не будет грузить (по load)

b-stern
() автор топика

Поискал в changelog'ах sbcl релевантное, почти не нашёл. Есть подозрение, что считывается он у вас одинаково, а вот печатается по-разному (см. 0.8.1: fixed simple vector readable printing).

LeninGad
()
Ответ на: комментарий от LeninGad

Не нашел? У них в коммитах ридер щас перепиливают сильно

Есть подозрение

Мимо

b-stern
() автор топика
Ответ на: комментарий от b-stern

Должно быть строго #(1 2 1 1 1), по стандарту всё однозначно и допустимо. Уверены, что не пропустили @ при тестировании в sbcl 1.2.2?

Проверил в sbcl 1.2.3.debian, получил ожидаемое.

А что clisp говорит?

LeninGad
()
Ответ на: комментарий от LeninGad

Проверил в sbcl 1.2.3.debian

Может пофиксили, ща проверю.

А что clisp говорит?

Да в отладчик падает где-то внутри ридера

b-stern
() автор топика
Ответ на: комментарий от LeninGad

Проверил в sbcl 1.2.2 дебиановской сборки:

* `#(1 2 3 ,@(loop repeat 3 collect 1))

#(1 2 3 (1 1 1))
* `(1 2 3 ,@(loop repeat 3 collect 1))

(1 2 3 1 1 1)

В clisp 2.49

[1]> `#(1 2 3 ,@(loop repeat 3 collect 1))
#(1 2 3 1 1 1)

И, для полноты картины, gcl 2.6.11

> `#(1 2 3 ,@(loop repeat 3 collect 1))

#(1 2 3 1 1 1)

kim-roader ★★
()
Последнее исправление: kim-roader (всего исправлений: 1)
Ответ на: комментарий от buddhist

Да никакой мистики, там в истории коммитов если посмотреть, так там очень сильно ридер потрогали, а ща, походу, исправляют баги

b-stern
() автор топика

В SBCL-1.2.2 поломали представление квазиквотации в виде простых списков, чтобы иметь возможность выводить его на печать в том же виде, в каком оно вводилось. Это полностью соответствуют стандарту, но поломало некоторые пакеты, использовавшие кодоволкер без макроэкспанда. Например, iterate. В общем, это может быть регрессия, если на последний версии SBCL воспроизводится, засабмить баг. Мне сейчас нечем проверить.

Jini ★★
()
#(... ,@(...))

Неопредленное поведение, из-за того что ",@" определено только для списков. А во что раскрывается «#(...)» детали внутреней реализации. Это если и работает, то исключительно святым духом.

antares0 ★★★★
()
Ответ на: комментарий от antares0

Стандарт плохому не учит:

(apply #'vector
       `(#x4f #x67 #x67 #x53         ; OggS
              #x00 #x02              ; First page of logical bitstream
              #x00 #x00 #x00 #x00
              #x00 #x00 #x00 #x00       ; 0 absolute granule position
              #xbe #xba #xfe #xca       ; Stream serial number
              #x00 #x00 #x00 #x00       ; Page number
              #x93 #x11 #xba #x36       ; CRC
              #x02                      ; 2 segments
              #xff #x00                 ; 1 255-bytes packet
              ,@(loop repeat 256 collect 1)))
ados ★★★★★
()
Ответ на: комментарий от ados

Минимум сахара:

(apply #'vector
       #x4f #x67 #x67 #x53         ; OggS
       #x00 #x02              ; First page of logical bitstream
       #x00 #x00 #x00 #x00
       #x00 #x00 #x00 #x00       ; 0 absolute granule position
       #xbe #xba #xfe #xca       ; Stream serial number
       #x00 #x00 #x00 #x00       ; Page number
       #x93 #x11 #xba #x36       ; CRC
       #x02                      ; 2 segments
       #xff #x00                 ; 1 255-bytes packet
       (loop repeat 256 collect 1))
ados ★★★★★
()
Ответ на: комментарий от antares0

Я к тому в сабже ноги растут от переборщения сахаром всяких `# ,@. Нужно писать по-человечески, чтобы код можно было читать.

А насчёт сравнения - sbcl (1.1.17) без разницы, а clisp не ругается и мне субъективно более понятно что требуется от машины.

ados ★★★★★
()
Последнее исправление: ados (всего исправлений: 2)
Ответ на: комментарий от ados

Ну тык это надо ТС-у говорить, не мне. А то он об никогда и не узнает :(

antares0 ★★★★
()
Ответ на: комментарий от Kotolegokot

Ты вопрошаешь или сетуешь на нравы?

Анонимусам пруфы не нужны, если они явно их не просят. Предполагается что в силу своей уникальной природы они и так все знают.

antares0 ★★★★
()
Последнее исправление: antares0 (всего исправлений: 2)
Ответ на: комментарий от antares0

Ты вопрошаешь или сетуешь на нравы?

И то, и то, на самом деле.

Kotolegokot
()
Ответ на: комментарий от Kotolegokot

Ну все вроде и так все знают, чего приводить? Но ок: http://franz.com/support/documentation/8.1/ansicl/subsecti/backquot.htm

The backquote syntax can be summarized formally as follows. `basic is the same as 'basic, that is, (quote basic), for any expression basic that is not a list or a general vector. `,form is the same as form, for any form, provided that the representation of form does not begin with at-sign or dot. (A similar caveat holds for all occurrences of a form after a comma.) `,@form has undefined consequences. `(x1 x2 x3 ... xn . atom) may be interpreted to mean (append [ x1][ x2][ x3]... [ xn](quote atom)) where the brackets are used to indicate a transformation of an xj as follows: -- [form] is interpreted as (list `form), which contains a backquoted form that must then be further interpreted. -- [,form] is interpreted as (list form). -- [,@form] is interpreted as form. `(x1 x2 x3 ... xn) may be interpreted to mean the same as the backquoted form `(x1 x2 x3 ... xn . nil), thereby reducing it to the previous case. `(x1 x2 x3 ... xn . ,form) may be interpreted to mean (append [ x1][ x2][ x3]... [ xn] form) where the brackets indicate a transformation of an xj as described above. `(x1 x2 x3 ... xn . ,@form) has undefined consequences. `#(x1 x2 x3 ... xn) may be interpreted to mean (apply #'vector `(x1 x2 x3 ... xn)). ... An implementation is free to interpret a backquoted form F1 as any form F2 that, when evaluated, will produce a result that is the same under equal as the result implied by the above definition, provided that the side-effect behavior of the substitute form F2 is also consistent with the description given above.

anonymous
()
Ответ на: комментарий от Kotolegokot

`,@form has undefined consequences.

а про вектора, чтобы ты опять не искал со своим пзидоглазием

anonymous
()
Ответ на: комментарий от anonymous

[,@form] is interpreted as form.

[,@form] = (list `,@form), как там и написано. Верно?

`,@form has undefined consequences.

Получается, стандарт противоречит самому себе?

Kotolegokot
()
Ответ на: комментарий от Kotolegokot

[,@form] = (list `,@form), как там и написано. Верно?

ты блять читать не умеешь? Оно так интерпретируется только в качестве формы внутри `(x1 x2 x3 ... xn . atom) may be interpreted to mean:

`(x1 x2 x3 ... xn . atom) may be interpreted to mean (append [ x1][ x2][ x3]... [ xn](quote atom))

where the brackets are used to indicate a transformation of an xj as follows: -- [form] is interpreted as (list `form), which contains a backquoted form that must then be further interpreted. -- [,form] is interpreted as (list form). -- [,@form] is interpreted as form.

anonymous
()
Ответ на: комментарий от anonymous

`#(x1 x2 x3 ... xn) may be interpreted to mean (apply #'vector `(x1 x2 x3 ... xn)).

may be

Т.е. имплементация CL может забить на эту «фичу» и оставаться полностью соответствующей CL имплементацией как в случае с clisp?

ados ★★★★★
()
Ответ на: комментарий от ados

Т.е. имплементация CL может забить на эту «фичу» и оставаться полностью соответствующей CL имплементацией как в случае с clisp?

Еще один не умеет читать? :facepalm.jpg:

«may be interpreted to mean» тут значит, что результат формы `#(x1 x2 x3 ... xn) должен быть equal форме (apply #'vector `(x1 x2 x3 ... xn)). То есть он может быть каким-то другим, не (apply #'vector `(x1 x2 x3 ... xn)), но обязательно должен быть equal ей. Там ниже это поясняется.

anonymous
()
Ответ на: комментарий от ados

Ты не боись, что меня касалось,я прочитал. А мнения диванных экспертов без строчки собственного кода вроде тебя меня мало интересует

b-stern
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.