Михаил Ильин ([info]yorool_gui) wrote,
@ 2007-09-10 03:48:00
Previous Entry  Add to memories!  Tell a Friend!  Next Entry
мини-атчот по изучению HAppS - 2
Итак, с HAppS все начинает немного проясняться. На сайте http://happs.org/ выложили новую версию 0.9.1a, API которой не имеет почти ничего общего со стабильной 0.8.8. Так что изучать версию 0.8.8 смысла не имеет - все равно потом переучиваться.
Все для сборки новой версии надо брать из darcs репозиториев, не пытаясь ничего скачивать в виде архивов, даже 3-rd party библиотеки, иначе не соберется. Автоматическая скачивалка модулей SearchPath, которая, как утверждают, нужна, у меня не завелась, но я прекрасно обошелся без нее: просто помимо перечисленных HAppS-* библиотек скачал еще репозитории
и все успешно собралось. Для сборки каждой библиотеки последовательно выполняются команды
runhaskell Setup.hs configure
runhaskell Setup.hs build
runhaskell Setup.hs install
Для работы xslt в HAppS нужно, чтобы в путях была доступна программа xsltproc из библиотеки libxslt. Сборку libxml/libxslt под windows можно взять отсюда: http://www.zlatkovic.com/pub/libxml/.

Еще для windows нужно сделать небольшой патч: закомментировать вызов "removeFile name" в функции withTempFile (HAppS/Server/XSLT.hs:97). Под windows HAppS пытается удалить этот временный файл до того, как xsltproc его освободит. Под unix это не приводит к ошибке: файл просто будет удален как только последняя программа перестанет его использовать (если я правильно помню), под windows же withTempFile выбрасывает исключение и HAppS выдает в браузер сообщение об ошибке вместо страницы. При этом будут копиться временные файлы, но если HAppS используется лишь для разработки, это не страшно.

В новой версии есть демка HAppS-Begin - простейший блог. Однако изучать по ней библиотеку человеку, знающему Haskell лишь поверхностно, довольно тяжело. Главная засада для меня была в том, что они используют технику "Scrap your boilerplate" ("выбросьте ваши шаблоны"), суть которой далеко не очевидна из документации на библиотеку Data.Generics. Для понимания стоит прочитать например статью http://www.cwi.nl/~ralf/syb1/. Если коротко: это способ обращаться к элементам глубоко вложенных структур данных не проходя вручную по всем уровням структуры, а лишь указывая их тип. Есть и другие сложности. В следующих постах я выложу примеры кода более удобные для понимания.



Create an Account
Forgot your login?
Login w/ OpenID
English • Español • Deutsch • Русский…