вторник, 29 декабря 2009 г.
Странности в gentoo-lisp-overlay
Что-то стали в gentoo-lisp-overlay кривые пакеты попадаться: для bordeaux-threads-0.7.0 файл с версией не копируется, для parenscript-20090921 зависимости не указаны... Как они их делаю?.. Точнее, как делают понятно, но почему не проверяют - вот это мне не понятно. И исправлений никаких уже долго нет, один я что-ли им пользуюсь... Эх, фиксю и помещаю исправления в свой форк.
понедельник, 28 декабря 2009 г.
restas-directory-publisher на lisper.ru
Больше для демонстрации, чем из реальной необходимости, включил пример использования плагина restas-directory-publisher в состав сайта lispe.ru, смотреть здесь.
Код тривиален:
(restas:define-site-plugin rulisp-files (#:restas.directory-publisher)
(restas.directory-publisher:*baseurl* '("files"))
(restas.directory-publisher:*directory* (merge-pathnames "files/" *vardir*))
(restas.directory-publisher:*autoindex-template*
(lambda (data)
(rulisp.view.fine:main-frame (list :title (getf data :title)
:css (css-files-data '("style.css" "autoindex.css"))
:user (compute-user-login-name)
:main-menu (main-menu-data)
:content (restas.directory-publisher.view:autoindex-content data)
:callback (hunchentoot:request-uri*))))))
среда, 23 декабря 2009 г.
Элементы функциональных языков. Резюме.
Дочитал таки статью "Элементы функциональных языков", мысль по прочтению только одна: если бы хаскелисты освоили Common Lisp, то большинство из них забыло бы про Haskell как про страшный сон :)
Динамическая область видимости
Прочитал в последнем номере журнала "Практика функционального программирования" в статье про "Элементы функциональных языков" буквально следующее:
В языке LISP присутствовали замыкания с динамической областью видимости, нарушавшие законы лямбда-исчисления и, вообще говоря, неудобные в использовании. Emacs LISP— практически единственный используемый на практике современный язык программирования, где используется динамическая область видимости.Т.е. тут два посыла:
- Динамическое область видимости неудобна
- Динамическая область видимости осталась только в ELisp
Теперь вот сижу, пытаюсь найти мотивацию для дальнейшего прочтения, это же надо, так высказаться об одном из ключевых и наиболее удобных свойств Common Lisp: динамические переменные это потрясающе удобно и поэтому используются в коде на Common Lisp чрезвычайно широко.
вторник, 22 декабря 2009 г.
И ещё пара слов о Russian Lambda Planet
Когда проект Russian Lambda Planet был только запущен, это было даже интересно, там было мало блогов, много о ФП и я добавил её в свой RSS-реадер. Месяца три назад я оттуда её удалил, ибо проект превратился неизвестно во что. Куча блогов, в которых теперь очень мало пишут про ФП, зачем-то агрегируются в одну ленту, тему которой, иначе как "Мои ЖЖ друзья", теперь-то и определить сложно.
Почему бы не отбирать сообщения по тэгам? Может движок не позволят? Ну тогда, почему бы не переписать её на "великом и ужасном" Erlang? вроде как и фрэймворки для веба есть... Или даже на Haskell? вдруг и на нём можно подобное писать (в этом, я правда сильно сомневаюсь)?
При чём, работы то там на один вечер. Для сравнения, размер исходного кода Russian Lisp Planet - 240 строк. Ведь все же видят, что в планете сплошной мусор. Переписали бы на Erlang, вот и материал для журнала: "вот сайт, вот код, вот инструкция по установке, а делали мы это так...". И не надо будет больше читать про то, что "GSM убивает тараканов" (с). Нет же, учавствовать в бесконечных холиварах желающих толпы, а как код писать - так у всех "почасовая оплата" (с), ну что за народ...
colorize
Для подсветки кода сейчас для Common Lisp есть пакет colorize, который не обновлялся с 2004-года (но svn-сервер с ним работает исправно, хе, но там только один коммит). С другой стороны, есть приложение lisppaste, которое включает в себя colorize, обращаю внимание, что не использует, а именно включает, т.е. оба этих пакета имеют общий набор файлов. Вообще, ситуация довольно дикая, я не стал вникать в историю (если она даже где-то описана), но подобный подход разработчиков представляется мне довольно безответственным. Так вот, в lisppaste в данный момент поддерживает несколько больший набор языков, чем colorize (сам выбор этих языков представляется мне довольно странным, здесь можно опять порассуждать о безответственности). А ведь, этот функционал является довольно важным, если вы хотите разрабатывать на Common Lisp приложения типа форума, вики, pastebin и т.п.
В общем, я взял colorize, взял изменения из lisppaste, и создал отдельный репозиторий: http://github.com/archimag/colorize. Желающие добавить поддержку новых языков могут слать мне патчи :)
Да, есть один нюанс. Для правильного форматирования кода на Common Lisp пакету требуется установленный HyperSpec. В оригинальном коде он ищётся в домашнем каталоге, но меня такой подход не впечатлил. Я сделал как в Gentoo, где HyperSpec размещается в каталоге #P"/usr/share/doc/hyperspec-7.0/HyperSpec/" - если у вас он находитсья в другом месте, то необходимо открыть файл clhs-lookup.lisp и изменить в нём значение *hyperspec-pathname*.
P.S. Проделав всё это захотел проверить как colorize будет обрабатывать код на теперь поддерживаемых Erlang или Haskell. Думаю, где же искать этот код, если не на Russian Lambda Planet? - пошёл туда, ага, как же. На Russian Lambda Planet есть всякие забавные фотки (кошечки или там разные предметы мебели), есть разная болтовня про мотоциклы, или даже я видел про баб, есть немного словоблудия про ФП в основном в виде ссылок с восторженными комментариями, но там совершенно нет кода на функциональных языках. Нет, справедливости ради, должен заметить, что иногда там всё таки бывает код на Erlang или Haskell (когда-то я там его видел), но кажется что кода на C или Java там значительно больше. Я думаю, что редакция журнала "Практика функционального программирования" несколько погорячилась с этим конкурсом - если какие решения и появятся, то скорей всего это будет Java или PHP :), уж очень не верится, что люди, столько неохотно пишущие код, сподобятся написать что-либо более-менее серьёзное... тем более, столь бесполезное для большинства...
воскресенье, 20 декабря 2009 г.
restas-colorize
Закончил отделение кода "форматтера кода" (обычно подобные приложения называют pastebin) от исходного кода lisper.ru и сейчас он доступен как отдельный restas-плагин: restas-colorize. Перевёл lisper.ru на использование этого плагина. Как побочный результат - новая возможность, теперь можно форматировать код не только на Common Lisp, поддерживаются и некоторые другие языки программирования. Планирую в будущем расширить список поддерживаемых языков, но это не имеет отношения к restas-colorize, а только к библиотеке colorize.
Посмотреть используемую реализацию storage можно здесь.
Сейчас для настройки плагина можно использовать следующие переменные (из пакета #:restas-colorize):
- *max-on-page* - при просмотре списка "pastes" определяет максимальное их количество на одной странице
- *finalize-page* - служит для "встраивания" плагина в сайт, задания общего оформления
- *colorize-user-function* - плагин не имеет своей системы авторизации, предпочитает использовать внешнюю
- *storage* - пожалуй самый интересный параметр, в состав плагина входит только хранилище в памяти, которое позволяет хранить "pastes" в памяти только во время выполнения. Для реального сайта необходимо, скорей всего, использовать хранение в базе, но плагин не берётся судить о том, какая структура базы будет оптимальной для всех сайтов, поэтому на стороне сайта необходимо создать объект *storage*, реализующий требуемый протокол и передать в этой переменной в плагин.
На lisper.ru данный плагин сейчас подключается следующим образом:
(restas:define-site-plugin rulisp-format (#:restas.colorize)
(restas.colorize:*baseurl* '("apps" "format"))
(restas.colorize:*max-on-page* 15)
(restas.colorize:*storage* *rulisp-db-storage*)
(restas.colorize:*colorize-user-function* #'compute-user-login-name)
(restas.colorize:*finalize-page* (lambda (content)
(rulisp.view.fine:main-frame (list :title (getf content :title)
:css (css-files-data '("style.css" "colorize.css"))
:user (compute-user-login-name)
:main-menu (main-menu-data)
:content (getf content :content)
:callback (hunchentoot:request-uri*))))))
Подписаться на:
Сообщения (Atom)
