axel-0.0.1: examples/example.axel
-- This is just an example, and, since it's partial, is NOT advised for actual use.
(defmacro' when
(([condition body]) (pure [`(if ~condition ~body (error "WHEN"))])))
(defmacro defmacro'
((exprs)
(pure [`(defmacro ~@exprs)])))
(defmacro if
(([cond true false])
(pure [`(case ~cond
(True ~true)
(False ~false))])))
(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])])))
(= main (IO Unit)
(() (if (== 1 1) (putStrLn "Hi!") (putStrLn "wat"))))