mazz-seven

mazz-seven

Hey,
I’m trying to understand how distinguish between code that run on compile time and how do you follow that code execution.
For example, how can I know which part of Phoenix view is executing at compile time.

Showing Posts 1 to 4

NobbZ

NobbZ

The rule of thumb is, that code inside of a def/defp is run during runtime, while code outside of it, is run during compile time.

An exception to this rule are macros, that is one of the reasons why they are annotated accordingly in the documentation. Regardless where they are, they are expanded during compile time, and therefore anything outside of a quote in the macro is therefore also run during compile time.

Templates in phoenix gets compiled into elixir functions during compiletime, though nothing in the template should be evaluated during compiletime, except for macros, as already mentioned.

There is also this blogpost: https://medium.com/@fxn/how-does-elixir-compile-execute-code-c1b36c9ec8cf

Can’t tell much about its quality, didn’t read it, but it seems to be from the same author who explained the parallel compiler very well in another blog post.

mazz-seven

mazz-seven OP

Thank you!
That make sense.

hauleth

hauleth

While @NobbZ answer is more or less correct there are few exceptions:

  • Macros are functions that returns AST (do not need to use quote) and can execute any code. In other words these are definition of “here be dragons”
  • Not all code in def/defp blocks will be executed in runtime

For example with default configuration c:init/1 in Plug.Builder will be executed in compile time, so this will print Hello there! in the compile time:

defmodule FooPlug do
  def init(opts) do
    IO.puts("Hello there!")

    opts
  end

  def call(conn, _opts) do
    IO.puts("General Kenobi")
    conn
  end
end

defmodule Pipeline do
  use Plug.Builder

  plug FooPlug
end

As you can always call “regular” functions in macros as well:

defmodule Foo do
  defmacro print_in_compiletime(msg) do
    IO.puts(msg)
    nil
  end
end

defmodule Bar do
  import Foo

  def foo do
    print_in_compiletime "Hello there!"
  end
end

Additionally you can force execution of some code during compile time by using unquote within function body:

defmodule Foo do
  def foo do
    IO.puts(unquote(IO.inspect("What the hell")))
  end
end
11
Post #3
mazz-seven

mazz-seven OP

Things aren’t that simple.. so I might have a library that I use and it will call my callbacks/functions at compile time and I have no idea. Except if I look at the source code or documentation.
Can I cause a bug if I don’t aware that a function is executing at compile time?

— All posts loaded —

Where Next? Top

Trending in Questions Top

stjefim
Hello! Suppose you are building workflow (order / task / payment) processing system with the following requirements: Each workflow con...
New
water
I’m aware of 2 such projects, are there others? git: GitHub - team-alembic/realworld: A fullstack Phoenix LiveView application with back...
New
peck
Hi everyone. My team and I have been working on a fairly modest app based around video streaming and chat, but we’ve landed a customer t...
New
bradley
I really like the adapter patterns that ecto, nebulex, waffle, etc. use and would love find something similar for a key management servic...
New
unaware8150
Hello folks! So at work, we are seeing some situations where we have to define some “fixed” strings that are used across the codebase in...
New
leoschweizer
Hi, we run different LLM models across a cluster, with each node loading a configurable subset. Model-specific queues let nodes consume ...
New
csmr
Hi all, I’m new here and would like to hear peoples views on my Elixir/Phoenix based game-engine! :smiley: Mutonex gamedesign was finish...
New

Other Trending Topics Top

mudasobwa
I fully migrated to my own harness from Anthropic/Gemini and I think it’s time to share it. Welcome DSH, the DeepSeek Harness, fully writ...
New
KristerV
Hey. Is there anyone here who creates agents in their apps? Not talking about using agents, but creating them. I’m finding it pretty diff...
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
juhalehtonen
There has been a thread to discuss the Stack Overflow Developer Survey on this forum every year since 2018, so here’s yet another one for...
New
webofbits
With AI doing more of the implementation work, I’ve been wondering how much coding I should deliberately keep doing myself. My main conc...
#ai
New
budgie
I love Elixir. It’s one of 2 programming languages I’ve ever fallen in love with. But I don’t use it anymore. Serverless was the promis...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews