anonymous@RULINUX.NET~# Last login: 2024-12-27 08:59:55
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

[lisp] Приколы нашего городка

CL-USER> (defclass cl1 () ((sl1 :initarg :sl1 :accessor sl1 :type (unsigned-byte 8) :initform 0))) #<STANDARD-CLASS CL1> CL-USER> (type-of (sl1 (make-instance 'cl1))) BIT CL-USER> (type-of (sl1 (make-instance 'cl1 :sl1 2))) (INTEGER 0 536870911) CL-USER> (type-of (sl1 (make-instance 'cl1 :sl1 "a"))) (SIMPLE-ARRAY CHARACTER (1))

Чего то я в этой жизни не понимаю, например как беззнаковое целое может быть строкой.

anonymous(*) (2009-05-07 20:03:49)

Emacs-w3m/1.4.335 w3m/0.5.2

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

http://paste.lisp.org/display/79836

Как то так

marsijanin(*)(2009-05-07 20:10:06)

Emacs-w3m/1.4.335 w3m/0.5.2
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_defclass.html#defclass

> The consequences of attempting to store in a slot a value that does not satisfy the type of the slot are undefined.

bugmaker(*)(2009-05-07 22:36:55)

Opera/9.62 (X11; Linux i686; U; en) Presto/2.1.1
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

Это CLISP у тебя? Просто в CMUCL (а соответственно и в SBCL) контроль типов есть.

http://common-lisp.net/project/cmucl/doc/cmu-user/extensions.html#toc68

xTERM(*)(2009-05-07 22:40:03)

Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.9) Gecko/2009041500 SUSE/3.0.9-0.1.1 Firefox/3.0.9
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

Упс. Слона то я спросони и не заметил.

Надо пологать, что поведение с (optimize (speed 3) (safety 0)) тоже сугубо индивидуально для конкрентой реализации?

marsijanin(*)(2009-05-07 22:46:49)

Emacs-w3m/1.4.335 w3m/0.5.2
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

Это CLISP у тебя? SBCL. Но в clisp и ecl таже фигня. Спициально запустил, что бы провирить. Я вообще вначале подумал, что это у меня от недосыпу.

marsijanin(*)(2009-05-07 22:48:51)

Emacs-w3m/1.4.335 w3m/0.5.2
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

Очень странно... От SBCL я никак не ожидал такого. Да и не понятно, почему: он же форкнулся от CMUCL, а там по ссылке написано, что контроль есть. Выходит от динамической типизации в лиспе никуда не уйдешь, и мой аргумент в нашем споре (ты помнишь) все-таки правильный.

xTERM(*)(2009-05-07 23:06:18)

Mozilla/5.0 (X11; U; Linux x86_64; ru; rv:1.9.0.9) Gecko/2009041500 SUSE/3.0.9-0.1.1 Firefox/3.0.9
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

Скорее тут дело всё в том, что я это проверял только в REPL'е, а не на объектах уже скомпилированного класса и уже скомпилированных методах. И таки в clhs резултать нерпределённый.

marsijanin(*)(2009-05-07 23:45:57)

Emacs-w3m/1.4.335 w3m/0.5.2
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

> Выходит от динамической типизации в лиспе никуда не уйдешь

легко входит, легко выходит... При (declaim (optimize (safety 3))) sbcl на пример со строкой очень даже грязно выругается. Другие имплементации впрочем могут проглотить, ибо согласно пророчеству "are undefined". Собственно, никто не мешает сотворить (defmethod (setf sl1) :before (new-sl1 (self cl1)) <сюда пихать проверку типа-и-всего-чего-угодно>), поюзать MOP'овские slot-definition-type, поюзать :writer в качестве опции слота (не забывая, что writer-ов может быть превеликое множество), итд итп. Самое главное - не забывать, что лисп это не язык наподобие висуалвасика но с преламут^Wскопками, а конструктор языков.

bugmaker(*)(2009-05-08 02:11:22)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

> Надо пологать, что поведение с (optimize (speed 3) (safety 0)) тоже сугубо индивидуально для конкрентой реализации?

Да, поскольку это сильно зависит от целевой платформы, а стандарт на этот счёт предоставляет достаточную анарх^Wсвободу.

bugmaker(*)(2009-05-08 02:13:34)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

Можно было догадаться уже по поведению sbcl c считалкой crc, которая заработало только с (optimize (safety 0)), а до этого ругалась на пере^Wнесоответствие значения зявленному (ungigned-byte 16).

З.Ы. Я так понимаю, что для пущей надёжности надо ещё делать (declare (type <bla-bla> <имена-слотов>)) что бы компи^Wреализация сабжевого надязыка не страдала фигнёй по ходу пьесы?

marsijanin(*)(2009-05-08 09:20:16)

Emacs-w3m/1.4.335 w3m/0.5.2
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

> (declare (type <bla-bla> <имена-слотов>))

нет, этого делать не нужно, ибо слот не является аналогом переменной-члена класса в с++ или жабе. См. например cells.

> а до этого ругалась на пере^Wнесоответствие значения зявленному (ungigned-byte 16).

Потому что в лисп более сложная система типов, для корректной работы более пригодна проверка на типы в виде subtypep, и ещё могут действовать дополнительные ограничения. Например, при наследовании класса :type не отменяет задекларированный родителем тип, а накладывает на него дополнительные ограничения. Это особенно заметно в хитросплетениях vector, array, sequence, итп.

Но вообще задавать и проверять типы на каждый чих неполезно. Хотя указание типа в основном служит подсказкой для оптимизатора, необдуманное насильственное указание типа может наоборот значительно ухудшить быстродействие. На эту тему вроде было обсуждение на ЛОР0.

Также проверка типа не очень полезна из-за наличия мультиметодов, да и при цепочной проверке списка из разнотипных элементов более удобным оказывается нечто вроде (cond ((subtypep ...))).

bugmaker(*)(2009-05-08 17:45:28)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

>Потому что в лисп более сложная система типов, для корректной работы более пригодна проверка на типы в виде subtypep, и ещё могут действовать дополнительные ограничения. Например, при наследовании класса :type не отменяет задекларированный родителем тип, а накладывает на него дополнительные ограничения.

Что-то вроде (and fixnum (integer 0 123)) ?

>Но вообще задавать и проверять типы на каждый чих неполезно. Хотя указание типа в основном служит подсказкой для оптимизатора, необдуманное насильственное указание типа может наоборот значительно ухудшить быстродействие.

У меня вольное переложение генератора парсеров двоичных файлов из "практикума", но для хитрых протоколов обмена железок через rs422/485, там таких тонкостей, пока, не предвидится, а вот перформенс был бы желателен. Хотя, если продолжить тему необдуманного прибивания типов, то меня как то поразил один из примеров mcclim, падающий в дебагер от того, что 0 не float, то ли от того, что 0.d0 не целое.

marsijanin(*)(2009-05-08 22:01:55)

Emacs-w3m/1.4.335 w3m/0.5.2
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

> Что-то вроде (and fixnum (integer 0 123)) ?

да, именно так

> перформенс был бы желателен

Оптимизатор sbcl при надлежаще выставленом declaim optimize генерит множество примечаний относительно возможностей для оптимизации. Оптимизировать довольно сложно, тонкостей много, а код без явных огрехов типа излишних использований функций nth или last или излишних напрягов GC довольно быстр (хотя старт может быть долгим из-за загрузки ВМ, но это принципиальная сложность), так что без реальной надобности браться за низкоуровневую оптимизацию путём ограничения в типах не рекомендую.

> меня как то поразил один из примеров mcclim, падающий в дебагер от того, что 0 не float, то ли от того, что 0.d0 не целое.

Чего же тут удивительного? Это разные типы, и ведут себя по-разному, и если неявное преобразование запрещено, значит нельзя. Тебя ведь не удивляет, что (/ 1 3) и (/ 1.0 3.0) дадут принципиально разный результат?

bugmaker(*)(2009-05-09 02:47:10)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

Я и привёл пример и mcclim-examples как пример, уж извините за пример-примерный.

Однако, как я уже писал, у меня сейчас задача как раз такая, где прибивание типов как раз показано (около половины операций состоит из (setf (ldb (byte ...))), плюс всякие crc и коды Рида-Соломона.

Кстати, не присоветуете какого нить мануала по написанию генераторов парсеров двоичных протоколов обмена, кроме как чтения сырцы clx до просветления?

З.Ы. Спасибо за разъяснения.

marsijanin(*)(2009-05-09 13:11:52)

Emacs-w3m/1.4.335 w3m/0.5.2
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

s/сырцы/сырцов/ - не проснулся ещё

marsijanin(*)(2009-05-09 13:27:39)

Emacs-w3m/1.4.335 w3m/0.5.2
[#] [Добавить метку] [Редактировать] Ответ на: [lisp] Приколы нашего городка от anonymous 2009-05-07 20:03:49
avatar
Скрыть

Re:[lisp] Приколы нашего городка

> Я и привёл пример и mcclim-examples как пример, уж извините за пример-примерный.

пример вполне корректен и хорош

> Кстати, не присоветуете какого нить мануала по написанию генераторов парсеров двоичных протоколов обмена, кроме как чтения сырцы clx до просветления?

боюсь, что нет.

bugmaker(*)(2009-05-10 13:48:59)

Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.4) Gecko/2008102920 Firefox/3.0.4
Этот тред читают 3 пользователя:
Анонимных: 3
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!