packages feed

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