So all we we do is hold onto the module, and then at runtime we go through the 
list of modules that we should call and call a specific function on them. 
Requiring a runtime dependency for that is causing really slow compile times 
because of transitive dependencies. Maybe there is some consequence I don't 
see, but I removed the runtime dependencies by disabling the lexical tracker 
when expanding the alias, and its been that way for months w/o anyone reporting 
any issues with that implementation. Aside from having to use `warn: false` if 
they use aliases.

To me, its the same as if they gave us, instead of a module, an `atom` that 
referred to application configuration, i.e the adapter pattern. That would work 
without a runtime dependency, so why couldn't this?

On Sun, Sep 11, 2022 at 2:56 PM, José Valim < jose.va...@dashbit.co > wrote:

> 
> Sorry, correction: If, at any moment, you call any function from that
> module at runtime, you must not remove the *runtime* time dependency.
> 
> 
> On Sun, Sep 11, 2022 at 8:55 PM José Valim < jose. valim@ dashbit. co (
> jose.va...@dashbit.co ) > wrote:
> 
> 
>> Why do you want to remove the runtime dependency when, per your
>> description:
>> 
>> 
>> > In Ash Framework, we have declarative ways to construct *runtime* behavior
>> using behaviors.
>> 
>> 
>> Emphasis mine. If, at any moment, you call any function from that module
>> at runtime, you must not remove the compile time dependency.
>> 
>> 
>> On Sun, Sep 11, 2022 at 8:52 PM Zach Daniel < zachary. s. daniel@ gmail. com
>> ( zachary.s.dan...@gmail.com ) > wrote:
>> 
>> 
>>> `expand_literal` removes the compile time dependency, but leaves a runtime
>>> dependency when used inside of a module.
>>> 
>>> What I'm trying to do is remove both the compile time dependency *and* the
>>> runtime dependency, without requiring the use of `warn: false` on aliases.
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> On Sunday, September 11, 2022 at 2:31:42 PM UTC-4 José Valim wrote:
>>> 
>>> 
>>>> Sorry, I don't understand the proposal. You mentioned expand_literal,
>>>> which already removes the compile-time dependency but keeps the remaining
>>>> functionality such as warnings. Can you please expand?
>>>> 
>>>> 
>>>> 
>>>> On Sun, Sep 11, 2022 at 7:57 PM Zach Daniel < zachary.... @ gmail. com >
>>>> wrote:
>>>> 
>>>> 
>>>>> For clarity, the dependency I'm talking about there is the dependency from
>>>>> `MyApp.User` to `MyApp.User.Changes.HashPassword`.
>>>>> On Sunday, September 11, 2022 at 1:55:51 PM UTC-4 Zach Daniel wrote:
>>>>> 
>>>>> 
>>>>>> In Ash Framework, we have declarative ways to construct runtime behavior
>>>>>> using behaviors. So an Ash resource might look like this:
>>>>>> 
>>>>>> 
>>>>>> ```elixir
>>>>>> defmodule MyApp.User do
>>>>>> use Ash.Resource
>>>>>> 
>>>>>> alias MyApp.User.Changes.HashPassword
>>>>>> 
>>>>>> attributes do
>>>>>> uuid_primary_key :id
>>>>>> ....
>>>>>> end
>>>>>> 
>>>>>> actions do
>>>>>> create :register do
>>>>>> change HashPassword
>>>>>> end
>>>>>> end
>>>>>> end
>>>>>> ```
>>>>>> 
>>>>>> However, by default, this would incur a compile time dependency. This
>>>>>> compile time dependency is unnecessary, as we won't call any functions on
>>>>>> this module or use it in any way until runtime.
>>>>>> 
>>>>>> That optimization is well and good, but due to transitive compile time
>>>>>> dependencies, we see some interesting behavior. Something you'd often see
>>>>>> in a change module is things like pattern matching on other resources, or
>>>>>> the resource in question in function heads. Resources are meant to be
>>>>>> introspectable at compile time, and so this runtime dependency on a
>>>>>> change, with a compile time dependency on a resource, incurs a transitive
>>>>>> compile time dependency. This problem multiplies over time, and causes
>>>>>> users to have to do things solely to optimize compile times, like only 
>>>>>> use
>>>>>> map pattern matches instead of struct pattern matches.
>>>>>> 
>>>>>> So what we do is we actually disable the lexical tracker when accepting
>>>>>> certain parts of the DSL. This prevents *any* dependency. Naturally, at
>>>>>> compile time you are no longer safe to call a resource's change module as
>>>>>> changes in that module won't cause recompiles, but that was never a thing
>>>>>> you should have done in the first place so I'm not worried about that.
>>>>>> 
>>>>>> This leads us to the primary issue: disabling the lexical tracker when
>>>>>> expanding aliases also causes warnings about unused aliases, even though
>>>>>> they *are* used. I believe I've brought this issue up before and we were
>>>>>> hoping that the feature introduced in 1.14 for `defimpl` would help, but
>>>>>> that only helps prevent compile time issues, which is something I had
>>>>>> already solved for in the same way it was solved for 1.14. I've laid it
>>>>>> all out to help clarify exactly *why* I need it so perhaps someone can
>>>>>> point me in a better direction.
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> The simplest thing that could help:
>>>>>> 
>>>>>> A way to tell the lexical tracker that an alias has just been referenced
>>>>>> without inducing any kind of compile or runtime dependency. The idea is 
>>>>>> to
>>>>>> just prevent it from warning about the alias.
>>>>>> 
>>>>>> I'm open to other solutions as well.
>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> 
>>>> 
>>>>> --
>>>>> You received this message because you are subscribed to the Google Groups
>>>>> "elixir-lang-core" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send an
>>>>> email to elixir-lang-co... @ googlegroups. com.
>>>>> To view this discussion on the web visit https:/ / groups. google. com/ d/
>>>>> msgid/ elixir-lang-core/ 
>>>>> 54627973-7b74-47d7-9e35-4270621e6c91n%40googlegroups.
>>>>> com (
>>>>> https://groups.google.com/d/msgid/elixir-lang-core/54627973-7b74-47d7-9e35-4270621e6c91n%40googlegroups.com?utm_medium=email&utm_source=footer
>>>>> ).
>>>>> 
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> --
>>> You received this message because you are subscribed to the Google Groups
>>> "elixir-lang-core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an
>>> email to elixir-lang-core+unsubscribe@ googlegroups. com (
>>> elixir-lang-core+unsubscr...@googlegroups.com ).
>>> To view this discussion on the web visit https:/ / groups. google. com/ d/
>>> msgid/ elixir-lang-core/ 
>>> 22887a7e-a1b6-4ccc-98bf-69a5ad3551a5n%40googlegroups.
>>> com (
>>> https://groups.google.com/d/msgid/elixir-lang-core/22887a7e-a1b6-4ccc-98bf-69a5ad3551a5n%40googlegroups.com?utm_medium=email&utm_source=footer
>>> ).
>>> 
>> 
>> 
>> 
> 
> 
> 
> 
> 
> --
> You received this message because you are subscribed to the Google Groups
> "elixir-lang-core" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to elixir-lang-core+unsubscribe@ googlegroups. com (
> elixir-lang-core+unsubscr...@googlegroups.com ).
> To view this discussion on the web visit https:/ / groups. google. com/ d/
> msgid/ elixir-lang-core/ 
> CAGnRm4%2BVkL%2B1V7LTDVyzhCqcNWrmHFPoWx2Fp916Ur%2ByL%2BiVBA%40mail.
> gmail. com (
> https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BVkL%2B1V7LTDVyzhCqcNWrmHFPoWx2Fp916Ur%2ByL%2BiVBA%40mail.gmail.com?utm_medium=email&utm_source=footer
> ).
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/l7xp6eut.444ff913-f528-4b88-805a-cac120cdb4d6%40we.are.superhuman.com.

Reply via email to