In this case you pass lexical_tracker: nil indeed, that's what we do for defimpl for now, although it is a private API for now.
On Mon, Jul 11, 2022 at 7:08 PM Zach Daniel <zachary.s.dan...@gmail.com> wrote: > So I tried out doing the same thing that you are currently doing in > `expand_literal/2` and I've hit a snag. > > In the Ash DSL, there are some module references where we don't want to > incur a runtime dependency *or* a compile time dependency. From what I can > tell, the pattern of `expand_literal/2` still incurs runtime dependencies. > In Ash, we have this code: > > ``` > def expand_alias(ast, %Macro.Env{} = env) do > Macro.prewalk(ast, fn > {:__aliases__, _, _} = node -> > Macro.expand(node, %{env | function: {:__ash_placeholder__, 0}}) > > other -> > other > end) > end > > def expand_alias_no_require(ast, %Macro.Env{} = env) do > Macro.prewalk(ast, fn > {:__aliases__, _, _} = node -> > Macro.expand(node, %{env | lexical_tracker: nil}) > > other -> > other > end) > end > ``` > > which models the difference between how we are currently doing things. The > primary issue here is that the things using `expand_alias_no_require/2` > currently are marked as unused alias, and from what I can tell > `expand_literal/2` doesn't solve for that issue. > On Monday, May 9, 2022 at 4:33:58 PM UTC-4 Zach Daniel wrote: > >> Awesome, thanks! >> >> >> On Mon, May 09, 2022 at 4:10 PM, José Valim <jose....@dashbit.co> wrote: >> >>> It should be added when I fix this: >>> https://github.com/elixir-lang/elixir/issues/11706 :) >>> >>> On Mon, May 9, 2022 at 8:02 PM Zach Daniel <zachary.s.dan...@gmail.com> >>> wrote: >>> >> That sounds perfect! Is there any place that I can see what that public >>>> API will look like? I totally understand on being careful in that regard. >>>> Since Ash DSLs are more like static configuration, there are a few places >>>> where this is acceptable, but we don't use it for every (or even most) of >>>> the places where a module name might be. >>>> >>>> On Monday, May 9, 2022 at 2:00:11 PM UTC-4 José Valim wrote: >>>> >>>>> Btw, we will also have a public API on Elixir v1.14 for expanding >>>>> literals, so the problem shall disappear altogether. However, you must be >>>>> extremely careful: this should only be used if you indeed don't use it at >>>>> compile time. >>>>> >>>>> On Mon, May 9, 2022 at 7:56 PM Zach Daniel <zachary....@gmail.com> >>>>> wrote: >>>>> >>>>>> Also, I forgot to mention, it was @icecreamcohen on discord who had >>>>>> the idea that redefining alias may work (although they didn't really >>>>>> condone it), don't want to take credit for anyone elses ideas though. >>>>>> On Monday, May 9, 2022 at 1:53:50 PM UTC-4 Zach Daniel wrote: >>>>>> >>>>>>> This is something coming from a compile time optimization that Ash >>>>>>> Framework does. >>>>>>> >>>>>>> In an Ash resource there is something called a change its basically >>>>>>> like a plug but it operates on an Ash.Changeset >>>>>>> >>>>>>> So you might see something like this: >>>>>>> ``` >>>>>>> # in the resource >>>>>>> actions do >>>>>>> create :create_with_employee do >>>>>>> change MyApp.CreateEmployee >>>>>>> end >>>>>>> end >>>>>>> # the change module >>>>>>> defmodule MyApp.CreateEmployee do >>>>>>> use Ash.Resource.Change >>>>>>> >>>>>>> def change(changeset, _opts, _context) do >>>>>>> Ash.Changeset.after_action(changeset, fn _changeset, result -> >>>>>>> MyApp.Employee.create!(result.stuff, ...) >>>>>>> end) >>>>>>> end >>>>>>> end >>>>>>> >>>>>>> Now, the change itself, when it comes to the resource, is simple >>>>>>> static configuration. It cannot affect the compilation of the resource >>>>>>> nor >>>>>>> should any thing doing metaprogramming at compile time leverage the >>>>>>> internals of that change >>>>>>> >>>>>>> Something that changes do often is refer to other related resources, >>>>>>> like in this example case. So we drastically increase the surface area >>>>>>> for >>>>>>> transitive compile time dependencies >>>>>>> >>>>>>> Because a runtime dependency in one link becomes a compile time >>>>>>> dependency when chained down the road. I.e I depend on the source >>>>>>> resource, >>>>>>> call it Post at compile time, and Post depends on Employee now at >>>>>>> runtime, >>>>>>> so I now depend on Employee at compile time. >>>>>>> >>>>>>> So to help people with their compile times, I've added some >>>>>>> metaprogramming magic that does the following (only in very specific >>>>>>> places >>>>>>> for specific options) Macro.expand(node, %{env | lexical_tracker: nil}) >>>>>>> and >>>>>>> it works, no more unnecessary dependency. however, if you do this: >>>>>>> ``` >>>>>>> alias MyApp.CreateEmployee >>>>>>> create :name do >>>>>>> change CreateEmployee >>>>>>> end >>>>>>> ``` >>>>>>> it yells at you for not using the alias, because I just disabled the >>>>>>> thing that would inform the compiler that the alias was used >>>>>>> >>>>>>> I don't necessarily want to add back in those unnecessary compile >>>>>>> time increases, so I'm looking for a way to detect that an alias had >>>>>>> been >>>>>>> used in these cases, and produce a compiler warning if you didn't add >>>>>>> warn: >>>>>>> false to the alias, that way you don't get a confusing "alias not used" >>>>>>> error, you get (well, I guess you get both) an explanation of why the >>>>>>> alias >>>>>>> wasn't used and instructions to add warn: false to fix it. >>>>>>> >>>>>>> >>>>>>> The options I have so far: >>>>>>> >>>>>>> 1. redefine `alias` and default to `warn: false` >>>>>>> 2. redefine `alias` and track which ones have `warn: false` and >>>>>>> print a warning if its used in one of these instances, so they can add >>>>>>> it >>>>>>> 3. if I detect that an alias is used, raise an error at compile time >>>>>>> and say that aliases aren't supported here >>>>>>> 4. get something in elixir core that allows explicit control to add >>>>>>> something to an explicit list of "used aliases" >>>>>>> >>>>>>> Looking at the code for the lexical_tracker, it could be as simple >>>>>>> as tracking a separate list of explicitly provided modules, or it could >>>>>>> be >>>>>>> a different mode of reference, i.e `:compile` `:runtime` or `:ignore`, >>>>>>> that >>>>>>> kind of thing. >>>>>>> >>>>>>> Also, if there is another way to accomplish the goal here I'm open >>>>>>> to suggestions. >>>>>>> >>>>>>> Thanks! >>>>>>> >>>>>> -- >>>>>> >>>>> 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/f8e4ed44-f3a8-41cc-b82c-f6175ea461fdn%40googlegroups.com >>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/f8e4ed44-f3a8-41cc-b82c-f6175ea461fdn%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/a249ae72-fc35-4ff2-be69-567aa53ceb87n%40googlegroups.com >>>> <https://groups.google.com/d/msgid/elixir-lang-core/a249ae72-fc35-4ff2-be69-567aa53ceb87n%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/CAGnRm4Lue_uJZdyChHFL_crrW6PVARBFUzm%3DvS5mmPGSSTFi9A%40mail.gmail.com >>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4Lue_uJZdyChHFL_crrW6PVARBFUzm%3DvS5mmPGSSTFi9A%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/136de6d8-f330-4135-8549-3ad70767a0efn%40googlegroups.com > <https://groups.google.com/d/msgid/elixir-lang-core/136de6d8-f330-4135-8549-3ad70767a0efn%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/CAGnRm4JFV6XO-3QsYYTCyFDSCUx%2BZvk8WNWYF3-HTE-ksnuC3Q%40mail.gmail.com.