Обновление/Update

Я обновил оформление блога (slash-theme), добавил страницу со ссылкой на about.me и хочу коротко написать в этом переходном посте об изменениях.

Я не писал сюда довольно долго, хотя за последний год у меня было довольно много интересного программистского опыта. Надеюсь, в ближайшее время у меня будет возможность заполнить этот пробел.

Опуская всё то, что предшествовало этому, с декабря я принимаю участие в европейской программе Intercrossing, работаю в Era7 Bioinformatics — Испанской компании, расположенной в чудесном городе Гранада. Подробнее об этом я писал в другом своём блоге.

И последнее, я дублирую текст этого поста на двух языках, потому что последующие посты я собираюсь писать на английском.


I’ve updated blog theme (slash), added a page with a link to about.me and in this transition post I want to explain shortly about changes.

I haven’t written here for a long time, while I had a lot of interesting programming experience during last year. I hope, I will have enough time in the nearest future to fill this gap.

Skipping all those things that happened to me and moving directly to the current state, since the beginning of December I’m taking a part in the Intercrossing International Training Network, working at the Era7 Bioinformatics — Spanish company based in a beautiful city Granada.

And the last, I duplicate text of this post in two languages, because I’m going to write further posts in English.

Initial Post

Ура! Я сгенерил этот блог с помощью замечательного Octopress и разместил его на GitHub. Теперь я перееду с Tumblr и сделаю тут самый уютный и замечательный бложик со всякими клёвыми свистелками, блекджеком и подсветкой кода в постах конечно! Тумблер тоже останется как эдакая удобная лента для репостов, ссылок, цитат и т.д. и т.п.

Я давно хотел сделать такой гиковский блог с помощью Hakyll, но провозившись с ним вчера полдня, понял, что это не для меня. Дело в том, что документации по нему мало, а примеры все примитивные. Я хотел простой блог, но с хорошим оформлением и возможностью прикручивать всякие удобные дополнения. А там чтобы сделать нормальное оформление, надо ручками писать шаблоны и css’ы и всё такое. После десятка тщетных попыток перенести туда какие-то темы из других блогов, я бросил это глупое занятие. Не дорос я видимо ещё до того, чтобы собирать “blog from scratch”.

Jekyll — подобный генератор статических сайтов, который появился раньше Hakyll‘а и намного более популярен. Для него больше всего и главное, информации по настройке. Но Hakyll меня привлекал тем, что его конфиг — просто скрипт на Haskell (на котором он и написан). А конфиг Jekyll — соответственно скрипт на Ruby. С Ruby я не имею никакого знакомства и поэтому мне не хотелось особенно долго с ним разбираться, так что с Jekyll я тоже не стал связываться.

И вот, я натыкаюсь на Octopress с очень милым осьминогом, который умеет настраивать Jekyll на раз-два. Я поднял этот блог со стандартным оформлением (которое на мой взгляд вполне себе ничего для дефолтного) всего за полчаса. Это не может не радовать “) Глядя на то, как бодро и чётко всё работает, я даже заинтересовался Ruby…

Дальше буду менять потихоньку оформление, прикручивать интересные плагины и перетащу сюда с Tumblr содержательные посты о программировании.

Подстановка имён в шаблонах объявлений (TH + SYB)

(репост из tumblr)

Всё, пишу последний пост про свои велосипеды. Дальше буду переводить туториалы и делать уже что-нибудь более содержательное. И то, в свободное от учёбы время - надо сконцентрироваться на дипломе..

Итак, напомню, в чём заключается задача. Я писал об этом в первом посте о Template Haskell - задача в том, что хочется делать сплайсинг имён в объявлениях. И я предложил вариант ухода от этой проблемы. Но в заключении того поста я сформулировал недостаток того подхода - с помощью оператора (^=) можно объявлять только значения, то есть если нужна функция с несколькими клозами:

1
2
3
4
foo :: Num a => a  String
foo x 1 = show (x + 23)
foo x 2 = show (x - 98)
foo x _ = show x ++ "blah-blah"

то чтобы сделать шаблон, нужно будет запихнуть все клозы в цитату тела:

1
2
3
4
5
6
7
8
9
fooTemplate :: String  Int  Int  String  Q [Dec]
fooTemplate name y z blah = sequence
    [ name ^:: [t| Num a => a  String |]
    , name ^= [| λ a b  case (a,b) of
                  (x,1)  show (x + y)
                  (x,2)  show (x - z)
                  (x,_)  show x ++ blah
              |]
    ]

Это конечно выглядит так себе. Мне не нравится это ограничение такого подхода. Ещё раз повторюсь, я хочу чтобы шаблон выглядел максимально похожим на то, что он определяет.

И я нашёл решение. Даже два:

  • Одно - в лоб, оно не гибкое, не красивое, для него нужно явно пользоваться конструкторами синтаксиса (чего я пытался до этого избежать), но зато простое (в смысле прямолинейное) и в ключе данной локальной задачи вполне подходит.
  • Второе решение использует крутую технику - Scrap Your Boilerplate (SYB). Для него нужно немного прокачать своё haskell-fu, но это в любом случае стоит того и на самом деле вовсе не так сложно. То есть я на самом деле не постиг пока всех глубин Generic Programming, посредством SYB, но узнал о том, что это такое в принципе и как этим пользоваться в простейших случаях.

Я хочу, чтобы мой шаблон выглядел как-то так:

1
2
3
4
5
6
7
fooTemplate :: String  Int  Int  String  Q [Dec]
fooTemplate name y z blah = ...
    [d| foo :: Num a => a  a  String
        foo x 1 = show $ x + y
        foo x 2 = show $ x - z
        foo x _ = show x ++ blah
      |]

То есть цитата будет буквально содержать объявление функции с несколькими клозами и будет содержать явные элементы для подстановки: y, z, blah, они стоят в выражении и с ними ничего делать не надо, и есть один “неявный” placeholder (держатель места) - имя функции foo, которое мы хотим заменить на значение параметра name. А вот место, где стоит троеточие - это и будет наше решение, механизм подстановки этого имени.

unfold

HaTeXExtension @ GitHub

(репост из tumblr)

Итак, официальный анонс “) Теперь у моего прожекта HaTeXExtension есть своя клёвая страничка на github-pages с мажорным адресом.

http://laughedelic.github.com/HaTeXExtension

Плюс там онлайн документация, которую я писал пол-ночи “/ Ну и сам код на гитхабе.

Кстати, автор HaTeX (Daniel Díaz) нашёл мою репу на гитхабе раньше, чем я успел всё доделать. При этом он уже перенёс пару фишек в основную версию и дал на меня ссылку в общий mailing-list. Я довольный же! ^__^

HaTeXExtension + TH: Спаривание операторов

(репост из tumblr)

Продолжаю серию дополнений HaTeXExtension с использованием Template Haskell. В этом посте будет пример шаблона с рекурсивным сплайсингом/цитированием.

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

1
2
3
a ¸ b = a  comma  b
a  b = a  space  b
a ¸⎕ b = a ¸ ""  b

Хорошо, от первых двух деклараций мы избавились изменив шаблон defTeXCommand. Теперь я хочу сделать шаблон, который будет брать пары операторных символов и генерировать объявление их спаренного варианта. Гм, пошёл делать и понял, что можно брать не пары а списки, чтобы можно было сплавлять сколько угодно операторов.

unfold

Использование Template Haskell в HaTeXExtension

(репост из tumblr)

Вступление

За последние дни я много экспериментировал с Template Haskell и узнал много интересных вещей. Я по прежнему многое ещё не понимаю, но со многими вопросами я разобрался и хочу об этом тут написать. Сразу оговорюсь, что мои ответы скорее всего являются следствием того, что я не умею пока готовить TH, или я просто изобретаю самокаты.

Итак, на этой неделе я уже написал два поста о HaTeX-3 и Template Haskell. В последнем посте я ставил вопрос о генерации объявлений с помощью TH и непонятной мне невозможности замены имени объявляемого объекта в цитированном коде. (Ну и оборот завернул, это у меня после написания эссе по философии)

Сегодня я немного поразбирался с квазицитированием (Quasiquotation, далее коротко QQ) - ещё одним расширением Haskell’а, на базе TH. Рекомендую почитать статью по ссылке и разобрать несложный пример - на нём многое становится понятно. Поначалу я недоумевал - ну парсеры, ну с другим синтаксисом, ну и что… Но сегодня я наконец-то осознал в чём истинная сила QQ и обязательно напишу об этом на следующей неделе. У меня уже есть пара идей для реализации с помощью QQ и в том числе для HaTeX.

Постановка задачи

Задача на самом деле остаётся та же, что и в предыдущем посте про TH. Только теперь я переформулирую её в контексте моих экспериментов с HaTeX. Поскольку каких-то TeX’овских команд мне не хватало в HaTeX’е, я решил написать для него небольшое дополнение. Итак, в моём модуле HaTeXExtension была куча объявлений вида

1
2
3
4
5
space :: LaTeX
space = " \\quad "

leq :: LaTeX
leq = " \\leq "

и т.п. С переходом на новую версию HaTeX’а, я переделал их таким образом:

1
2
3
4
5
space :: LaTeX
space = TeXComm "quad" []

leq :: LaTeX
leq = TeXComm "leq" []

Это конечно не бог весть какой код, но когда таких функций 10 или 20, мне он всё же кажется достаточно скучным и я нашёл в этом повод для себя попробовать использовать Template Haskell. То есть я хочу генерировать такие объявления автоматически по имени команды и функции. Так что теперь этот код выглядит у меня следующим образом:

1
2
3
defTeXCommand "space" "quad"

defTeXCommand "" "leq"     -- имя функции и команды одинаковые

Повторюсь, что задача высосана из пальца, но её можно воспринимать как простой пример.

unfold

Заметка о Template Haskell

(репост из tumblr)

Вступление

На развёрнутый пост о своих многочисленных экспериментах с Template Haskell (далее коротко TH) у меня сейчас времени нет, но я его обязательно напишу. В планах даже перевод небольшого туториала.

Эта заметка будет с небольшим вопросом. Я понимаю, что Simon P. Jones (автор TH) борется за чистоту и хочет чтобы везде был строгий контроль типов. На эту тему есть хороший пост в блоге GHC: New directions for Template Haskell. Я не всё там понял, но главное, понял, что всем ограничениям (и недоработкам) есть свои причины.

Постановка задачи

Мне захотелось написать с помощью TH следующую вещь, в сущности, очень простую: хочу генерить функции с данным именем и части тела. Даже ещё проще, пусть функции без параметров - по сути просто значение данного типа (тип заранее известен). Для простоты, пусть у нас есть такой тип:

1
data Foo = Bar String

И мы хотим генерить функции (не функции конечно, а объявления) вида:

1
2
name :: Foo
name = Bar content

где name и content - это заранее неизвестные значения. То есть параметры генератора/шаблона.

unfold

Про HaTeX 3 и юникод в коде

(репост из tumblr)

Вступление

Давненько я не заглядывал сюда и не писал ничего содержательного. Но тут в очередной раз есть повод поделиться впечатлениями от новых интересных знаний и к тому же для этого удалось выкроить немного времени.

Итак, я дождался таки выхода в свет 3й версии библиотеки HaTeX - предыдущая версия была аж год назад. И за этот год я периодически писал автору, интересуясь, не собирается ли он что-нибудь делать, поскольку предыдущая версия была хороша только как концепт, но слишком далека от идеала и малопригодна для реального применения (хотя я ей всё таки пользовался и надеюсь ещё отдельно рассказать как именно). Хотел даже сам переделать её, но как всегда не хватало времени.

Я кстати писал в мае о том как и почему мне нравится HaTeX. Так вот пред-релизное известие о новых концепциях в HaTeX-3 очень меня обрадовало. Главный момент (для меня), в том, что теперь есть специальный алгебраический тип LaTeX, с помощью которого конструируются LaTeX-выражения на Haskell’е. Такой подход даёт возможность контролировать валидность получаемых (true-)LaTeX-выражений на выходе.

unfold