Примеры использования Hastache
Выложил примеров для hastache: README.md (этот файл, кстати, хасташем же и собирается — mkReadme.hs). Эти же примеры россыпью файлов: example.
Выложил примеров для hastache: README.md (этот файл, кстати, хасташем же и собирается — mkReadme.hs). Эти же примеры россыпью файлов: example.
Новости хасташестроения:
Во-первых, Akaspin прислал полезный патч, позволяющий с помощью mkGenericContext создавать контексты для типов с полями MonadIO m => (Byte)String -> m (Byte)String, за что ему выдаётся очередной плюс в карму. Сам я о такой возможности думал, но не осилил, ура опенсорсу. Пример использования тут.
Во-вторых, я обобщил конструктор MuLambda до MuVar a => MuLambda (ByteString -> a), раньше можно было только ByteString возвращать, а теперь любой тип, для которого есть инстанс класса MuVar. Удобно, как-то я раньше не сообразил так сделать.
В-третьих, Сам Bryan O'Sullivan (один из авторов книги Real World Haskell), прислал небольшой патч для hastache и посоветовал использовать blaze-builder для записи результата работы шаблонизатора. Blaze-builder предназначен для генерации Lazy ByteString с контролем минимального размера фрагментов этой строки. За счет этого достигается существенное увеличение скорости дальнейшей работы с этой строкой. Вместо кучи мелких блоков (а именно так и получается при работе hastache), имеем несколько крупных, которые, к примеру, по сети уедут быстрее (за счет минимизации количества системных вызовов). Так что теперь и обычный результат hastache состоит из удобных крупных блоков внутри Lazy ByteString, и, также, можно получить непосредственно объект Builder библиотеки blaze-builder и дальше уже работать прямо с ним.
Akaspin зарепортил один неприятный баг в hastache, за что ему выражается всяческая благодарность с занесением в карму. Проблема заключалась в том, что достаточно часто нужно иметь возможность обратиться из вложенного блока шаблона к переменной определенной где-то выше в иерархии контекстов. В оригинальном Mustache такая функция есть, а я это дело благополучно проворонил. Исправляюсь. Можно почитать подробности, и посмотреть ещё один пример из тестов.
Выложил новую версию шаблонизатора hastache. Добавил возможность генерировать контекст из типов содержащих функции типа String -> String и ByteString -> ByteString. Смотрите пример использования кому интересно.
Довел до ума и выложил в open source свою реализация шаблонизатора Mustache, на которой, в частности, крутится сайт с которого вы это сейчас читаете.
Взять можно либо на GitHub, либо из HackageDB:
(далее...)В рамках борьбы с велосипедизмом, я просто обязан написать про библиотеку derive. Служит она для автоматической генерации инстансов разных классов (смотрите документацию каких именно, там много). Меня эта библиотека заинтересовала, прежде всего, как генератор для Data.Binary, которая очень удобна как быстрый бинарный сериализатор над Data.ByteString.Lazy. У себя на сайте я использую Data.Binary для кеширования данных.
Derive умеет генерировать как обычный код внутри .hs файлов, так и создавать инстансы во время компиляции с помощью Template Haskell.
(далее...)Переписал свой блог — теперь это Haskell! Заходите вы ко мне на сайт, почитать это сообщение, а в это время, на далеком сервере, лямбда функции замыкаются и редуцируются, монады одна в другую трансформируются, санки форсятся и происходит разная другая магия.
Пока немного тезисно что, как и почему, часть тем буду в будущем разворачивать:
(далее...)Для бинарной сериализации в Haskell существует модуль Data.Binary. Без побочных эффектов (де)сериализует в/из Data.ByteString.Lazy. Он пока не идет в поставке с GHC и его нужно руками ставить из hackage. Использовать его не просто, а очень просто:
(далее...)Haskell (15)
Hastache (6)
Python (2)
Web (2)
Волшебство (41)
Книги (1)
Математика (3)
Программирование (20)
Проекты (11)
ФП (16)