ar7max

ar7max

How does __using__ actually work?

I will be short:

defmodule A do
    use B

    def func1 do
        callback = &func2/1
        # then I need to send callback to another function call
    end

    # that's all, there is no definition of func2 in module A
    # all your func2 definitions belongs to module B
    # but this way it will fail with no error
    # just func2 will never be called
end

So, pls, read “comments” section of code example if u have not done it yet.
The workaround is that I need to define function func2 in module A and arity doesn’t matter.

I was also playing with on_definition hook to understand what’s going on and everything looks fine:

def on_def(_env, kind, name, args, guards, body), do: 
    IO.puts("Defining #{kind} named #{name}")

It shows me a definition of func2 right at the start where I was expecting it to be

Should I dive into sources of Elixir or is there some Unhidden Truth somewhere on this topic?
Is there something with compiler?

Yep, I forgot, module B just contains using macro with quoted definition of func2

Most Liked

hauleth

hauleth

In short, this:

defmodule A do
  use Foo, opts
end

Is exactly the same as:

defmodule A do
  require Foo
  Foo.__using__(opts)
end

This is just sugar over it, see for yourself.

NobbZ

NobbZ

use calls the macro __using__ on compile time of the mentioned module, this way code gets injected into the calling module.

Simplified use B gets replaced by whatever is in the returned quote block if Bs __using__.

This behaviour should be documented in the Kernel module under the use` macro (or is it a special form?). Can’t search it for you as I’m on mobile data plan only…

Last Post!

ar7max

ar7max

As I can understand from docs my code translates to require B plus call of B.__using__ macro. And that’s all. Then I should be able to use func2. Mb it is something to do with capturing function.

Where Next?

Popular in Questions Top

nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
New
ovidiubadita
Hey all, I discovered Elixir and I love it. I always wanted to learn a functional programming and I intended to go for Haskell, but afte...
New
lastday4you
I wanted to check elixir version in phoenix because i found that my elixir is 1.5 but when i use Enum.chunk_by it said the function is un...
New
Lily
In templates/appointment/index.html.eex: <%= for appointment <- @appointments do %> <tr> <td><%= appoi...
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
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

Other popular topics Top

openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
985 44608 311
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
New

We're in Beta

About us Mission Statement