Size: a a a

2020 September 02

В

Владислав in pro.elixir
Źmićer Rubinštejn
Ну потому что ты сперва модифицируешь атрибут, а потом его пересоздаешь
т.е. сначала идет before_compile, а потом уже при компиляции аттрибут пересоздается в самом модуле? Или я путаю?
источник

VK

Vyacheslav Konovalov in pro.elixir
comprehensions vs Enum.map
как выбрать? или разницы нет?
источник

AL

Anton Lapshin in pro.elixir
зачем вообще может быть нужно в рантайме менять атрибуты модуля? мне кажется (я могу быть не прав, но есть ощущение), что если до таких мыслей доходит, значит, куда-то не туда плывёшь совсем
источник

DS

Dmitry Shpagin in pro.elixir
я такие штуки пытался делать, когда еще из ООП не перестроился
источник

DS

Dmitry Shpagin in pro.elixir
Сейчас нигде на наших проектах в этом необходимости нет, тоже не могу представить, когда это нужно
источник

AB

Alex Bubnov in pro.elixir
Anton Lapshin
зачем вообще может быть нужно в рантайме менять атрибуты модуля? мне кажется (я могу быть не прав, но есть ощущение), что если до таких мыслей доходит, значит, куда-то не туда плывёшь совсем
Не в рантайме, а в компайл-тайме.
И так работает, например, dsl в Phoenix.Router
источник

В

Владислав in pro.elixir
Всё вы правильно говорите. Дикость. И даже сам язык против такой ереси) В итоге переделал атрибут в функцию и переопределил её макросе.
источник

AD

Anastasiya Dyachenko in pro.elixir
Если вдруг кому-то ещё интересно как это можно было сделать, то можно использовать register_attribute с параметром accumulate: true https://hexdocs.pm/elixir/Module.html#register_attribute/3. Но лучше конечно когда атрибут явно определен и явно дополнен
источник

В

Владислав in pro.elixir
Anastasiya Dyachenko
Если вдруг кому-то ещё интересно как это можно было сделать, то можно использовать register_attribute с параметром accumulate: true https://hexdocs.pm/elixir/Module.html#register_attribute/3. Но лучше конечно когда атрибут явно определен и явно дополнен
Я так пробовал тоже) Не сработало.
источник

AD

Anastasiya Dyachenko in pro.elixir
Владислав
Я так пробовал тоже) Не сработало.
Ну значит неправильно использовали, что ещё тут сказать)
источник

В

Владислав in pro.elixir
Anastasiya Dyachenko
Ну значит неправильно использовали, что ещё тут сказать)
Подскажите, как его правильно использовать, пожалуйста)
Я пробовал вот так
```
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]
```
источник

LL

Lama Lover in pro.elixir
Владислав
Предлагаете как-то так:
defmodule Baz.Foomanager do
defmacro __before_compile___(env) do
value = Module.get_attribute(env.module, :some_bar)
Module.put_attribute(env.module, :some_bar, [9 | value])
some_calling = quote do
def call_some_bar, do: @some_bar
end
Module.eval_quoted(env.module, some_calling)
end

?
Суть в том что аттрибуты подставляются до __before_compile__. Можно даже сказать что он подставляется сразу во время его появления в AST (только если кусок кода не в quote)

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

В

Владислав 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.delete_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]
источник

LL

Lama Lover 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.delete_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]
У тебя какие-то проблемы с табуляцией в телеге, кстати
источник

В

Владислав in pro.elixir
Lama Lover
У тебя какие-то проблемы с табуляцией в телеге, кстати
Я её не делаю)))) извините, если это грубо с моей стороны)
источник

LL

Lama Lover in pro.elixir
Владислав
Я её не делаю)))) извините, если это грубо с моей стороны)
Даже в коде???
источник

В

Владислав in pro.elixir
Lama Lover
Даже в коде???
В коде есть)
источник

LL

Lama Lover in pro.elixir
хм
источник

МБ

Максим Барулин... in pro.elixir
https://www.techempower.com/benchmarks/
H2o на 6 строке а феникс на 237...
источник

SM

Sergei Maximov in pro.elixir
Lama Lover
Даже в коде???
А зачем самому в коде её делать? Пусть редактор и форматтер делают.
источник