пятница, 28 августа 2009 г.

Лисперу cron не нужен!

Для возможности отображения перевода PCL на lisper.ru необходимо регулярно скачивать и распаковывать свежий snapshot. Обычный способ - поместить соответствующее задание в cron. Однако, если вы пишете на Common Lisp, то можете легко реализовать pure-лисп решение, и, при этом, получить чуть больший уровень гибкости.

Для решения этой задачи потребуются следующие пакеты (благо, они уже установленные на lisper.ru)
Код тривиален:
;;;; Некоторые настройки
(defparameter *pcl-snapshot-url* #u"http://pcl.catap.ru/snapshot.zip")
(defparameter *pcl-snapshot-dir* #P"/var/rulisp/pcl/")
(defparameter *pcl-load-snapshot-p* t)

;;;;; Функция для загрузки и разархивирования
(defun load-pcl-snapshot ()
(when *pcl-load-snapshot-p*
(let ((snapshot-path (ensure-directories-exist (merge-pathnames (car (last (puri:uri-parsed-path *pcl-snapshot-url*)))
*pcl-snapshot-dir*)))
(snapshot (drakma:http-request *pcl-snapshot-url*
:force-binary t)))
(when snapshot
(with-open-file (out
snapshot-path
:direction :output
:element-type '(unsigned-byte 8)
:if-exists :supersede)
(write-sequence snapshot out))
(zip:unzip snapshot-path
*pcl-snapshot-dir*
:if-exists :supersede)
(setf *pcl-dir*
(merge-pathnames "var/www/pcl.catap.ru/htdocs/data/pages/pcl/"
*pcl-snapshot-dir*))
t))))

;;;; Выполняем (load-pcl-snapshot) по расписанию, скажем, один раз в час
(if *pcl-load-snapshot-p*
(clon:schedule-function 'load-pcl-snapshot
(clon:make-scheduler (clon:make-typed-cron-schedule :hour '*)
:allow-now-p t)
:thread t))

Wiki на lisper.ru

В общем, наш футбол меня вчера настолько расстроил, что я решил сублимировать всё в коде и написал первую версию wiki-системы для lisper.ru: http://lisper.ru/wiki/. Возможности, конечно, весьма тривиальны, но работать уже можно. В качестве языка разметки используется систаксис dokuwiki, для которого реализована довольно полная поддержка (не всё ещё, но, в основном, работает правильно).

Разработка данной версии заняла примерно 6 часов (с 10 вечера до 4 утра).

вторник, 11 августа 2009 г.

Перевод PCL на lisper.ru

В предыдущем сообщении я написал о желании публиковать перевод Practical Common Lisp на lisper.ru. Двое суток тяжелого труда :) и вот, уже можно смотреть: http://lisper.ru/pcl/. Там ещё много работы по доводке, но все принципиальные проблемы решены.

Попутно начал писать фрэйморк для парсинга всяких лёгких wiki-разметок: https://github.com/archimag/wiki-parser/tree (код ещё сырой).

суббота, 8 августа 2009 г.

Common Lisp vs PHP

Есть у меня мысль реализовать возможность просмотра перевода "Practical Common Lisp" на lisper.ru. Для этого нужен парсер dokuwiki-разметки. Сам я в парсерах, мягко говоря, не силён. Но больше его никто писать не хочет :( Этот парсер дал бы другие возможности, в том числе, возможность экспорта PCL в разные форматы и мог бы послужить основой для разработки вики для lisper.ru.

Ну вот, поскольку больше некому, то решил попробовать сделать сам. Полез смотреть как это делали другие. Взял оригинальный код парсера dokuwiki (PHP) и код cl-markdown (Common Lisp), по сути, очень близкие проекты. Код cl-markdown смотрится, в общем, нормально, но это если не сравнивать с кодом парсера dokuwiki: разница в простоте и ясности кода просто поражает (100 баллов в пользу PHP, при том, что я никогда не писал на PHP, и вообще никогда с ним дела не имел).

Мораль: да, Common Lisp велик и могуч, а PHP ничтожен, но это в теории, а на практике же бывает совсем иная картина. В общем, очередной раз убедился, что все рассказы об удивительных свойствах lisp, равно как и ФП должны потверждаться на практике. Пока же, PHP уходит в отрыв...

Символьные вычисления

Если вы интересовались языком Lisp, то наверняка читали, что он был придуман для символьной обработки данных. Я такое тоже читал, но долго не мог понять, что же всё таки скрывается за этим загадочным термином "символьные вычисления". Однако, там же, где упоминается данная область применений Lisp, обычно есть подсказка в виде какой-либо версии вычислителя s-выражений (калькулятора), плюс, вы могли слышать (знать/пользоваться) о замечательной системе символьных алгебраических вычислений Maxima, которую часто приводят в качестве примера системы, реализованной на Common Lisp. Всё это невольно подталкивает к мысли, что "символьные вычисления" имеют какое-то отношение к алгебре, s-выражениям (что за зверь?) или "типо того", этим возможно занимаются какие-то безумные учёные из NASA, но это, совершенно точно, не имеет никакого отношения к базам данных, веб-страницам, и прочим вещам, за которые вам на самом деле платят деньги. Ну, не знаю как вы, а я думал так.

Однако, не смотря на то, что я так думал, я всё равно занимался изучением Common Lisp, ибо он обладает целым набором замечательных свойств (перечислять не буду). И вот, по мере изучения Common Lisp я вдруг стал понимать, что "символьные вычисления" это совершенно нечто иное и лучше бы мне не показывали этот самый вычислитель s-выражений и не рассказывали про Maxima: может тогда бы я осознал силу и пользу "символьных вычислений" гораздо раньше.

Вообще-то, я на самом деле не знаю, какой смысл вкладывали в "символьные вычисления" те самые первые "отцы-основатели", но я осознаю, что данный термин был сильно "дискредитирован" многочисленным авторами статей "лисп-для-чайников", которые использовали его совершенно не понимая, что же это всё таки такое и что-бы восстановить утраченный смысл надо обращаться к статьям этих самых "отцов-основателей", но подобная работа не для меня :) На да бог с ними, я вижу (пусть даже и не всё) и могу попробовать рассказать, что же из себя представляют "символьные вычисления" в современном Common Lisp.

В Common Lisp символы - это фундаментальный тип данных, для которого существую мощный API, являющийся результатом 50-ти лет развития. Т.е. я трактую обсуждаемый термин весьма прямолинейно, как операции над символами в терминах Common Lisp. И это имеет отношение и к базам данных, и к веб-страницами и вообще, к очень многому, ибо "символьные вычисления" оказываются весьма полезными при решения самых разнообразных задач. Конечно, в символах нет "джина", который выскочит и порешает все ваши проблемы, и да, их можно заменить какими-нибудь строками или "типа того", и возможно вы сейчас так и делаете (на какой-нибудь Java), или делали раньше, но это типичное "велосипедостротильство", со всем его недостатками.

Вряд ли у вас прибавилось понимания "символьных вычислений" :), для этого нужно много практических примеров и я собираюсь написать статью об использовании "символьных вычислений" при разработке web-приложений и выложить её на lisper.ru. Правда, вряд ли это будет раньше, чем через пару месяцев.

P.S. Широко распространено заблуждение, что самой-самой главной фичей Common Lisp являются макросы. Это не так. Макросы это замечательно, но это не "самая главная фича" (такой просто нет). Но, между прочим, макросы возможны в том числе потому, что CL поддерживает символьные вычисления.

четверг, 6 августа 2009 г.

cl-routes на github

Продолжаю перевод проектов с Google Code SVN на github. Очередная жертва - cl-routes, теперь исходный код живёт здесь