[ANN][Erlang] Erlang Macro Processor (parse_transform)
От: Mamut Швеция http://dmitriid.com
Дата: 23.04.07 08:49
Оценка: 9 (1)
Описание создания версии 1: http://chlorophil.blogspot.com/search/label/emp1
Описание создания версии 2: http://chlorophil.blogspot.com/search/label/emp2

В общем, что это такое я не разбирался Похоже на попытку изобрести Лисп средствами Эрланга. Но зато описывается parse_transform


dmitriid.comGitHubLinkedIn
Re: [ANN][Erlang] Erlang Macro Processor (parse_transform)
От: Lazy Cjow Rhrr Россия lj://_lcr_
Дата: 23.04.07 13:03
Оценка: 1 (1) :)
Mamut,

M>Описание создания версии 1: http://chlorophil.blogspot.com/search/label/emp1

M>Описание создания версии 2: http://chlorophil.blogspot.com/search/label/emp2

M>В общем, что это такое я не разбирался Похоже на попытку изобрести Лисп средствами Эрланга. Но зато описывается parse_transform


Даа, наворотить такое... Просто .

Хотя всё это имело бы великий смысл, если бы не запятые в синтаксисе списков/туплов в Эрланге, которые будут загромождать запись в dsl-ях. С этим столкнулся Ярив несколько раньше при создании "escaped SQL". А так да, всё что нам нужно, это (по-лисповски)
backquote`()
unquote,
quote'
splicing,@
ну и разумеется синтаксис для определения макроса.

(defmacro do-primes (var-and-range &;rest body)
  (let ((var (first var-and-range))
        (start (second var-and-range))
        (end (third var-and-range)))
    `(do ((,var (next-prime ,start) (next-prime (1+ ,var))))
         ((>; ,var ,end))
       ,@body)))

Представляешь как это на Эрланге будет выглядеть?
'defmacro###do_primes'(var_and_range, body) ->
    {let, {{var, {first, var_and_range}},
                {start, {second, var_and_range}},
                {end, {third, var_and_range}}},
                backquote({do, {{unquote(var), {next-prime, unquote(start)}, {next-prime, (unquote(var) + 1}}}}},
                {unquote(var) > unquote(end)}),
            splice(body)}}}.

(не знаю, соотсветствуют ли скобки)
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.