I think I like the App.defmodule more than the other solutions. It is more focused on the area of concern and doesn't need to be a new part of Elixir.
Amos King Owner Binary Noggin http://binarynoggin.com #business http://thisagilelife.com #podcast ======================================================= I welcome VSRE emails. Learn more at http://vsre.info/ ======================================================= On Fri, Dec 2, 2016 at 4:48 PM, Chris McCord <ch...@chrismccord.com> wrote: > The defmodule macro is also something `use Application` could inject for > us, i.e.: > > defmodule Phoenix do > use Application, alias: Phoenix > > end > > > On Dec 2, 2016, at 5:05 PM, Chris McCord <ch...@chrismccord.com> wrote: > > I’m not yet sure how I feel about adding a feature to the language to > solve this issue since I don’t think it’s hard to solve with find/replace > and I’ve come to prefer the explicit, if not a little boilerplate'y > namespacing. For the moment, I probably lean more towards -1. That said, I > don’t particularly like solutions mentioned so far. Counterproposal: > > 1) we already have a configured `:application` module in mix. Let’s use > Phoenix as an example: > > mix.exs: > > defmodule Phoenix.Mixfile do > def application do > [mod: {Phoenix, []}, … > > So mix knows what module our “application” uses to start. What if mix can > autorequire this module for us, and also auto alias this module to `App`? > This would then allow us to write (or mix new to generate): > > defmodule Phoenix do > use Application > > defmacro defmodule(name, do: block) > quote do > defmodule unquote(Module.concat(Phoenix, name)), do: unquote(block) > end > end > > def start(_type, _args) do > ... > end > > > Then any file in your project: > > App.defmodule Router do > ... > end > > > To me, this is the least magic’y way to solve the issue, doesn’t introduce > any new syntax to the language, doesn’t introduce a way for folks to get > carried away with globals, and doesn’t leave a bad feeling in my stomach > like the others. Cons are that it introduces a single global alias, `App`. > > > On Dec 2, 2016, at 4:44 PM, Adam Kittelson <a...@apathydrive.com> wrote: > > I realize they aren't proposals, but I do like #1, perhaps with an eye > toward having @MODULE in conjunction with __MODULE__ for a time before > eventually deprecating the latter. > > Alternatively we could have @@compiler_attributes and @module_attributes > because it would amuse me to have module attributes look like ruby instance > variables and compiler attributes look like ruby class variables. ;) > > Adam > > On Fri, Dec 2, 2016 at 3:33 PM, José Valim <jose.va...@plataformatec.com. > br> wrote: > >> As Michał said, I don't think we want exactly __APP__. After all, the >> application name is an atom, like :my_app, and we likely want the inflected >> application module, which would be MyApp. >> >> Furthermore, as Michał also said, the inflection does not automatically >> work for all applications, so I believe we should rather explicitly say the >> top name module instead of inflecting it from a slightly related variable. >> >> ## Understanding the problem >> >> If we take a step back, I believe the feature we are looking for is >> actually compiler constants. We want the ability to specify, when you >> compile this application, you are going to have this app wide constant with >> the value of X. For example, one could specify in their mix.exs: >> >> def project do >> >> [constants: [APP: MyApp]] >> >> end >> >> >> And then you would: >> >> defmodule __APP__.Foo do >> end >> >> >> The benefit of generalizing this mechanism is that we no longer need to >> hardcode to Mix and we can also make it work with the regular Elixir >> command line. As a matter of fact, both C and Erlang have this feature. In >> Erlang it is in the format of macros: >> >> erlc -Dapp=MyApp >> >> >> And in your code you would be able to access the app name as "?app". >> >> ## Existing solutions >> >> Before proposing new solutions, let's consider if we can use anything >> that already exists today to solve this issue. >> >> For example, maybe we could use application environment variables? >> Although defining a module like below probably wouldn't make anybody happy: >> >> defmodule Module.concat(Application.fetch_env!(:my_app, :app), Foo) do >> >> >> From the above, we also get the requirement the new construct must be >> concise. And we very likely want it to expand and be checked at compile >> time. >> >> Hrm... wait... aren't we talking about module attributes? It has a >> concise syntax and expands at compile time. But wait... those only work >> inside modules. Maybe those could be extended? >> >> ## Proposing a solution >> >> Left as an exercise to the reader. :) >> >> The point of this email was to illustrate how we could generalize the >> proposal and see if we could adopt an existing solution or extend it >> somehow. Many options pass through my mind. For example: >> >> 1. Use @APP for compiler attributes (in contrast to @foo as module >> attributes). Pros: it is concise, can be made compile time. Cons: slightly >> new syntax, conflicts with __MODULE__ (which could arguably be @MODULE) >> >> >> 2. Use @app for compiler attributes. Compiler attributes could be >> overridden inside modules by a module attribute. Pros: it is concise, can >> be made to warn at compile time. Cons: overloads existing syntax. >> >> 3. Introduce a new syntax, such as $app. Pros: it is concise, can be made >> compile time. Cons: introduce completely new syntax, conflicts with >> __MODULE__ (which could arguable be $MODULE) >> >> >> I am not effectively proposing *any* of them but I thought it would be >> interesting to keep the discussion going. After all my job is much easier >> if you do it all for me. :) >> >> >> >> >> *José Valim* >> www.plataformatec.com.br >> Skype: jv.ptec >> Founder and Director of R&D >> >> On Wed, Nov 30, 2016 at 10:34 PM, Michał Muskała <mic...@muskala.eu> >> wrote: >> >>> How often one needs to rename the application? I had to do this only >>> once, and it was a simple find & replace. >>> >>> While __APP__ would simplify it, I find it a bit ugly to have every >>> module defined like this. And if there was an __APP__ variable, I would >>> certainly expect it to be the OTP application name, not some mutated module >>> name. As of now there's no place in mix.exs that defines the "base" module >>> for an application, and it's nor reliable to inflect it automatically from >>> the OTP application name, some examples: >>> >>> mongodb uses Mongo, mongodb_ecto uses Mongo.Ecto, phoenix_html uses >>> Phpenix.HTML, phoenix_pubsub uses Phoenix.PubSub, cors_plug uses CORSPlug, >>> plug_cors uses PlugCors. >>> >>> I don't see a way how we can inflect those automatically. >>> >>> Michał. >>> >>> > On 30 Nov 2016, at 17:40, Dave Thomas <d...@pragdave.me> wrote: >>> > >>> > I just tried to change the application name in a trivial Phoenix >>> project. The name of the project is embedded into the source code 48 times. >>> I have one controller, one view, and a channel. >>> > >>> > My suggestion: assume anything created using mix will be build using >>> mix. For these builds, add the definition __APP__, set to the application >>> name (in module-name form) from the mix.exs file. >>> > >>> > Then generate all the underlying files using >>> > >>> > defmodule __APP__.EndPoint do >>> > >>> > ... >>> > >>> > This could apply to both mix new and mix phoenix.new, as well as >>> anything else that comes along. >>> > >>> > Dave >>> > >>> > >>> > -- >>> > 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/fe291b67- >>> 82f9-411e-ae3a-a1821867ebc6%40googlegroups.com. >>> > For more options, visit https://groups.google.com/d/optout. >>> >>> -- >>> 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/ms >>> gid/elixir-lang-core/64EDFB02-CE5A-42F5-B690-716E419E689A%40muskala.eu. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> >> -- >> 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/ms >> gid/elixir-lang-core/CAGnRm4%2BwQoC6mggL1QiU1auT27krVEcWcsNi >> QqcJTj7J9kU3bw%40mail.gmail.com >> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4%2BwQoC6mggL1QiU1auT27krVEcWcsNiQqcJTj7J9kU3bw%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> >> For more options, visit https://groups.google.com/d/optout. >> > > > -- > 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/CABqbXnuEd6gbBhv_Xop4%2BJARU% > 2BZt0w3%2BM-TaswjBvi2L_xVpng%40mail.gmail.com > <https://groups.google.com/d/msgid/elixir-lang-core/CABqbXnuEd6gbBhv_Xop4%2BJARU%2BZt0w3%2BM-TaswjBvi2L_xVpng%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > > > > -- > 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/7F4EC61D-8366-4074-92BD- > 85228D897F3B%40chrismccord.com > <https://groups.google.com/d/msgid/elixir-lang-core/7F4EC61D-8366-4074-92BD-85228D897F3B%40chrismccord.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. > -- 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/CAJr6D4TMkoCZen2YDsoXcKrWv3dXbGeiF-BhMBcc6OO%2BEqqqvw%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.