metaclass (metaclass) wrote,
metaclass
metaclass

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: на кложуре дичайше удобно писать и запускать юнит-тесты - быстрый запуск и автоматическая самокомпиляция на ходу по мере надобности приближают ее по удобству к антипаттернам дельфи "писание через точечьку" и "сделал одну строку-сбилдил-запустил". Все остальные языки собираются и запускаются так долго, что имеет смысл сначала сделать кучу всего, затем один раз собрать, затем исправить сборку и только потом запускать.
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 10 comments