-- 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"))))