LINUX.ORG.RU

[Erlang] макросы, замыкания

 


0

0

Возникла проблема с использованием макроса в Erlang
пример кода
-define(Test(Local1),
fun(Local2)->
Res=Local1+Local2,
Res
end
).

test_lambda()->
?Test(1)(2).

При вставке его в код, создается замыкание на контекст конкретной функции, тоесть есть вызвать его так:

test_lambda()->
Res=6,
?Test(1)(2).

то будет выпадать ошибка потому что не может выполнить patern matching
6=3, можно ли как-либо запретить создавать замыкание? или определить Res как локальную переменную для макроса, параметры макроса определяются как локальные, тоесть если вызвать так

test_lambda()->
Local1=1,Local2=5,
?Test(1)(2).

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

anonymous

и не т ли средств для отлова подобных ситуаций, или прийдется вручную контролировать имена переменных функций и макросов?

anonymous
()
Ответ на: комментарий от anonymous

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

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

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

anonymous
()
Ответ на: комментарий от anonymous

Да, тебе будет удобно... а вот тот, кто через Nое количество времени
будет потом разбираться с твоим кодом... он не раз тебя помянет
плохим словом :)

вот несколько правил, которые "завещают" отцы Erlang`а:

1) никогда не делать import (за это, по словам Lennart`а Ohman`а,
надо сразу увольнять :))
2) инклудить исключительно различные дефайны, и не дай господи в
заинклудином файле объявление как-нить функции (последствия: смотреть
первый пунк :))
3) -define использовать для константных значений, и отладочных
функций, типа
-define(TRACE(String),
io:format("blablabla ~p blablabla~n", [String])).

и тому подобное... и я думаю вариант с замыканиями их, оцов, не сильно
бы вдохновил :))

Cy6erBr4in ★★★
()
Ответ на: комментарий от Cy6erBr4in

а больше нечего высказывать:)на счет слабости макросов ты прав, хотя помню еще в masm есть указание локальных переменных макроса. Вобщем если сильно хочется создавай в нем лямбда функцию, тогда переменные которые объявлены не вылезут в ненужную область видимости, ну а замукание на конекст.. только следить чтобы не пересекались внешние и внутренние переменные. А тебя заинтересовали макросы эрланга?

anonymous
()
Ответ на: комментарий от anonymous

> а больше нечего высказывать:)

Да просто хотелось услышать еще хоть какие-то мнения...

> А тебя заинтересовали макросы эрланга?

да как сказать... с одной стороны меня тут не чему заинтересовать, потому что они в Erlang тупы как пробка... а с другой стороны в Erlang меня сейчас интересует все :) работа у меня такая %)

Cy6erBr4in ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.