;;; -*- Mode:LISP; Package:USER; Base:10; Readtable:CL -*- (global::eval-when (global::load global::eval) (global::import '( ; ;type specifiers (only) ; lisp:symbol ; lisp:cons lisp:* lisp:+ lisp:- lisp:< lisp:<= lisp:= lisp:> lisp:>= lisp:1+ lisp:1- lisp:&aux lisp:&rest lisp:&body lisp:&environment lisp:&whole lisp:&optional lisp:&key ;this shouldn't really be here lisp:aref lisp:ash ; lisp:atom lisp:and lisp:append ; lisp:apply lisp:block ; lisp:byte ; lisp:byte-size ; lisp:byte-position lisp:case ; lisp:car ; lisp:cadr ; lisp:caddr lisp:ceiling ; lisp:cdr ; lisp:cddr lisp:compile lisp:compiler-let lisp:cond ; lisp:decf ;??? lisp:declare lisp:defconstant ; lisp:define-setf-method ; global:defsubst ; lisp:defsetf ; lisp:defsetf ; lisp:defstruct lisp:defun lisp:defvar ;??? lisp:defparameter ;??? lisp:do lisp:do* lisp:dotimes lisp:eq lisp:eql lisp:etypecase lisp:eval ;only for eval-when, you can't call it lisp:eval-when lisp:export global:ferror ; lisp:first lisp:flet lisp:floor lisp:funcall lisp:function lisp:go lisp:if lisp:ignore lisp:import lisp:in-package ; lisp:incf lisp:lambda lisp:labels ; lisp:list lisp:let lisp:let* lisp:load lisp:logand lisp:logandc1 lisp:logandc2 lisp:logeqv lisp:logior lisp:lognand lisp:lognor lisp:lognot lisp:logorc1 lisp:logorc2 lisp:logxor lisp:loop lisp:macrolet ; lisp:mapcar lisp:max lisp:minusp lisp:mod lisp:multiple-value-bind lisp:multiple-value-setq ; lisp:nconc lisp:nil lisp:null lisp:not lisp:or lisp:plusp lisp:proclaim lisp:prog lisp:prog1 lisp:progn global:psetq lisp:quote global:remainder lisp:rest lisp:return lisp:return-from ; lisp:second lisp:setf ; lisp:setf lisp:setq lisp:t lisp:tagbody lisp:unless lisp:values lisp:when lisp:zerop ) (find-package "PRIMITIVES" user:*package*))) (pkg-goto 'prims () user:*package*) (global:export '( defmacro defsubst ; define-modify-macro byte byte-size byte-position )) (global:pkg-goto 'user () user:*package*) ;this is the one to really use. Defines things for both environments. (defmacro prims::define-modify-macro (name &rest stuff) `(PROGN (SETF::DEFINE-MODIFY-MACRO-INTERNAL ,name ,@stuff) ;for LAMBDA (SETF (NLISP::MACRO-FUNCTION ',name) (MACRO-FUNCTION ',name)))) ;for K. ;;;; Macros defined in K source files ;;;; when compiled with the lambda compiler, will ;;;; go both into the lambda environment and the ;;;; new macro environment ;;;; This macro definition is *not* seen by nlisp:compile-file ;;;; -- It probably should be. -- JRM ;;;; no, thats the point, this kluge is so that when ;;;; something is compiled by the lambda compiler ;;;; (or evaled in a buffer) it will be seen in both environments ;;;; The eval-when is an even worse kluge, but is the only way I can ;;;; think of to allow nlisp:macroexpand to work later in the file ;;;; (it is called by setf) (defmacro prims:defmacro (name lambda-list &body body) `(PROGN (EVAL-WHEN (EVAL COMPILE LOAD) (DEFMACRO ,name ,lambda-list ,@body) (SETF (NLISP::MACRO-FUNCTION ',name) (MACRO-FUNCTION ',name))))) ;;;; this also is taken care of by a toplevel form handler (pkg-goto 'prims () user:*package*) (global:defmacro defsubst (name &rest body) `(global:PROGN (NC:DEF-DECLARATION ,name SUBST '(NAMED-SUBST ,name . ,body)) (DEFUN ,name . ,body))) (global:pkg-goto 'user () user:*package*) (defun prims:byte (size position) (global::dpb size (global:byte 5. 8.) ;vinc:%%byte-size position)) (defun prims:byte-size (byte-spec) (global::ldb (global::byte 5. 8.) byte-spec)) ;vinc:%%byte-size (defun prims:byte-position (byte-spec) (global::ldb (global::byte 8. 0.) byte-spec)) ;vinc:%byte-position (setf (nlisp:macro-function 'prims:setf) (macro-function 'setf:setf)) (setf (nlisp:macro-function 'prims:defsetf) (macro-function 'setf:defsetf)) ;(setf (nlisp:macro-function 'prims:define-setf-method) (macro-function 'setf:define-setf-method)) (setf (nlisp:macro-function 'setf:defsetf) (macro-function 'setf:defsetf)) ;(setf (nlisp:macro-function 'setf:define-setf-method) (macro-function 'setf:define-setf-method))