The issue is in the transitive compile time dependencies, not the runtime
dependencies.

I don't think we should be encouraging removing the runtime dependencies
when they are explicitly listed in the code as above. When done via
configuration, at least you are not literally listing it.

On Sun, Sep 11, 2022 at 8:59 PM Zach Daniel <[email protected]>
wrote:

> 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 <[email protected]> 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 <[email protected]> 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 <[email protected]>
>>> 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 <[email protected]>
>>>>> 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 [email protected].
>>>>>> 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 [email protected].
>>>> 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 [email protected].
>> 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 [email protected].
> 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
> <https://groups.google.com/d/msgid/elixir-lang-core/l7xp6eut.444ff913-f528-4b88-805a-cac120cdb4d6%40we.are.superhuman.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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4K55GmLJA-SuyJ9WJTPkf1fmfYgQ9rTQqxHOaRb%3DWncSw%40mail.gmail.com.

Reply via email to