Size: a a a

2021 February 28

AN

Alexey Novoselov in pro.elixir
Dmitry Russ (Aleksandrov)
Т.е. он та же функция, только с дополнительным аргументом
ну так сама BEAM не поймет как его вызвать, нужен компилятор эликсира, поэтому дается подсказка через require
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
ну так сама BEAM не поймет как его вызвать, нужен компилятор эликсира, поэтому дается подсказка через require
Elixir зато прекрасно вовремя компиляции это понимает - и ему подсказка не нужна.
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
ну так сама BEAM не поймет как его вызвать, нужен компилятор эликсира, поэтому дается подсказка через require
** (CompileError) iex:3: you must require Unless before invoking the macro Unless.macro_unless/2
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Т.е. он прекрасно без require-я знает, что нужно делать. Если бы он не знал и ему нужна бы была подсказка - он сказал бы - такой функции не существует.
источник

AN

Alexey Novoselov in pro.elixir
Dmitry Russ (Aleksandrov)
Elixir зато прекрасно вовремя компиляции это понимает - и ему подсказка не нужна.
а как он поймет что ему нужно подставить результат работы макроса в аст или получить результат выполнения? в данном случае он получает результат выполнения макроса, видит что там AST и валит ошибку. Автоматически разруливать такие ситиации это Rails-way, потом не разберешь, почему оно скомпилировалось и не работает
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
а как он поймет что ему нужно подставить результат работы макроса в аст или получить результат выполнения? в данном случае он получает результат выполнения макроса, видит что там AST и валит ошибку. Автоматически разруливать такие ситиации это Rails-way, потом не разберешь, почему оно скомпилировалось и не работает
Он вызывает её как функцию и видит, что такой функции нет и потом смотрит - еесть ли такой макрос и говорит - есть такой макрос, но Вы забыли require.
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Т.е. он прекрасно знает - фукнция это или макрос.
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
а как он поймет что ему нужно подставить результат работы макроса в аст или получить результат выполнения? в данном случае он получает результат выполнения макроса, видит что там AST и валит ошибку. Автоматически разруливать такие ситиации это Rails-way, потом не разберешь, почему оно скомпилировалось и не работает
А попробуй скомпилировать модуль, который имеет и функцию и макрос с одним и тем же именем, то получишь:


** (CompileError) iex:14: def macro_unless/2 already defined as defmacro in iex:8
   iex:14: (module)
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
а как он поймет что ему нужно подставить результат работы макроса в аст или получить результат выполнения? в данном случае он получает результат выполнения макроса, видит что там AST и валит ошибку. Автоматически разруливать такие ситиации это Rails-way, потом не разберешь, почему оно скомпилировалось и не работает
Так что он не видит, AST там или нет - а видит по тому, как определено в модуле - функция это или макрос. И ему никакой require не нужен, чтобы отделить одно от другого.
источник

AN

Alexey Novoselov in pro.elixir
Dmitry Russ (Aleksandrov)
Так что он не видит, AST там или нет - а видит по тому, как определено в модуле - функция это или макрос. И ему никакой require не нужен, чтобы отделить одно от другого.
ну а если ты свой макрос if сделаешь, как быть?
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
ну а если ты свой макрос if сделаешь, как быть?
А что меняется?
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Вообще ничего
источник

AN

Alexey Novoselov in pro.elixir
мб просто, чтобы ничего не вставлять в АSТ, если вызовов не было
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Раньше - в более ранних версиях Elixir-а (5-6 летней давности) require нужен был, чтобы указать какой модуль скомпилировать, прежде чем вызывать функции из него - т.е. компилятор не был таким умным и просто крешился, когда вызывал функции из одного файла вовремя компиляции.

Лет 6 тому назад я использовал require - чтобы указать - для выполнения этого кода - нужен скомпилированный модуль X. После того, как компилятор научился сам зависимости находить - require остался как explicit-ное указание откуда брать макросы... Но я не вижу никаких препятсвий в том, что и без require-а он разрулит макросы где и как нужно сам.
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
мб просто, чтобы ничего не вставлять в АSТ, если вызовов не было
А он же и так ничего не вставляет в AST если не вызывается - макрос - это функция, которая выполняется в compile-time и на вход и выход получает AST.
источник

AN

Alexey Novoselov in pro.elixir
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Ну, это не объясняет ничего. Пока ты не вызываешь Logger.some_macro - в модуле этого нет.
источник

AN

Alexey Novoselov in pro.elixir
Dmitry Russ (Aleksandrov)
Ну, это не объясняет ничего. Пока ты не вызываешь Logger.some_macro - в модуле этого нет.
с разным log-level либо вызывается и будет noop везде для debug в проде, либо вообще нет ничего. И метаданные номер строки вызова получить
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
с разным log-level либо вызывается и будет noop везде для debug в проде, либо вообще нет ничего. И метаданные номер строки вызова получить
Да, но это всё compile мог бы сделать и без require 🙂
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Это объясняет - как это сейчас работает, а не почему это так.
источник