enobat

enobat

Can you use custom attributes similar to @impl or @behaviour, but rather than using a callback function, only the function name is used (e.g. @description Mod.fun).

# A.ex
defmodule A do
  use C

  @description1 "function11 returns :ok"
  def function1(_a) do
    :ok
  end

  @description2 A.function1
  def function2(_b) do
    :ok
  end
end

In the example above, the @description1 attribute is valid, since what follows is a string. Then, in @description2 fails since it tries to get a value, but instead I wish to get the name of the method (i.e. A.function1).

defmodule B do
  @behaviour Bar
  @callback foo
end

Some elixir modules are able to do something similar. For example, you can set modules/methods to @behaviour and @callback. Can something similar be created?
Thanks.

First Post!

Nicd

Nicd

You could use a function reference there, like

@description &A.function1/1

But I’m wondering what you want to do with it? Obviously module A would then need to be compiled first.

Last Post!

enobat

enobat OP

I’m developing static checker, so all modules need to be compiled first, before analysed.

For example, the @description attribute can either be set to a string, or otherwise refer to another function (which I can process later on).

# A.ex
defmodule A do
  use B

  @description "function1/0 returns :ok"
  def function1() do
    :ok
  end

  @description A.function1
  def function2() do
    :ok
  end
end
# B.ex
defmodule B do
  defmacro __using__(_) do
    quote do
      import B
      Module.register_attribute(__MODULE__, :description, accumulate: true, persist: true)
      Module.register_attribute(__MODULE__, :test, accumulate: true, persist: true)
      @after_compile B
    end
  end

  def __on_definition__(env, _access, name, args, _guards, _body) do
    IO.puts("Reached on_definition")
    desc = Module.get_attribute(env.module, :description) |> hd()
    Module.delete_attribute(env.module, :description)
    Module.put_attribute(env.module, :test, {name, length(args), desc})
  end

  def __after_compile__(_env, bytecode) do
    IO.puts("Reached after_compile")
    # Gets debug_info chunk from BEAM file
    chunks =
     case :beam_lib.chunks(bytecode, [:debug_info]) do
        {:ok, {_mod, chunks}} -> chunks
        {:error, _, error} -> throw("Error: #{inspect(error)}")
      end
    # Gets the (extended) Elixir abstract syntax tree from debug_info chunk
    dbgi_map =
      case chunks[:debug_info] do
        {:debug_info_v1, :elixir_erl, metadata} ->
          case metadata do
            {:elixir_v1, map, _} ->
              # Erlang extended AST available
              map
          end
        x ->
          throw("Error: #{inspect(x)}")
      end
    dbgi_map[:attributes]
    |> IO.inspect
  end
end

This outputs the following. &A.function1/0 is saved which is what was needed:

[description: "function1/0 returns :ok", description: &A.function1/0]

Compared to the Elixir module, you can set functions directly @callback foo. Can something cleaner (without the &a/0) be achieved?

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
RemyXRenard
I’m seeing that a list inside a Kino.DataTable will be interpreted as a charlist, even if the Kino.configure() is set to charlists: :as_l...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
samoloth
Hi, I’ve just set up an application with ash_authentication. There is only magic link strategy for now, so there is no confirmation add o...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New

Other Trending Topics Top

JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Dmk
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews