diff --git a/elixir/lib/mal/reader.ex b/elixir/lib/mal/reader.ex index 07627334..3dcf7b22 100644 --- a/elixir/lib/mal/reader.ex +++ b/elixir/lib/mal/reader.ex @@ -16,6 +16,7 @@ defmodule Mal.Reader do Regex.scan(regex, input, capture: :all_but_first) |> List.flatten |> List.delete_at(-1) # Remove the last match, which is an empty string + |> Enum.filter(fn token -> not String.starts_with?(token, ";") end) end def read_form([next | rest] = tokens) do @@ -26,12 +27,22 @@ defmodule Mal.Reader do "`" -> create_quote('quasiquote', rest) "~" -> create_quote('unquote', rest) "~@" -> create_quote('splice-unquote', rest) + "@" -> create_quote('deref', rest) + "^" -> create_meta(rest) + ")" -> throw({:invalid, "unexpected )"}) _ -> token = read_atom(next) {token, rest} end end + defp create_meta(tokens) do + {meta, meta_rest} = read_form(tokens) + {token, rest_tokens} = read_form(meta_rest) + new_token = [{:symbol, 'with-meta'}, token, meta] + {new_token, rest_tokens} + end + defp create_quote(quote_type, tokens) do {token, rest_tokens} = read_form(tokens) new_token = [{:symbol, quote_type}, token] diff --git a/elixir/step0_repl.ex b/elixir/step0_repl.ex deleted file mode 100644 index 742c5f55..00000000 --- a/elixir/step0_repl.ex +++ /dev/null @@ -1,34 +0,0 @@ -defmodule Step0Repl do - def main do - IO.write(:stdio, "user> ") - IO.read(:stdio, :line) - |> handle_line - - main - end - - defp handle_line(:eof), do: exit(0) - defp handle_line(line) do - IO.write(:stdio, read_eval_print(line)) - end - - def read(input) do - input - end - - def eval(input) do - input - end - - def print(input) do - input - end - - def read_eval_print(line) do - read(line) - |> eval - |> print - end -end - -Step0Repl.main