coma/rpn-macro.ss
#lang scheme/base

(require
 "../rpn.ss"
 "../ns.ss"
 "../scat.ss"
 "op.ss")

(provide macro
         macro:
         macro-push)

;; Basic expression compilers.  The code is right folded in rpn-lambda
;; (called from rpn-parse), so we use nested let expressions here.
(define-syntax-rule (macro-push  val p sub) (let ((p ((lit val) p))) sub))

(define-syntax-rule (macro . form) (ns (macro) . form))

(define-syntax-rule (macro: code ...)
  (make-word
   (rpn-parse (rpn:-compile    ;; dictionary compiler
               (macro)         ;; namespace
               scat-apply      ;; function = same as scat:
               macro-push      ;; immediate
               macro-push      ;; immediate program
               macro:          ;; anonymous compiler for recursive parse
               (rpn-lambda)    ;; dictionary init (only one anonymous entry)
               ) code ...)))