axel-0.0.3: examples/do.axel
(module Main)
(importq Axel.Parse.AST AST all)
(defmacro quasiquote
(([(AST.SExpression xs)])
(let ((quasiquoteElem (fn (x) (case x
((AST.SExpression ['unquote x])
(AST.SExpression ['list x]))
((AST.SExpression ['unquoteSplicing x])
x)
(atom
(AST.SExpression
['list
(AST.SExpression ['quasiquote atom])]))))))
(pure [(AST.SExpression ['AST.SExpression (AST.SExpression ['concat (AST.SExpression (: 'list (map quasiquoteElem xs)))])])])))
(([atom]) (pure [(AST.SExpression ['quote atom])])))
(defmacro fnCase
((cases) (<$> (fn (varId)
[`(fn (~varId)
(case ~varId ~@cases))])
AST.gensym)))
(= do' (-> ([] AST.Expression) AST.Expression)
(() (fnCase
((: var (: '<- (: val rest)))
`(>>= ~val (fn (~var) ~(do' rest))))
((: val rest)
(case rest
([]
val)
(_
`(>> ~val ~(do' rest))))))))
(defmacro do
((input)
(pure [(do' input)])))
(= main (IO Unit)
(() (do
line <- getLine
(putStrLn line)
(pure unit))))