#lang scheme/base
(require
scheme/pretty
scheme/control
"../tools.ss"
"../scat.ss"
"../target.ss")
(provide (all-defined-out))
(define (find-target-word/false name)
(namespace-variable-value
(ns-name '(target) name)
#f (lambda () #f)))
(define (tfind/false name)
(let ((word (find-target-word/false name)))
(and word (target-word-address word))))
(define (tfind name)
(or (tfind/false name)
(error 'target-word-not-found "~s" name)))
(define (target-mapped-symbols)
(filter tfind/false (ns-mapped-symbols '(target))))
(define (target-words [words #f])
(if words
(for-each*
(lambda (name realm address)
(let ((word
(eval
`(new-target-word #:name ',name
#:realm ',realm
#:address ,address))))
(eval
`(begin
(define-ns (target) ,name ,word)
(define-ns (macro) ,name
,(case realm
((code) `(scat: ',word compile))
((data) `(scat: ',word literal))))))))
words)
(for/list ((name (target-mapped-symbols)))
(let ((word (find-target-word/false name)))
(list name
(target-word-realm word)
(target-word-address word))))))
(define (reverse-lookup dict realm address)
(prompt
(for-each*
(lambda (name r a)
(when (and (eq? r realm)
(eq? a address))
(abort name)))
dict) #f))
(define (write-dict [port (current-output-port)])
(pretty-print `(target-words ',(target-words)) port))
(define (save-dict filename)
(with-output-to-file/safe filename
(lambda () (write-dict))))
(define (forth-load file)
(eval `(forth-load/compile ,file)))
(snarf as-push (scat)
((x) (tfind forth-load)))