2012-05-12

metaclass: (Default)
2012-05-12 01:14 am

"Всего полдня как русский..."

Пришлось разобраться как и сделать собственную либу на Clojure.
Слишком много общих функций накопилось, типа "convert-maps-sequence-to-kosher-operden-text-table", не клонировать же их. И это за 3 месяца всего.
В дельфи я просто ссылался на юнит в папочке рядом, а тут жыж неймспейсы, совпадающие с папками (вот уж решение из жабы, прости господи).
Еще бы понять, как это кошерным образом из lein groupId и artifactId назначить, а то получается что-то вроде [operden-nii-utils/operden-nii-utils "0.0.1"], бесит.
metaclass: (Default)
2012-05-12 03:33 am

clojure и gnuplot

Модифицирую это чюдо под свои нужды: https://bitbucket.org/vshender/clojure-gnuplot

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

В итоге оказывается, что reader-macro для unquote вида ~x - это экземпляр класса clojure.lang.Cons (а этот класс используется в мультиметоде для диспетчеризации), причем узнал я это, пропустив значение через не менее мрачный макрос, вставляющий вызов log4j для произвольного значения, пропущенного (опционально, дичайший оверхед) через clojure.pprint.
И первым значением в этом Cons выступает unbound qualified symbol clojure.core/unquote. То что unquote - логично, а вот unbound и qualified - загадка.

Ехал макрос через макрос, видит макрос в макрос макрос, сунул макрос макрос в макрос, макрос макрос макрос макрос. Примерно так это и выглядит. Классическая лисповщина - использовать лисповые списки вместо строк, потому что так читабельнее и генерить макросами из них строки. Прочел этот прием в Land of Lisp чуть ли не пару дней назад, уже применил за сегодня несколько раз.

А вот, тащемта и картиночка. Это, например, график модуля АЧХ цифрового IIR-фильтра, который cчитает разность между входным сигналом и exponential moving average от этого же сигнала(оно же - leaky integrator, имеет схему вида y[n]=1/2(x[n]+y[n-1]). Для того, чтобы это посчитать, пришлось еще и прикрутить clojure.algo.generic и портировать устаревшую основанную на нем либу complex-numbers, т.к. фильтры оные рассчитаются в комплексной плоскости с использованием z-преобразования).

PS: на кложуре дичайше удобно писать и запускать юнит-тесты - быстрый запуск и автоматическая самокомпиляция на ходу по мере надобности приближают ее по удобству к антипаттернам дельфи "писание через точечьку" и "сделал одну строку-сбилдил-запустил". Все остальные языки собираются и запускаются так долго, что имеет смысл сначала сделать кучу всего, затем один раз собрать, затем исправить сборку и только потом запускать.