From the perspective of being an Elixir developer, one of the things I miss about Clojure is it’s REPL and the ability to eval code directly from the editor to the REPL session. For example, when working on a function, I can send the current code to the REPL to redefine the function and then play with it in the REPL. Elixir has a REPL, but you can’t do this.
Clojure has the concept of a “current namespace” (namespace is the nearest Clojure equivalent to Elixirs module). Anything evaluated in the REPL is done so in the context of this namespace. You can switch namespaces using the in-ns
function. Elixir isn’t this loose, you can re-evaluate a function you need to specify it’s module, there’s no implicit module context.
def foo(), do: true
> ** (ArgumentError) cannot invoke def/2 outside module
defmodule X
defn foo(), do: true
end
> X.foo() => true
I wonder if it would be possible to implement the concept of a “current module” and then automatically wrap any use of def
with defmodule <current_module> do; …code…; end
?