It could be `Mix` rather than `Application.` I just used `Application` 
because of how `compile_env` works. Here is another example where I am 
curious about how the proposal would solve it:

```
defmodule MyModule.ErrorBuilder do
  
    # notice here the macro
  defmacro __using__() do
    defstruct [....]
 
    # notice here the usage
    if Code.ensure_loaded?(Ecto) do
      def new(%Ecto.Changeset{} = changeset) do
        attrs = 
          changeset
           |> ChangesetParser.parse()
      
        struct(unquote(__MODULE__), attrs)
      end
    end
  end
end
```

Also, I was thinking more around the lines of if Mix.feature?(:otp_name, 
:feature1) or Mix.feature?/1, not sure.

I intended to highlight that Elixir is a fully turing completed scripting 
programming language to build Elixir code itself due to macro expansion. I 
don't know how you could define all the static information using features: 
[hls: [dependencies: [], modules: ]]] when the values depend upon 
Compile-Time macro expansion. It could even download an entire OpenAPI Spec 
YAML file and construct an entire module. I am not making things app, 
https://github.com/elixir-tesla/tesla_openapi 
(Protobuf, Avro, and many other things that could do the same), so 
situations as I described, including or not Jason encoding, among many 
other things, are real situations that will happen.

`mix.exs#features` could put guide rails in the library code, enforcing to 
statically define the features, and use `Mix.ensure_feature!/2` to enable 
the such feature if you want the compilation branch to happen. It does not 
matter where you are at compile-time.

I am sorry I am coming back to what I said before. Still, I am trying to 
figure out how the proposal would work, considering macro expansions 
depending upon the execution of the compilation and such compilation 
dictating the needs of the dependencies.

I am going to observe from now on. I shared the last information I somehow 
forgot to share that was critical to making sense of whatever I was trying 
to do. My apologies. Hopefully, next time, my brain doesn't fail me.

I am trying my best! I am sorry.

On Tuesday, May 16, 2023 at 12:01:17 AM UTC-4 zachary....@gmail.com wrote:

> I'd amend the proposal:
>
> To make a dependency only present when a feature is used
> ```elixir
> {:optional_dep, …, optional: [:feature1, :feature2]}
> ```
>
> To use a dependency with features
> ```elixir
> {:dep, …, features: [:feature1]}
> ```
>
> And then build features into `Mix` (which is available at compile time) or 
> `Application` similar to `Application.compile_env`. The reason it makes 
> sense to build it into `Mix` is that as José pointed out it will have to be 
> built into mix/hex for dependency resolution.
>
> ```elixir
> if Mix.feature?(:feature1)  do
>   defmodule Foo do
>     …
>   end
> end
> ```
>
>
>
>
> On Mon, May 15, 2023 at 8:52 PM, Yordis Prieto <yordis...@gmail.com> 
> wrote:
>
>> In cases, the following code may exist (real production code):
>>
>> ```
>> defmodule MyModule.Error do
>>
>>   # notice here
>>   if Code.ensure_loaded?(Ecto) do
>>     alias MyModule.Error.{ChangesetParser, ErrorList}
>>     @spec new(Ecto.Changeset.t()) :: MyModule.Error.ErrorList.t()
>>     def new(%Ecto.Changeset{} = changeset) do
>>       changeset
>>       |> ChangesetParser.parse()
>>       |> ErrorList.new <http://errorlist.new/>()
>>     end
>>   end
>>
>>
>> end
>> ```
>>
>> Based on your proposal, use the following structure:
>>
>> ```elixir
>> features: [
>>   hls: [
>>     dependencies: [],
>>     modules: []
>>   ]
>> ]
>> ```
>>
>> How could we configure it to depend on `Ecto` only for that function?
>> On Monday, May 15, 2023 at 2:22:51 PM UTC-4 christ...@gmail.com wrote:
>>
>>> > Is there any particular issue with the information I shared that 
>>> wouldn't help with the situation?
>>>
>>> Your thoughts are compelling and merit discussion!
>>>
>>> It's just that there's a slippery slope in proposal conversations: 
>>> between discussing *a specific* proposal (in this instance, Michal's 
>>> original well-formulated one), and brainstorming and iterating on feedback 
>>> to arrive at *a new *specific proposal. It's a fuzzy line, but one we 
>>> have to draw at some point in any conversation as it goes on, as this 
>>> mailing list is only for specific proposals.
>>>
>>> It's nothing personal—it's just time to move conversation around 
>>> building a new proposal to a more productive discussion-oriented forum, 
>>> such as the Elixir Forums, or direct chat/emails with others working on a 
>>> new idea!
>>> On Sunday, May 14, 2023 at 3:59:06 PM UTC-4 yordis...@gmail.com wrote:
>>>
>>>> I thought that the ideas were around the topic. Is there any particular 
>>>> issue with the information I shared that wouldn't help with the situation?
>>>>
>>>> On Sunday, May 14, 2023 at 3:33:30 PM UTC-4 José Valim wrote:
>>>>
>>>>> No worries, I didn't interpret it as a command. But it is clear there 
>>>>> is an expectation issue: this mailing list should focus on concrete 
>>>>> features and implementations. Once someone submits a proposal here, they 
>>>>> are probably expecting a yes, no (and why so), or what needs to be 
>>>>> considered/improved for the proposal to be accepted. So all feedback in 
>>>>> here has been direct (and historically it has not been a problem).
>>>>>
>>>>> I recommend the Elixir Forum if the goal is to bounce ideas and 
>>>>> explore the problem space. We (the Elixir team) already have a lot on our 
>>>>> hands and we probably won't be able to develop ideas into full proposals. 
>>>>> So I don't want your trust to be misplaced. :)
>>>>>
>>>>> > if we make assumptions and take the position of "it is possible 
>>>>> today," how could we discuss the trade-offs?
>>>>>
>>>>> The point of saying "it is possible today" is that, if you are going 
>>>>> to propose something new, then at least it needs to be compared to what 
>>>>> is 
>>>>> possible today and explain how it improves on that. This, alongside 
>>>>> the problem statement, is very important to ensure we are all on the same 
>>>>> page.
>>>>>
>>>>> On Sun, May 14, 2023 at 8:08 PM Yordis Prieto <yordis...@gmail.com> 
>>>>> wrote:
>>>>>
>>>>>> > Here is the issue: the proposal has not elaborated on how those 
>>>>>> problems will be tackled (outside of dependency management). 
>>>>>>
>>>>>> I wasn't trying to be in Solution-space, just sharing some ideas and 
>>>>>> pain points and trying to figure out if they could be solved 
>>>>>> simultaneously.
>>>>>>
>>>>>> > And don’t ask us to figure it out
>>>>>>
>>>>>> When I said, "I trust you will figure it out," I trusted you would do 
>>>>>> the right thing. I didn't give you any command. My apologies if it came 
>>>>>> across as a Command, but I intended to say, "I trust you, but please 
>>>>>> don't 
>>>>>> discourage the ideas making assumptions about it" That's all.
>>>>>>
>>>>>> > It is not that we don’t care or didn’t think about it. Those are 
>>>>>> different trade-offs, with their strengths and weaknesses, and if we 
>>>>>> want 
>>>>>> to copy features from Rust, then those trade-offs need to be taken into 
>>>>>> account as part of a complete proposal.
>>>>>>
>>>>>> I don't disagree with that at all. That was the intent; discuss it. 
>>>>>> But if we make assumptions and take the position of "it is possible 
>>>>>> today," how could we discuss the trade-offs?
>>>>>>
>>>>>> > Application.ensure_feature would most likely be a wrapper around 
>>>>>> config.
>>>>>>
>>>>>> I am not sure about the technicality underneath, but I was assuming 
>>>>>> that we can't just do that unless we reserve some key or something like 
>>>>>> that, so I was thinking in a completely different ets table for it, but 
>>>>>> sure, it could "feel" as simple as Config module, why not.
>>>>>>
>>>>>> One way I was thinking of adding a key under the `mix.exs` to be able 
>>>>>> to have information:
>>>>>>
>>>>>> ```
>>>>>> defmodule H264.MixProject do
>>>>>>   use Mix.Project
>>>>>>
>>>>>>   def project do
>>>>>>     [features: [:parser, :encoder, :native]] # maybe be able to add 
>>>>>> description for them also?!
>>>>>>   end
>>>>>> end
>>>>>> ```
>>>>>>
>>>>>> Be able to use that information when calling 
>>>>>> `Application.ensure_feature`. It would be just the Config API since it 
>>>>>> would require checking `mix.exs` and/or another ets table with the 
>>>>>> information about the feature. I guess that registering the Features at 
>>>>>> compile time instead of being statically defined in the `mix.exs` would 
>>>>>> become harder. I am unsure if that would be a good idea.
>>>>>>
>>>>>> ExDoc and the Mix.Deps task could read such information to require 
>>>>>> dependencies or have documentation about it. It could be used behind 
>>>>>> `Config` package under another macro:
>>>>>>
>>>>>> ```
>>>>>> import Config
>>>>>> feature :h264, encoder: true
>>>>>> ```
>>>>>>
>>>>>> Or don't do that at all and you only get to activate them using 
>>>>>> `deps` and mess around with `Mix.env()` to correctly configure the 
>>>>>> features.
>>>>>>
>>>>>> Probably activating "statically" in the mix.exs would be simple and 
>>>>>> easier to deal with.
>>>>>>
>>>>>> defmodule MyApp.MixProject do
>>>>>>   use Mix.Project
>>>>>>
>>>>>>   def project do
>>>>>>     [
>>>>>>       deps: [
>>>>>>         {:h264, "~> 0.10.0", features: [:encoder]}
>>>>>>       ]
>>>>>>     ]
>>>>>>   end
>>>>>> end
>>>>>>
>>>>>>
>>>>>> On Sunday, May 14, 2023 at 3:18:01 AM UTC-4 michal...@gmail.com 
>>>>>> wrote:
>>>>>>
>>>>>>> Sure thing, I just wrote as I thought that maybe you will say: 
>>>>>>> that's a good idea, we were thinking about it, we had similar problems 
>>>>>>> etc. 
>>>>>>> etc. 
>>>>>>>
>>>>>>> But because of a lot of questions and doubts it's clear that's the 
>>>>>>> requester responsibility to propose detailed description of the API, 
>>>>>>> take 
>>>>>>> into account all pros and cons, describe how they will affect the whole 
>>>>>>> ecosystem and whether the requested feature fits into the language 
>>>>>>> concepts
>>>>>>>
>>>>>>> niedz., 14 maj 2023, 08:58 użytkownik José Valim <
>>>>>>> jose....@dashbit.co> napisał:
>>>>>>>
>>>>>>>> One addition: “features” makes sense for Rust because the contents 
>>>>>>>> of its “module body” cannot be dynamic as in Elixir. So if they want 
>>>>>>>> to 
>>>>>>>> provide this feature in the first place, it must be done as part of 
>>>>>>>> the 
>>>>>>>> compiler.
>>>>>>>>
>>>>>>>> Elixir can execute any Elixir code when defining modules, which is 
>>>>>>>> why it is possible to implement these features today without 
>>>>>>>> additional work in the compiler.
>>>>>>>>
>>>>>>>> It is not that we don’t care or didn’t think about it. Those are 
>>>>>>>> different trade-offs, with their own strengths and weaknesses, and if 
>>>>>>>> we 
>>>>>>>> want to copy features from Rust, then those trade-offs need to be 
>>>>>>>> taken 
>>>>>>>> into account as part of a complete proposal.
>>>>>>>>
>>>>>>>> -- 
>>>>>>>>
>>>>>>> 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/CAGnRm4LeSido9jqm%3DKBwkwCh7%3DQFJeORGata2ertcJChzh_ezQ%40mail.gmail.com
>>>>>>>>  
>>>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/CAGnRm4LeSido9jqm%3DKBwkwCh7%3DQFJeORGata2ertcJChzh_ezQ%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-co...@googlegroups.com.
>>>>>>
>>>>> To view this discussion on the web visit 
>>>>>> https://groups.google.com/d/msgid/elixir-lang-core/b1519f28-ed13-43d1-88a5-64ba6d909e18n%40googlegroups.com
>>>>>>  
>>>>>> <https://groups.google.com/d/msgid/elixir-lang-core/b1519f28-ed13-43d1-88a5-64ba6d909e18n%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/0d6c0925-4394-43e3-a227-8b43ac10dc3an%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-core/0d6c0925-4394-43e3-a227-8b43ac10dc3an%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/ac68901b-2507-4493-9c6d-fc981a2b8241n%40googlegroups.com.

Reply via email to