← Архив: Common Lisp

сделал аналог defadvice для SBCL

Author: · 11.09.2017 00:43
· original author: den73
Сделал аналог 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
· original author: den73
ПО сути всё это - о том, как добавлять в метаданные SBCL свои виды определений. В Лиспворксе есть dspec, который для этого предназначен. Он довольно странный и не очень хорошо документирован, но его можно заставить работать. В SBCL тоже есть база данных, где хранятся определения. В моих исходниках можно увидеть, как с ней работать.
ХОтелось бы code review, перед тем, как я напишу обо всём этом в SBCL-devel. 
· original author: den73
Ну, результат был вполне предсказуем. 
· original author: den73
Мне написали, что encapsulate - это по сути defadvice, только скрытый.