Skip to content

Instantly share code, notes, and snippets.

@nurugger07
Last active August 29, 2015 14:23
Show Gist options
  • Save nurugger07/e9c3400db9d5042ede61 to your computer and use it in GitHub Desktop.
Save nurugger07/e9c3400db9d5042ede61 to your computer and use it in GitHub Desktop.

Simple Elixir module:

defmodule Generic do
  def say(message) do
    IO.puts message
  end
end

The AST for the this looks like:

iex(1)> quote do: (defmodule Generic, do: (def say(message), do: IO.puts message))
{:defmodule, [context: Elixir, import: Kernel],
 [{:__aliases__, [alias: false], [:Generic]},
  [do: {:def, [context: Elixir, import: Kernel],
    [{:say, [context: Elixir], [{:message, [], Elixir}]},
     [do: {{:., [], [{:__aliases__, [alias: false], [:IO]}, :puts]}, [],
       [{:message, [], Elixir}]}]]}]]}

The Ruby equivalent:

class Generic
  def say(message)
    puts message
  end
end
2.2.0 :001> require 'ripper'
true
2.2.0 :002> require 'pp'
true
2.2.0 :003 > code = <<STR
2.2.0 :004"> class Generic
2.2.0 :005">   def say(message)
2.2.0 :006">     puts message
2.2.0 :007">   end
2.2.0 :008"> end
2.2.0 :009"> STR
 => "class Generic\n  def say(message)\n    puts message\n  end\nend\n"
2.2.0 :010 > pp Ripper.sexp code
[:program, 
  [[:class, 
    [:const_ref, [:@const, "Generic", [1, 6]]], 
    nil, 
    [:bodystmt, 
      [[:def, 
        [:@ident, "say", [2, 6]], 
        [:paren, 
          [:params, 
            [[:@ident, "message", [2, 10]]], 
            nil, 
            nil, 
            nil, 
            nil, 
            nil, nil]], 
          [:bodystmt, 
            [[:command, 
              [:@ident, "puts", [3, 4]], 
              [:args_add_block, 
                [[:var_ref, [:@ident, "message", [3, 9]]]], 
                false]]], 
            nil, 
            nil, 
            nil]]], 
          nil, 
          nil, 
          nil]]]]
@jfreeze
Copy link

jfreeze commented Jun 25, 2015

Elixir AST should be:

{:defmodule, [context: Elixir, import: Kernel],
[{:aliases, [alias: false], [:Generic]},
[do: {:def, [context: Elixir, import: Kernel],
[{:say, [context: Elixir], [{:message, [], Elixir}]},
[do: {{:., [], [{:aliases, [alias: false], [:IO]}, :puts]}, [],
[{:message, [], Elixir}]}]]}]]}

@nurugger07
Copy link
Author

@jfreeze updated :) Not sure how I grabbed the wrong one.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment