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