packages feed

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