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.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.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+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+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.

Reply via email to