#lang scheme/base

;; Macro state uses the hidden datum as a compilation stack.


;; These names represent code and data atoms in the concrete
;; s-expression representation and are referred in They
;; can be observed in the first expansion level of 'macro:' or
;; 'forth-rep'. The data rep can be a function. The code rep is a
;; macro that expands into a prefixed identifer. Names are kept short
;; to make representations saved as text not too verbose.

;; pick a short word here as it ends up in expansions.
(define (lit datum) (macro-prim: ',datum literal))
(define-syntax word (make-ns-ref #'(macro)))

;; All macros are wrapped in a parameter, so they are easily extended
;; with target specific optimizations.
;(define (make-macro . args)
;  (make-parameter (apply make-word args)))

;; Macro primitives are scat: functions with the hidden state
;; representing an extra stack.

;(define-syntax define-macro
;  (syntax-rules () ((_ . args) (define-2stack . args))))