Size: a a a

2021 May 17

a

atanych in pro.elixir
но выглядит это вот так
источник

A ß in pro.elixir
вообще обычно фрагменты выносят в (приватные) макросы
источник

a

atanych in pro.elixir
можно пример?
источник

A ß in pro.elixir
@yunmikun ты любишь такое делать, можешь пример подкинуть?
источник

АЮ

Андрей Юнми... in pro.elixir
defmacro true_cost(a, b, c, d, e) do
 quote do
   fragment("TRUE_COST(?, ?, ?, ?, ?)", unquote(a), unquote(b), unquote(c), unquote(d), unquote(e))
 end
end


Это если хочется сохранить семантику функции из sql.
источник

АЮ

Андрей Юнми... in pro.elixir
Можно вынести в опшены и дать имена.
источник

АЮ

Андрей Юнми... in pro.elixir
Как-то так:

defmacro true_cost(opts_ast) do
 {opts, _} =
   Code.eval_quoted(opts_ast, Macro.Env.vars(__CALLER__),
     file: __CALLER__.file,
     line: __CALLER__.line
   )

 {a, opts} = Keyword.pop!(opts, :a)
 {b, opts} = Keyword.pop!(opts, :b)
 {c, opts} = Keyword.pop!(opts, :c)
 {d, opts} = Keyword.pop!(opts, :d)
 {e, opts} = Keyword.pop!(opts, :e)

 quote do
   fragment("TRUE_COST(?, ?, ?, ?, ?)", unquote(a), unquote(b), unquote(c), unquote(d), unquote(e))
 end
end
источник

a

atanych in pro.elixir
так всеравно остается вопрос, как в true_cost прокинуть результат из FEE_BASED

или на верху это будет выглядить например?
true_cost(a, b, c, free_based_loan(d, e), f)
источник

АЮ

Андрей Юнми... in pro.elixir
Тогда ещё

defmacro free_based_loan(d, e) do
 quote do
   fragment("FREE_BASED_LOAN(?, ?)", unquote(d), unquote(e))
 end
end


И вызов будет выглядеть так, как ты написал.
источник

АЮ

Андрей Юнми... in pro.elixir
Только с макросами есть некоторые подводные: если не хочется выносить в отдельный модуль, откуда ты их будешь импортить, то делаешь defmacrop (приватный макрос, по аналогии с defp) и объявляешь его до использования (т.е. выше функции, где его применяешь).
источник

a

atanych in pro.elixir
спасибо. попробую, только я уже не уверен, что первый вариант был так уж плох 😁
источник

АЮ

Андрей Юнми... in pro.elixir
Code.eval_quoted/3 нужен для того, чтобы он ast нормально у тебя в опциях обрабатывал.
источник

АЮ

Андрей Юнми... in pro.elixir
Тут просто у оригинальной функции (TRUE_COST) слишком много параметров.
источник

АЮ

Андрей Юнми... in pro.elixir
Тут зависит от того, что важнее. Если сама функция меняться не будет, то можно её вызов инкапсулировать в макрос с более удобным интерфейсом.

Если она ещё может меняться, то тогда всё становится немного сложнее, потому что надо быть уверенным, что кто-то другой поймёт, как это работает.
источник

a

atanych in pro.elixir
ну да, здесь вопрос читаемости, первый вариант ужасен, так как функция в функции, но это посути один лайн в коде

вобщем спасибо за вариант Б, хорошая альтернатива
источник

VV

Vitaly Vasiliev in pro.elixir
а как в эликсире сортировка происходит массивов, например,
цена\название товара? или как это в постгре загонять?
источник

LL

Lama Lover in pro.elixir
Если я не ошибаюсь, для такой сортировки там bif на сишечке
И в эликсире нет массивов: тупплы и списки есть
источник

LL

Lama Lover in pro.elixir
Enum.sort(), кароче
источник

VV

Vitaly Vasiliev in pro.elixir
спасибо, посмотрю доки сейчас
источник

VV

Vitaly Vasiliev in pro.elixir
то есть распарсить ту же xls с интеграцией склад\вебсайт  не получится?
источник