Size: a a a

2021 February 28

M

MrFlorius in pro.elixir
Alexey Novoselov
for i <- 0..:erlang.system_info(:atom_count)-1, do: :erlang.binary_to_term(<<131,75,i::24>>)
А как потом понять что они существуют?
источник

AN

Alexey Novoselov in pro.elixir
MrFlorius
А как потом понять что они существуют?
Module.open?(atom) разве что, но тут опять что-то типа require нужен... Вопрос откуда у тебя вдруг могут появляться модули в комйл-тайм? Может проще гвоздями в аттрибут прибить?
источник

AN

Alexey Novoselov in pro.elixir
либо ls посмотреть
источник

V

V in pro.elixir
MrFlorius
Я хочу собрать подмодули модуя в компайл-тайм и положить их в аттрибут
Зачем?
источник

LL

Lama Lover in pro.elixir
MrFlorius
Я хочу собрать подмодули модуя в компайл-тайм и положить их в аттрибут
А какую задачу ты пытаешься решить?
источник

AN

Alexey Novoselov in pro.elixir
V
Зачем?
возможно человек платформу пишет, в которой юзеры могут мышкой экто-схемы добавлять и настраивать связи
источник

LL

Lama Lover in pro.elixir
Alexey Novoselov
возможно человек платформу пишет, в которой юзеры могут мышкой экто-схемы добавлять и настраивать связи
А зачем тут находить все подмодули модуля?
источник

LL

Lama Lover in pro.elixir
Я скажу что любая попытка использовать модули для создания комбинированных сущностей или определения их отношений приведёт к какому-то подобию ооп, что грустно
источник

LL

Lama Lover in pro.elixir
Лучше опираться на композиции функций, чем на кодогенерацию по структуре модулей
источник

LL

Lama Lover in pro.elixir
Это достаточно высокоуровневый совет, но к этому разговору, я думаю, его можно применить
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
require - про загрузку макросов из модуля перед компиляцией. Если нужно просто вызвать функцию одного модуля из другого модуля во время компиляции, то вообще не нужно ни require ни ensure_loaded, mix сам все разрулит. Если это не mix, то сперва бы вызвать $> elixirc my_file.ex
Вообще очень странно, потому что макросы - это же функции модуля, которые выполняются вовремя компиляции. И чтобы их "загрузить" - нужно лишь, скомпилировать модуль другой модуль до его выполнения. Ладно, возможно, я давно не копался в актуальном компайлере - видимо require нужен просто, чтобы макросы всегда explicit-но вызывались.
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Т.е. макро - это функция с именем: MACRO-<macro name>
источник

AN

Alexey Novoselov in pro.elixir
Dmitry Russ (Aleksandrov)
Т.е. макро - это функция с именем: MACRO-<macro name>
разница в доступности из Beam файла
источник

AN

Alexey Novoselov in pro.elixir
макросов там нет
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
разница в доступности из Beam файла
Там они есть
источник

AN

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

DR

Dmitry Russ (Aleksan... in pro.elixir
Alexey Novoselov
в смысле они не вызываются не так, как обычные функции. Поэтому необходим require. Для обычных функций не надо ничего, они будут работать и так
Вызываются они по-другому - да. Но require в данном случае чисто искуственная конструкция для explicit-ности же.
источник

AN

Alexey Novoselov in pro.elixir
да, так и есть
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Вот, к примеру, берём из туториала макро


defmodule Unless do
 defmacro macro_unless(clause, do: expression) do
   quote do
     if(!unquote(clause), do: unquote(expression))
   end
 end
end


Компилируем, получаем:


Unless.module_info
[
 module: Unless,
 exports: [
   __info__: 1,
   "MACRO-macro_unless": 3,
   module_info: 0,
   module_info: 1
 ],
источник

DR

Dmitry Russ (Aleksan... in pro.elixir
Т.е. он та же функция, только с дополнительным аргументом
источник