Merge /Users/sabetts/src/movitzcvs/movitz
[movitz-core.git] / assembly-syntax.lisp
blob4aa825ea53dedf44e96c9bb40fa727f53d494f9b
1 ;;;;------------------------------------------------------------------
2 ;;;;
3 ;;;; Copyright (C) 20012000, 2004,
4 ;;;; Department of Computer Science, University of Tromso, Norway
5 ;;;;
6 ;;;; Filename: assembly-syntax.lisp
7 ;;;; Description:
8 ;;;; Author: Frode Vatvedt Fjeld <frodef@acm.org>
9 ;;;; Created at: Thu Nov 9 17:34:37 2000
10 ;;;; Distribution: See the accompanying file COPYING.
11 ;;;;
12 ;;;; $Id: assembly-syntax.lisp,v 1.4 2004/09/06 10:07:03 ffjeld Exp $
13 ;;;;
14 ;;;;------------------------------------------------------------------
16 (in-package movitz)
18 (defstruct assembly-macro-environment
19 (expanders (make-hash-table :test #'eq)))
21 (defun assembly-macro-expander (symbol amenv)
22 (gethash symbol (assembly-macro-environment-expanders amenv)))
24 (defun (setf assembly-macro-expander) (expander symbol amenv)
25 (setf (gethash symbol (assembly-macro-environment-expanders amenv))
26 expander))
28 (defun assembly-macroexpand (prg amenv)
29 #+cmu (declare (optimize (safety 0))) ; Circumvent CMUCL bug in loop for-as-on-list.
30 (loop for (p . tail) on prg
31 as expander = (and (consp p)
32 (symbolp (car p))
33 (assembly-macro-expander (car p) amenv))
34 if expander
35 append (funcall expander p) into result
36 else if (consp p)
37 append (list (assembly-macroexpand p amenv)) into result
38 else append (list p) into result
39 when (not (listp tail))
40 do (setf (cdr (last result)) tail)
41 (return result)
42 finally (return result)))