Size: a a a

2020 September 02

LL

Lama Lover in pro.elixir
Alex Bubnov
Before_compile возвращает дополнительный ast, не рерайт старого, да?
Да, старый никак не переписать в before_compile

Если хочется переписывать старый, то нужно менять модуль в отдельном компиляторе или в after_compile. Что очень плохая практика
источник

AB

Alex Bubnov in pro.elixir
Владислав
Согласен. До сегодняшнего дня аттрибуты такими и были. Т.е. ты знаешь, что в рантайме ты их не поменяешь, поэтому это константы и с этим ничего не поделаешь.

Однако, в текущем проекте написано большое кол-во кода, где юзается аттрибут как константа. Теперь понадобилось чтобы данный атрибут изменялся в зависимости от наличия тех или иных модулей.
Не нужно это делать в компайл-тайме
источник

В

Владислав in pro.elixir
Lama Lover
"Аттрибут изменялся от наличия тех или иных модулей"

Я помню кто-то уже решал эту задачу в чатике. Решается это так: вы ручками пишете конкретную константу. Потому что если вы не знаете сколько у вас модулей будет в проекте, то где-то у вас проблема
Моя проблема - лень)
источник

AD

Anastasiya Dyachenko in pro.elixir
Владислав
Подскажите, как его правильно использовать, пожалуйста)
Я пробовал вот так
```
defmodule Foo do
@before_compile Baz.FooManager
@some_bar [10, 11]
def call_some_bar, do: @some_bar
end
defmodule Baz.Foomanager do
defmacro __before_compile___(env) do
value = Module.get_attribute(env.module, :some_bar)
Module.register_attribute(env.module, :some_bar, accumulate: true)
Module.put_attribute(env.module, :some_bar, [9 | value])
end
end
iex> Foo.call_some_bar
#=> [10, 11]
```
конкретно этот пример можно сделать прям как там описано в примере

defmodule Foo do
 Module.register_attribute(Foo, :some_bar, accumulate: true)
 @some_bar 9
 @some_bar 10
 @some_bar 11
end
источник

LL

Lama Lover in pro.elixir
Anastasiya Dyachenko
конкретно этот пример можно сделать прям как там описано в примере

defmodule Foo do
 Module.register_attribute(Foo, :some_bar, accumulate: true)
 @some_bar 9
 @some_bar 10
 @some_bar 11
end
Не, так не получится
источник

AB

Alex Bubnov in pro.elixir
Владислав
Согласен. До сегодняшнего дня аттрибуты такими и были. Т.е. ты знаешь, что в рантайме ты их не поменяешь, поэтому это константы и с этим ничего не поделаешь.

Однако, в текущем проекте написано большое кол-во кода, где юзается аттрибут как константа. Теперь понадобилось чтобы данный атрибут изменялся в зависимости от наличия тех или иных модулей.
Вытаскивайте в функцию, разбирайтесь в рантайме
источник

AD

Anastasiya Dyachenko in pro.elixir
Lama Lover
Не, так не получится
что не получится?
источник

LL

Lama Lover in pro.elixir
Anastasiya Dyachenko
конкретно этот пример можно сделать прям как там описано в примере

defmodule Foo do
 Module.register_attribute(Foo, :some_bar, accumulate: true)
 @some_bar 9
 @some_bar 10
 @some_bar 11
end
Смотри
Если после @some_bar 9 написать def f(), do: @some_bar
Эта функция всегда будет возвращать [9]
источник

В

Владислав in pro.elixir
Lama Lover
"Аттрибут изменялся от наличия тех или иных модулей"

Я помню кто-то уже решал эту задачу в чатике. Решается это так: вы ручками пишете конкретную константу. Потому что если вы не знаете сколько у вас модулей будет в проекте, то где-то у вас проблема
Не хотел вот я изменять старый аттрибут ручками) И поэтому вот так)
источник

В

Владислав in pro.elixir
Alex Bubnov
Вытаскивайте в функцию, разбирайтесь в рантайме
так и сделал)
источник

AD

Anastasiya Dyachenko in pro.elixir
Lama Lover
Смотри
Если после @some_bar 9 написать def f(), do: @some_bar
Эта функция всегда будет возвращать [9]
я выше писала про параметр accumulate: true, сначала попробуй запустить, а потом утверждай так уверенно)
источник

B

Bogdan in pro.elixir
Vyacheslav Konovalov
я вот забыл совсем, что for это как фильтр, и если паттерн не матчится, то элемент пропускается
И чтобы nested Enum.map не писать он отлично подходит.

for x <- 0..5, y <- 1..2 do
   {x, y}
 end
источник

LL

Lama Lover in pro.elixir
Anastasiya Dyachenko
я выше писала про параметр accumulate: true, сначала попробуй запустить, а потом утверждай так уверенно)
Я уверен на все 100%
источник

VK

Vyacheslav Konovalov in pro.elixir
Bogdan
И чтобы nested Enum.map не писать он отлично подходит.

for x <- 0..5, y <- 1..2 do
   {x, y}
 end
+
источник

AD

Anastasiya Dyachenko in pro.elixir
Lama Lover
Я уверен на все 100%
ну запустить то попробуй для приличия))
источник

AD

Anastasiya Dyachenko in pro.elixir
источник

LL

Lama Lover in pro.elixir
И для тебя специально проверил
источник

AD

Anastasiya Dyachenko in pro.elixir
Lama Lover
И для тебя специально проверил
у тебя код отличается, ествественно не работает)
источник

LL

Lama Lover in pro.elixir
Anastasiya Dyachenko
у тебя код отличается, ествественно не работает)
источник

AD

Anastasiya Dyachenko in pro.elixir
ну так а откуда задача что функция должна быть до определения всех аттрибутов?
источник