#lang scheme/base

;; postponed code and data

(provide

 scat/compile          ;; compile word refernce (struct target-word)
 scat/literal          ;; compile literal value (can be delayed
                       ;; computation depending on address of other
                       ;; struct target-word)

 macro/primitive-exit  ;; compiles procedure exit with proper tail call

 macro-prim:
 )

(require
 "../tools.ss"
 "../scat.ss"
 "pattern.ss"
 "macro-utils.ss")

;; Macro primitives are just scat words.

(define-sr (macro-prim: . code) (scat: . code))


;;(define-ns (scat) broem
;;  (begin
;;    (lambda (state) state)))

;; These are words that most certainly need to be redefined at some
;; point when mapping to a target architecture. They are used in
;; target-rep.ss to implement the core of macro/forth/variable.

(compositions
 (scat) scat:
 
 (literal 'qw >tag)
 (compile 'cw >tag))


;; The exit in (macro) is the authoritative one, and should be
;; redefined/extended in target specific code. Tail call elimination
;; is mandatory.
(patterns (macro)
          (([cw a] primitive-exit)  ([jw a]))
          ((primitive-exit)         ([exit])))


