all: add quasiquoting

This commit is contained in:
2018-05-14 23:25:39 +02:00
parent a3a84dcb98
commit c873602cfd
3 changed files with 75 additions and 1 deletions

View File

@@ -145,6 +145,36 @@ func parseToken(input []string) (*ast.AST, error, []string) {
return &res, nil, input
}
if input[0] == "`" {
input = input[1:]
tmp, err, input := parseToken(input)
if err != nil {
return nil, err, input
}
quote := ast.AST{ast.Symbol, "quasiquote"}
res := ast.AST{ast.List, []*ast.AST{&quote, tmp}}
return &res, nil, input
}
if input[0][0] == '@' {
if input[0] == "@" {
input = input[1:]
} else {
input = append([]string{input[0][1:]}, input[1:]...)
}
tmp, err, input := parseToken(input)
if err != nil {
return nil, err, input
}
unquote := ast.AST{ast.Symbol, "unqote"}
res := ast.AST{ast.List, []*ast.AST{&unquote, tmp}}
return &res, nil, input
}
switch input[0] {
case "(":
{