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.s.dan...@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-core+unsubscr...@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/CAGnRm4J0YOw5J4xzsZHMF4oWpj%2BNG3Thj6TjpK8zm9YMYw53MQ%40mail.gmail.com.