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 updated :) Not sure how I grabbed the wrong one.