Commit d6edd563 authored by Gerd Moellmann's avatar Gerd Moellmann
Browse files

(Qdeclare, Vmacro_declaration_function): New variables.

(Fdefmacro): Handle `(declare ...)'.
(syms_of_eval) <Qdeclare>: Initialize and staticpro.
(syms_of_eval) <Vmacro_declaration_function>: DEFVAR_LISP.
parent 985b4686
...@@ -91,6 +91,7 @@ Lisp_Object Qautoload, Qmacro, Qexit, Qinteractive, Qcommandp, Qdefun; ...@@ -91,6 +91,7 @@ Lisp_Object Qautoload, Qmacro, Qexit, Qinteractive, Qcommandp, Qdefun;
Lisp_Object Qinhibit_quit, Vinhibit_quit, Vquit_flag; Lisp_Object Qinhibit_quit, Vinhibit_quit, Vquit_flag;
Lisp_Object Qand_rest, Qand_optional; Lisp_Object Qand_rest, Qand_optional;
Lisp_Object Qdebug_on_error; Lisp_Object Qdebug_on_error;
Lisp_Object Qdeclare;
/* This holds either the symbol `run-hooks' or nil. /* This holds either the symbol `run-hooks' or nil.
It is nil at an early stage of startup, and when Emacs It is nil at an early stage of startup, and when Emacs
...@@ -189,6 +190,11 @@ Lisp_Object Vsignaling_function; ...@@ -189,6 +190,11 @@ Lisp_Object Vsignaling_function;
int handling_signal; 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*)); static Lisp_Object funcall_lambda P_ ((Lisp_Object, int, Lisp_Object*));
void void
...@@ -651,9 +657,39 @@ usage: (defmacro NAME ARGLIST [DOCSTRING] BODY...) */) ...@@ -651,9 +657,39 @@ usage: (defmacro NAME ARGLIST [DOCSTRING] BODY...) */)
{ {
register Lisp_Object fn_name; register Lisp_Object fn_name;
register Lisp_Object defn; register Lisp_Object defn;
Lisp_Object lambda_list, doc, tail;
fn_name = Fcar (args); 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)) if (!NILP (Vpurify_flag))
defn = Fpurecopy (defn); defn = Fpurecopy (defn);
Ffset (fn_name, defn); Ffset (fn_name, defn);
...@@ -3229,6 +3265,9 @@ before making `inhibit-quit' nil. */); ...@@ -3229,6 +3265,9 @@ before making `inhibit-quit' nil. */);
Qmacro = intern ("macro"); Qmacro = intern ("macro");
staticpro (&Qmacro); staticpro (&Qmacro);
Qdeclare = intern ("declare");
staticpro (&Qdeclare);
/* Note that the process handling also uses Qexit, but we don't want /* Note that the process handling also uses Qexit, but we don't want
to staticpro it twice, so we just do it here. */ to staticpro it twice, so we just do it here. */
Qexit = intern ("exit"); Qexit = intern ("exit");
...@@ -3314,6 +3353,14 @@ Note that `debug-on-error', `debug-on-quit' and friends ...@@ -3314,6 +3353,14 @@ Note that `debug-on-error', `debug-on-quit' and friends
still determine whether to handle the particular condition. */); still determine whether to handle the particular condition. */);
Vdebug_on_signal = Qnil; 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"); Vrun_hooks = intern ("run-hooks");
staticpro (&Vrun_hooks); staticpro (&Vrun_hooks);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment