diff src/eval.c @ 44132:8b63b08a2619

(Qdeclare, Vmacro_declaration_function): New variables. (Fdefmacro): Handle `(declare ...)'. (syms_of_eval) <Qdeclare>: Initialize and staticpro. (syms_of_eval) <Vmacro_declaration_function>: DEFVAR_LISP.
author Gerd Moellmann <gerd@gnu.org>
date Sun, 24 Mar 2002 19:52:55 +0000
parents f92c4d87863a
children 857c2abe3324
line wrap: on
line diff
--- a/src/eval.c	Sun Mar 24 19:48:27 2002 +0000
+++ b/src/eval.c	Sun Mar 24 19:52:55 2002 +0000
@@ -91,6 +91,7 @@
 Lisp_Object Qinhibit_quit, Vinhibit_quit, Vquit_flag;
 Lisp_Object Qand_rest, Qand_optional;
 Lisp_Object Qdebug_on_error;
+Lisp_Object Qdeclare;
 
 /* This holds either the symbol `run-hooks' or nil.
    It is nil at an early stage of startup, and when Emacs
@@ -189,6 +190,11 @@
 
 int handling_signal;
 
+/* Function to process declarations in defmacro forms.  */
+
+Lisp_Object Vmacro_declaration_function;
+
+
 static Lisp_Object funcall_lambda P_ ((Lisp_Object, int, Lisp_Object*));
 
 void
@@ -651,9 +657,39 @@
 {
   register Lisp_Object fn_name;
   register Lisp_Object defn;
+  Lisp_Object lambda_list, doc, tail;
 
   fn_name = Fcar (args);
-  defn = Fcons (Qmacro, Fcons (Qlambda, Fcdr (args)));
+  lambda_list = Fcar (Fcdr (args));
+  tail = Fcdr (Fcdr (args));
+
+  doc = Qnil;
+  if (STRINGP (Fcar (tail)))
+    {
+      doc = Fcar (tail);
+      tail = Fcdr (tail);
+    }
+
+  while (CONSP (Fcar (tail))
+	 && EQ (Fcar (Fcar (tail)), Qdeclare))
+    {
+      if (!NILP (Vmacro_declaration_function))
+	{
+	  struct gcpro gcpro1;
+	  GCPRO1 (args);
+	  call2 (Vmacro_declaration_function, fn_name, Fcar (tail));
+	  UNGCPRO;
+	}
+      
+      tail = Fcdr (tail);
+    }
+
+  if (NILP (doc))
+    tail = Fcons (lambda_list, tail);
+  else
+    tail = Fcons (lambda_list, Fcons (doc, tail));
+  defn = Fcons (Qmacro, Fcons (Qlambda, tail));
+  
   if (!NILP (Vpurify_flag))
     defn = Fpurecopy (defn);
   Ffset (fn_name, defn);
@@ -3229,6 +3265,9 @@
   Qmacro = intern ("macro");
   staticpro (&Qmacro);
 
+  Qdeclare = intern ("declare");
+  staticpro (&Qdeclare);
+  
   /* Note that the process handling also uses Qexit, but we don't want
      to staticpro it twice, so we just do it here.  */
   Qexit = intern ("exit");
@@ -3314,6 +3353,14 @@
 still determine whether to handle the particular condition.  */);
   Vdebug_on_signal = Qnil;
 
+  DEFVAR_LISP ("macro-declaration-function", &Vmacro_declaration_function,
+	       doc: /* Function to process declarations in a macro definition.
+The function will be called with two args MACRO and DECL.
+MACRO is the name of the macro being defined.
+DECL is a list `(declare ...)' containing the declarations.
+The value the function returns is not used.  */);
+  Vmacro_declaration_function = Qnil;
+
   Vrun_hooks = intern ("run-hooks");
   staticpro (&Vrun_hooks);