Регистрация | Войти
Lisp — программируемый язык программирования
RSS
сделал аналог defadvice для SBCL
den73 - 11.09.2017 00:43, Сообщений - 7
Сделал аналог defadvice из Lispworks или advise из CCL. 

Т.е. пока не совсем аналог. Для функции можно задать только один "совет", а в Lispworks их можно задать сколько угодно (правда, порядок их вызова не определён). 

Но я сделал главное - с помощью поиска определения функции можно найти как исходную функцию, так и декоратор. 
Исходники здесь (не думаю, что вы сможете всё это запустить без clcon/Яра)

Заодно переделал поиск определений asdf систем. Вроде в SLIME есть контриб для поиска определения системы asdf, но он находит с точностью до файла. Я нахожу с точностью до формы. Но это у меня уже давно было. 

Исходники:
https://bitbucket.org/budden/budden-tools/src/20ce8de15137fcf93d81c35a89d0dc8289a35013/decorate-function.lisp?at=default&fileviewer=file-view-default
https://bitbucket.org/budden/budden-tools/src/20ce8de15137fcf93d81c35a89d0dc8289a35013/asdf-3.1.4-tools.lisp?at=default
https://bitbucket.org/budden/budden-tools/src/20ce8de15137fcf93d81c35a89d0dc8289a35013/sbcl--find-definition-sources-by-name--patch.lisp?at=default

[#]
ПО сути всё это - о том, как добавлять в метаданные SBCL свои виды определений. В Лиспворксе есть dspec, который для этого предназначен. Он довольно странный и не очень хорошо документирован, но его можно заставить работать. В SBCL тоже есть база данных, где хранятся определения. В моих исходниках можно увидеть, как с ней работать.

ХОтелось бы code review, перед тем, как я напишу обо всём этом в SBCL-devel. 

den73 - 11.09.2017 00:45
[#] Ответ на комментарий от den73 11.09.2017 00:45
Ну, результат был вполне предсказуем. 
den73 - 11.09.2017 22:01
[#] Ответ на комментарий от den73 11.09.2017 22:01
Мне написали, что encapsulate - это по сути defadvice, только скрытый. 
den73 - 14.09.2017 21:09
[#]
> Исходники здесь (не думаю, что вы сможете всё это запустить без clcon/Яра)

Ага, то есть что такое defadvice все должны догадываться, а вот свой Яр опять пропиарил. Убейся
shamaz.mazum - 21.09.2017 17:52
[#] Ответ на комментарий от shamaz.mazum 21.09.2017 17:52
Если ты не знаешь, что такое defadvice, то ты некомпетентен. Убейся лучше ты. 
den73 - 21.09.2017 20:24
[#] Ответ на комментарий от den73 21.09.2017 20:24
Не потрудишься объяснить, в чем именно я некомпетентен? Я не берусь утверждать, что я знаю всё.
shamaz.mazum - 23.09.2017 10:52
[#] Ответ на комментарий от shamaz.mazum 23.09.2017 10:52
Я это тебе из злобности написал, после того, как ты предложил мне убиться. Извини, я в таком стиле общаться не готов. Считай, что ты в игнор листе (правда, тут нет игнор-листов) :) 

Обобщил то, что нужно для определения своих видов определений в SBCL. Теперь у меня (и ещё у одного существующего в мире пользователя Яра, который, правда, им всё равно не пользуется) есть то же, что в Lispworks называется dspec. Оно более убогое, но зато более простое. dspec какой-то чрезмерно навороченный. 

По сути, для этого нужно сделать 3 вещи:
[quote]
i) ensure-definition-type
ii) when defining an object, associate its definition location to the object somehow (make sure it survives fasl dumping and loading
iii) decorate sb-introspect::find-definition-sources-by-name (and maybe sb-introspect::find-definition-source ?)
[/quote]
См. https://bitbucket.org/budden/budden-tools/src/7db851394d2c023e29b22b43795a04d3390c660d/sbcl--find-definition-sources-by-name--patch.lisp?at=default&fileviewer=file-view-default

Для тех, кто не успел перевести часы: я в течение многих лет пытался предлагать сообществу полезные вещи, которые я реализовывал в библиотеке budden-tools. Я никогда не озадачивался сильно модуляризацией - библиотека всегда была монолитом. Но некоторое время я поддерживал разные реализации CL. Я не исключаю, что часть из них взяли другие люди для своих библиотек. Например, local-nicknames и синтаксис package::(form)  появились в SBCL после того, как я попиарил свою библиотеку. Не знаю, у меня они это взяли или нет, но во всяком случае, мне никто спасибо не сказал. 

Есть несколько важных вещей в ней:
- возможность открыть файл компонента и системы asdf, в котором произошла ошибка при сборке образа, за одно нажатие
- symbol-readmacros
- декораторы для функций (теперь для SBCL они основаны на encapsulate)
- разные защиты для чтения, например, запрет интернировать символ в другой пакет через аа::бб
- возможность перехватить чтение символа
- возможность за одну команду экспортировать все поля структуры
- возможность задать список запретных символов для пакета - очень полезно при рефакторинге, когда нужно разбить крупный пакет на два мелких

Также я долго и безуспешно пытался продвинуть улучшенную поддержку named-readtables в SLIME. Около 4 или 5 лет это игнорировалось. Теперь вроде я получил зелёный свет, но мне пока недосуг заняться, тем более, что я лично без этого обхожусь и для меня это будет означать лишь снижение трудоёмкости поддержки моих патчей к SLIME, которая и так невелика.

Поскольку я не получил никакой положительной обратной связи и получил три отказа на свои предложения, в asdf, iterate и slime, я просто сделал свою монолитную среду с набором патчей, которая теперь является частью Яр. Поэтому если я здесь в каждой теме упоминаю Яр, то это значит не то, что я его пиарю (было бы среди кого пиарить, здесь всего человек 10), а то, что это единственный способ получить все эти улучшения одновременно, причём с минимумом трудозатрат. Если кто-то хочет вынести эти улучшения в свою отдельную библиотеку - пожалуйста, лицензия позволяет. Например, monk взял часть моих идей и сделал свою advanced-readtable. Но это будет нелегко, поскольку Яр - это монолит, там много функций, которые патчатся последующими системами. Скорее всего, вы сломаетесь на этапе установки. 

den73 - 08.10.2017 14:16
@2009-2013 lisper.ru