1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-20 18:18:51 +03:00

Add support for deref and meta

This commit is contained in:
ekmartin 2015-09-04 23:14:37 +02:00
parent 297a357e28
commit 4b7b122523
2 changed files with 11 additions and 34 deletions

View File

@ -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]

View File

@ -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