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:
parent
297a357e28
commit
4b7b122523
@ -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]
|
||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user