#lang scheme/base ;; Macro state uses the hidden datum as a compilation stack. (provide (all-defined-out)) (require "../scat.ss" "../tools.ss" "macro-utils.ss" "core.ss" (for-syntax "../scat-tx.ss" scheme/base)) ;; These names represent code and data atoms in the concrete ;; s-expression representation and are referred in macro-tx.ss. 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))))