addrummond
Is it possible to detect if code is executing at compile time?
Can Elixir code detect whether it is executing at compile time? I would like to write something like the following macro:
defmacro foo() do
quote do
if is_compile_time? do
one_thing()
else
another_thing()
end
end
end
It’s presumably obvious how the code that the macro expands to can execute at runtime. It can execute at compile time in a scenario such as the following:
defmodule Bar do
def bar() do
foo() # invoke the macro
end
end
defmodule Amp do
@attr Bar.bar() # code that 'foo' macro expands to is executed at compile time
end
I have tried examining __ENV__, but unless I’m missing something, it offers no reliable diagnostic for compile time vs. runtime. I wonder if there is any other way. For anyone familiar with Common Lisp, I suppose I am looking for something that works a bit like eval-when.
By the way, I am asking largely out of curiosity. I’m aware that in general one should not need to perform such a check ![]()
Marked As Solved
Also Liked
kip
I use the following code in ex_cldr to detect if Elixir is compiling. The mechanism changed from Elixir 1.11, hence the conditional check:
def compiling? do
# TODO: When we depend on Elixir v1.11+ only, remove function_exported and elixir_compiler_pid
process_alive?(:can_await_module_compilation?) ||
process_alive?(:elixir_compiler_pid)
end
defp process_alive?(:can_await_module_compilation?) do
Code.ensure_loaded?(Code) &&
function_exported?(Code, :can_await_module_compilation?, 0) &&
apply(Code, :can_await_module_compilation?, [])
end
defp process_alive?(name) do
case Process.get(name) do
nil -> false
pid when is_pid(pid) -> true
end
end
josevalim
dimitarvp
That distinction doesn’t change anything he said though, you can still generate a module at runtime and compile it and for it what is happening will be “compile time”. You really should revise what you really want to achieve with this and consider other ways, this can very easily bite you in the rear in the most inopportune moment in the future.
Popular in Questions
Other popular topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #phoenix_html
- #iex
- #blog-post
- #graphql
- #genstage
- #ai
- #websockets
- #supervisor
- #elixirconf-us
- #advent-of-code
- #distillery
- #processes
- #forms
- #api
- #metaprogramming
- #security
- #hex









