fgallaire

fgallaire

Alias, import and defdelegate are a mess?

ISTM that alias, import and defdelegate are limited and confusing, and certainly my worst experience in Elixir.

I just would like to do the Elixir equivalent of Python from module import function as new_name for coding concision and clarity.

alias works only for module names
import has except and only keywords but not an as or alias one
defdelegate:

  • doesn’t work with macros
  • has a logical but confusingly inversed as: keyword
  • use confusing “shadow variables” (instead of arity as in import)
  • needs to be done in a second module to be call in the first one “body”

To avoid the defdelegate mess which is not done for that, we should have a working import with alias mecanism.

First Post!

mbuhot

mbuhot

How about defp ?

Most Liked

josevalim

josevalim

Creator of Elixir

alias and import serve complete different purposes than defdelegate. defdelegate is about extending your public API by delegating to something else, that’s why it has different requirements.

I really dislike from module import function as new_name seen in Python and in other languages because you are introducing a name in that project that can’t be found anywhere else. If you rename something to prefix_foo_bar, that name exists only in that file, and trying to look for it in the documentation, Google, or anywhere else will most likely fail. If you really want to rename something, it is better to be explicit at it and define a private function you use locally. Or, as others have said, rely on aliases to do the disambiguation.

14
Post #3
josevalim

josevalim

Creator of Elixir

We can’t evaluate language features in a vacuum. :slight_smile: In Python, I don’t think you can meta-program the construct above, so it is always explicit. In Elixir, however, that could be hidden inside a use, and that would be a recipe for disaster.

There are other ways to work around import limitations, defdelegate is not one of them.

alexiss

alexiss

The concrete realization of e in comments above depends on your needs, thats because we are asking you about your whole problem. I think, you don’t need Macro.escape at all. For example to match on map keys solution may looks like this:

defmodule Test do
  defmacrop e(kv) do
    quote do
      %{unquote_splicing(kv)}
    end
  end

  def me(e(a: 10)), do: :a_key_10
  def me(e(a: 20)), do: :a_key_20
  def me(e(b: _)),  do: :b_key
end

then in iex:

iex(3)> Test.me(%{a: 10})
:a_key_10
iex(4)> Test.me(%{a: 20})
:a_key_20
iex(5)> Test.me(%{b: :any})
:b_key

Last Post!

NobbZ

NobbZ

Importing is done via the import call. It will enable you to call functions from the imported module in your current scope without having to qualify them by the module.

So after import Enum, you can write map(list, &(&1+1)) instead of having to write Enum.map(list, &(&1+1)).

importing is rarely really necessary, and unless building an EDSL should be avoided.

Where Next?

Popular in Questions Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
marius95
Hello everyone, I try to use an Javascript Event Handler in my root.html.leex file. Therefore I created a function in the app.js file: ...
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New

Other popular topics Top

grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 54260 488
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 40165 209
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New

We're in Beta

About us Mission Statement