#lang scheme/base
(require
 "tools.ss")
(require
 "coma/macro-eval.ss")
(require/provide
 "purrr/forth-begin.ss"   ;; parser driver in the form of 'begin' macros.
 "purrr/parsing-words.ss" ;; bindings for (non-concatenative) forth parser words
 "purrr/repl.ss"          ;; string -> toplevel form expansion
 "coma.ss"                ;; single stack pure macros
 "control.ss"             ;; dual stack control macros
 "comp.ss"                ;; compiler (macro instantiation + postprocess)
 "scat.ss"                ;; intermediate language
 "asm.ss"                 ;; for convenience, export assembler interface
 "target.ss"
 "live.ss"                ;; target interaction
 )
(provide
 (all-defined-out))

;; Macros defined in .f files use a superset of the macro/2stack
;; language state to implement multiple entry and exit points for
;; instantiated code, and multiple exit for macros. All macro
;; evaluation that's not part of instantiation needs to use this
;; augmented state. (i.e. this is used in macro/constants.ss)
(macro-eval-init-state
 state:compiler)

;; The Purrr language all by itself, without specialization to a real
;; machine, is at this moment only useful for debugging.

;; Printing reverses the standard reversed order.
(define (print-asm-code chains)
  (for-each
   (lambda (x)
     (print-target-word x)
     (newline))
   (reverse chains)))

;; Since 'repl' can't run inside a parameterize env (this is because
;; of the use of toplevel forms), the only way to change what happens
;; to compiled code is to change the mode of the compiler.

(define (asm-debug!)
  (register-code-hook
   (list
    (lambda (chains . _)
      (print-asm-code chains)))))

(asm-debug!)



(loading "purrr")
