|
|
1.1 root 1: /* Evaluator for GNU Emacs Lisp interpreter.
2: Copyright (C) 1985 Richard M. Stallman.
3:
4: This file is part of GNU Emacs.
5:
6: GNU Emacs is distributed in the hope that it will be useful,
7: but WITHOUT ANY WARRANTY. No author or distributor
8: accepts responsibility to anyone for the consequences of using it
9: or for whether it serves any particular purpose or works at all,
10: unless he says so in writing. Refer to the GNU Emacs General Public
11: License for full details.
12:
13: Everyone is granted permission to copy, modify and redistribute
14: GNU Emacs, but only under the conditions described in the
15: GNU Emacs General Public License. A copy of this license is
16: supposed to have been given to you along with GNU Emacs so you
17: can know your rights and responsibilities. It should be in a
18: file named COPYING. Among other things, the copyright notice
19: and this notice must be preserved on all copies. */
20:
21:
22: #include "config.h"
23: #include "lisp.h"
24:
25: #ifndef standalone
26: #include "commands.h"
27: #else
28: #define INTERACTIVE 1
29: #endif
30:
31: #include <setjmp.h>
32:
33: /* This definition is duplicated in alloc.c and keyboard.c */
34: /* Putting it in lisp.h makes cc bomb out! */
35:
36: struct backtrace
37: {
38: struct backtrace *next;
39: Lisp_Object *function;
40: Lisp_Object *args; /* Points to vector of args. */
41: int nargs; /* length of vector */
42: /* if nargs is UNEVALLED, args points to slot holding list of unevalled args */
43: char evalargs;
44: /* Nonzero means call value of debugger when done with this operation. */
45: char debug_on_exit;
46: };
47:
48: struct backtrace *backtrace_list;
49:
50: struct catchtag
51: {
52: Lisp_Object tag;
53: Lisp_Object val;
54: struct catchtag *next;
55: jmp_buf jmp;
56: struct backtrace *backlist;
57: int lisp_eval_depth;
58: };
59:
60: struct catchtag *catchlist;
61:
62: Lisp_Object Qautoload, Qmacro, Qexit, Qinteractive, Qcommandp, Qdefun;
63: Lisp_Object Vquit_flag, Vinhibit_quit;
64: Lisp_Object Qmocklisp_arguments, Vmocklisp_arguments, Qmocklisp;
65: Lisp_Object Qand_rest, Qand_optional;
66:
67: /* Non-nil means record all fset's and provide's, to be undone
68: if the file being autoloaded is not fully loaded.
69: They are recorded by being consed onto the front of Vautoload_queue:
70: (FUN . ODEF) for a defun, (OFEATURES . nil) for a provide. */
71:
72: Lisp_Object Vautoload_queue;
73:
74: /* Current number of specbindings allocated in specpdl. */
75:
76: int specpdl_size;
77:
78: /* Pointer to beginning of specpdl. */
79:
80: struct specbinding *specpdl;
81:
82: /* Pointer to first unused element in specpdl. */
83:
84: struct specbinding *specpdl_ptr;
85:
86: /* Maximum size allowed for specpdl allocation */
87:
88: int max_specpdl_size;
89:
90: /* Depth in Lisp evaluations and function calls. */
91:
92: int lisp_eval_depth;
93:
94: /* Maximum allowed depth in Lisp evaluations and function calls. */
95:
96: int max_lisp_eval_depth;
97:
98: /* Nonzero means enter debugger before next function call */
99: int debug_on_next_call;
100:
101: /* Nonzero means display a backtrace if an error
102: is handled by the command loop's error handler. */
103: int stack_trace_on_error;
104:
105: /* Nonzero means enter debugger if an error
106: is handled by the command loop's error handler. */
107: int debug_on_error;
108:
109: /* Nonzero means enter debugger if a quit signal
110: is handled by the command loop's error handler. */
111: int debug_on_quit;
112:
113: Lisp_Object Vdebugger;
114:
115: void specbind (), unbind_to (), record_unwind_protect ();
116:
117: Lisp_Object funcall_lambda ();
118: extern Lisp_Object ml_apply (); /* Apply a mocklisp function to unevaluated argument list */
119:
120: init_eval_once ()
121: {
122: specpdl_size = 100;
123: specpdl = (struct specbinding *) malloc (specpdl_size * sizeof (struct specbinding));
124: max_specpdl_size = 600;
125: max_lisp_eval_depth = 200;
126: }
127:
128: init_eval ()
129: {
130: specpdl_ptr = specpdl;
131: catchlist = 0;
132: handlerlist = 0;
133: backtrace_list = 0;
134: Vquit_flag = Qnil;
135: debug_on_next_call = 0;
136: lisp_eval_depth = 0;
137: }
138:
139: Lisp_Object
140: call_debugger (arg)
141: Lisp_Object arg;
142: {
143: if (lisp_eval_depth + 20 > max_lisp_eval_depth)
144: max_lisp_eval_depth = lisp_eval_depth + 20;
145: if (specpdl_size + 40 > max_specpdl_size)
146: max_specpdl_size = specpdl_size + 40;
147: return Fapply (Vdebugger, arg);
148: }
149:
150: do_debug_on_call (code)
151: Lisp_Object code;
152: {
153: debug_on_next_call = 0;
154: backtrace_list->debug_on_exit = 1;
155: call_debugger (Fcons (code, Qnil));
156: }
157:
158: /* NOTE!!! Every function that can call EVAL must protect its args
159: and temporaries from garbage collection while it needs them.
160: The definition of `For' shows what you have to do. */
161:
162: DEFUN ("or", For, Sor, 0, UNEVALLED, 0,
163: "Eval args until one of them yields non-NIL, then return that value.\n\
164: The remaining args are not evalled at all.\n\
165: If all args return NIL, return NIL.")
166: (args)
167: Lisp_Object args;
168: {
169: register Lisp_Object val;
170: Lisp_Object args_left;
171: struct gcpro gcpro1;
172:
173: if (NULL(args))
174: return Qnil;
175:
176: args_left = args;
177: GCPRO1 (args_left);
178:
179: do
180: {
181: val = Feval (Fcar (args_left));
182: if (!NULL (val))
183: break;
184: args_left = Fcdr (args_left);
185: }
186: while (!NULL(args_left));
187:
188: UNGCPRO;
189: return val;
190: }
191:
192: DEFUN ("and", Fand, Sand, 0, UNEVALLED, 0,
193: "Eval args until one of them yields NIL, then return NIL.\n\
194: The remaining args are not evalled at all.\n\
195: If no arg yields NIL, return the last arg's value.")
196: (args)
197: Lisp_Object args;
198: {
199: register Lisp_Object val;
200: Lisp_Object args_left;
201: struct gcpro gcpro1;
202:
203: if (NULL(args))
204: return Qt;
205:
206: args_left = args;
207: GCPRO1 (args_left);
208:
209: do
210: {
211: val = Feval (Fcar (args_left));
212: if (NULL (val))
213: break;
214: args_left = Fcdr (args_left);
215: }
216: while (!NULL(args_left));
217:
218: UNGCPRO;
219: return val;
220: }
221:
222: DEFUN ("if", Fif, Sif, 2, UNEVALLED, 0,
223: "(if C T E...) if C yields non-NIL do T, else do E...\n\
224: Returns the value of T or the value of the last of the E's.\n\
225: There may be no E's; then if C yields NIL, the value is NIL.")
226: (args)
227: Lisp_Object args;
228: {
229: register Lisp_Object cond;
230: struct gcpro gcpro1;
231:
232: GCPRO1 (args);
233: cond = Feval (Fcar (args));
234: UNGCPRO;
235:
236: if (!NULL (cond))
237: return Feval (Fcar (Fcdr (args)));
238: return Fprogn (Fcdr (Fcdr (args)));
239: }
240:
241: DEFUN ("cond", Fcond, Scond, 0, UNEVALLED, 0,
242: "(cond CLAUSES...) tries each clause until one succeeds.\n\
243: Each clause looks like (C BODY...). C is evaluated\n\
244: and, if the value is non-nil, this clause succeeds:\n\
245: then the expressions in BODY are evaluated and the last one's\n\
246: value is the value of the cond expression.\n\
247: If a clause looks like (C), C's value if non-nil is returned from cond.\n\
248: If no clause succeeds, cond returns nil.")
249: (args)
250: Lisp_Object args;
251: {
252: register Lisp_Object clause, val;
253: struct gcpro gcpro1;
254:
255: GCPRO1 (args);
256: while (!NULL (args))
257: {
258: clause = Fcar (args);
259: val = Feval (Fcar (clause));
260: if (!NULL (val))
261: {
262: if (!EQ (XCONS (clause)->cdr, Qnil))
263: val = Fprogn (XCONS (clause)->cdr);
264: break;
265: }
266: args = XCONS (args)->cdr;
267: }
268: UNGCPRO;
269:
270: return val;
271: }
272:
273: DEFUN ("progn", Fprogn, Sprogn, 0, UNEVALLED, 0,
274: "Eval arguments in sequence, and return the value of the last one.")
275: (args)
276: Lisp_Object args;
277: {
278: register Lisp_Object val, tem;
279: Lisp_Object args_left;
280: struct gcpro gcpro1;
281:
282: /* In Mocklisp code, symbols at the front of the progn arglist
283: are to be bound to zero. */
284: if (!EQ (Vmocklisp_arguments, Qt))
285: {
286: val = make_number (0);
287: while (!NULL (args) && (tem = Fcar (args), XTYPE (tem) == Lisp_Symbol))
288: specbind (tem, val), args = Fcdr (args);
289: }
290:
291: if (NULL(args))
292: return Qnil;
293:
294: args_left = args;
295: GCPRO1 (args_left);
296:
297: do
298: {
299: val = Feval (Fcar (args_left));
300: args_left = Fcdr (args_left);
301: }
302: while (!NULL(args_left));
303:
304: UNGCPRO;
305: return val;
306: }
307:
308: DEFUN ("prog1", Fprog1, Sprog1, 1, UNEVALLED, 0,
309: "Eval arguments in sequence, then return the FIRST arg's value.\n\
310: This value is saved during the evaluation of the remaining args,\n\
311: whose values are discarded.")
312: (args)
313: Lisp_Object args;
314: {
315: Lisp_Object val;
316: register Lisp_Object args_left;
317: struct gcpro gcpro1, gcpro2;
318: register int argnum = 0;
319:
320: if (NULL(args))
321: return Qnil;
322:
323: args_left = args;
324: val = Qnil;
325: GCPRO2 (args, val);
326:
327: do
328: {
329: if (!(argnum++))
330: val = Feval (Fcar (args_left));
331: else
332: Feval (Fcar (args_left));
333: args_left = Fcdr (args_left);
334: }
335: while (!NULL(args_left));
336:
337: UNGCPRO;
338: return val;
339: }
340:
341: DEFUN ("prog2", Fprog2, Sprog2, 2, UNEVALLED, 0,
342: "Eval arguments in sequence, then return the SECOND arg's value.\n\
343: This value is saved during the evaluation of the remaining args,\n\
344: whose values are discarded.")
345: (args)
346: Lisp_Object args;
347: {
348: Lisp_Object val;
349: register Lisp_Object args_left;
350: struct gcpro gcpro1, gcpro2;
351: register int argnum = -1;
352:
353: val = Qnil;
354:
355: if (NULL(args))
356: return Qnil;
357:
358: args_left = args;
359: val = Qnil;
360: GCPRO2 (args, val);
361:
362: do
363: {
364: if (!(argnum++))
365: val = Feval (Fcar (args_left));
366: else
367: Feval (Fcar (args_left));
368: args_left = Fcdr (args_left);
369: }
370: while (!NULL(args_left));
371:
372: UNGCPRO;
373: return val;
374: }
375:
376: DEFUN ("setq", Fsetq, Ssetq, 0, UNEVALLED, 0,
377: "(setq SYM VAL SYM VAL ...) sets each SYM to the value of its VAL.\n\
378: The SYMs are not evaluated. Thus (setq x y) sets x to the value of y.\n\
379: Each SYM is set before the next VAL is computed.")
380: (args)
381: Lisp_Object args;
382: {
383: register Lisp_Object args_left;
384: register Lisp_Object val, sym;
385: struct gcpro gcpro1;
386:
387: if (NULL(args))
388: return Qnil;
389:
390: args_left = args;
391: GCPRO1 (args);
392:
393: do
394: {
395: val = Feval (Fcar (Fcdr (args_left)));
396: sym = Fcar (args_left);
397: Fset (sym, val);
398: args_left = Fcdr (Fcdr (args_left));
399: }
400: while (!NULL(args_left));
401:
402: UNGCPRO;
403: return val;
404: }
405:
406: DEFUN ("quote", Fquote, Squote, 1, UNEVALLED, 0,
407: "Return the argument, without evaluating it. (quote x) yields x.")
408: (args)
409: Lisp_Object args;
410: {
411: return Fcar (args);
412: }
413:
414: DEFUN ("function", Ffunction, Sfunction, 1, UNEVALLED, 0,
415: "Quote a function object.\n\
416: Equivalent to the quote function in the interpreter,\n\
417: but causes the compiler to compile the argument as a function\n\
418: if it is not a symbol.")
419: (args)
420: Lisp_Object args;
421: {
422: return Fcar (args);
423: }
424:
425: DEFUN ("interactive-p", Finteractive_p, Sinteractive_p, 0, UNEVALLED, 0,
426: "Return t if function in which this appears was called interactively.\n\
427: Also, input must be coming from the terminal.")
428: ()
429: {
430: register struct backtrace *btp;
431: register Lisp_Object fun;
432:
433: if (!INTERACTIVE)
434: return Qnil;
435: /* Note that interactive-p takes UNEVALLED args
436: so that its own frame does not terminate this loop. */
437: for (btp = backtrace_list;
438: btp && (btp->nargs == UNEVALLED
439: || EQ (*btp->function, Qbytecode));
440: btp = btp->next)
441: {}
442: /* btp now points at the frame of the innermost function
443: that DOES eval its args.
444: If it is a built-in function (such as load or eval-region)
445: return nil. */
446: fun = *btp->function;
447: while (XTYPE (fun) == Lisp_Symbol)
448: fun = Fsymbol_function (fun);
449: if (XTYPE (fun) == Lisp_Subr)
450: return Qnil;
451: /* btp points to the frame of a Lisp function that called interactive-p.
452: Return t if that function was called interactively. */
453: if (btp && btp->next && EQ (*btp->next->function, Qcall_interactively))
454: return Qt;
455: return Qnil;
456: }
457:
458: DEFUN ("defun", Fdefun, Sdefun, 2, UNEVALLED, 0,
459: "(defun NAME ARGLIST [DOCSTRING] BODY...) defines NAME as a function.\n\
460: The definition is (lambda ARGLIST [DOCSTRING] BODY...).\n\
461: See also the function interactive .")
462: (args)
463: Lisp_Object args;
464: {
465: register Lisp_Object fn_name;
466: register Lisp_Object defn;
467:
468: fn_name = Fcar (args);
469: defn = Fcons (Qlambda, Fcdr (args));
470: if (!NULL (Vpurify_flag))
471: defn = Fpurecopy (defn);
472: Ffset (fn_name, defn);
473: return fn_name;
474: }
475:
476: DEFUN ("defmacro", Fdefmacro, Sdefmacro, 2, UNEVALLED, 0,
477: "(defmacro NAME ARGLIST [DOCSTRING] BODY...) defines NAME as a macro.\n\
478: The definition is (macro lambda ARGLIST [DOCSTRING] BODY...).\n\
479: When the macro is called, as in (NAME ARGS...),\n\
480: the function (lambda ARGLIST BODY...) is applied to\n\
481: the list ARGS... as it appears in the expression,\n\
482: and the result should be a form to be evaluated instead of the original.")
483: (args)
484: Lisp_Object args;
485: {
486: register Lisp_Object fn_name;
487: register Lisp_Object defn;
488:
489: fn_name = Fcar (args);
490: defn = Fcons (Qmacro, Fcons (Qlambda, Fcdr (args)));
491: if (!NULL (Vpurify_flag))
492: defn = Fpurecopy (defn);
493: Ffset (fn_name, defn);
494: return fn_name;
495: }
496:
497: DEFUN ("defvar", Fdefvar, Sdefvar, 1, UNEVALLED, 0,
498: "(defvar SYMBOL INITVALUE DOCSTRING) defines SYMBOL as an advertised variable.\n\
499: INITVALUE is evaluated, and used to set SYMBOL, only if SYMBOL's value is void.\n\
500: INITVALUE and DOCSTRING are optional.\n\
501: If DOCSTRING starts with *, this variable is identified as a user option.\n\
502: If INITVALUE is missing, SYMBOL's value is not set.")
503: (args)
504: Lisp_Object args;
505: {
506: register Lisp_Object sym, tem;
507:
508: sym = Fcar (args);
509: tem = Fcdr (args);
510: if (!NULL (tem))
511: {
512: tem = Fboundp (sym);
513: if (NULL (tem))
514: Fset (sym, Feval (Fcar (Fcdr (args))));
515: }
516: tem = Fcar (Fcdr (Fcdr (args)));
517: if (!NULL (tem))
518: {
519: if (!NULL (Vpurify_flag))
520: tem = Fpurecopy (tem);
521: Fput (sym, Qvariable_documentation, tem);
522: }
523: return sym;
524: }
525:
526: DEFUN ("defconst", Fdefconst, Sdefconst, 2, UNEVALLED, 0,
527: "(defconst SYMBOL INITVALUE DOCSTRING) defines SYMBOL as an advertised constant.\n\
528: The intent is that programs do not change this value (but users may).\n\
529: Always sets the value of SYMBOL to the result of evalling INITVALUE.\n\
530: DOCSTRING is optional.\n\
531: If DOCSTRING starts with *, this variable is identified as a user option.")
532: (args)
533: Lisp_Object args;
534: {
535: register Lisp_Object sym, tem;
536:
537: sym = Fcar (args);
538: Fset (sym, Feval (Fcar (Fcdr (args))));
539: tem = Fcar (Fcdr (Fcdr (args)));
540: if (!NULL (tem))
541: {
542: if (!NULL (Vpurify_flag))
543: tem = Fpurecopy (tem);
544: Fput (sym, Qvariable_documentation, tem);
545: }
546: return sym;
547: }
548:
549: DEFUN ("user-variable-p", Fuser_variable_p, Suser_variable_p, 1, 1, 0,
550: "Returns t if VARIABLE is intended to be set and modified by users,\n\
551: as opposed to by programs.\n\
552: Determined by whether the first character of the documentation\n\
553: for the variable is \"*\"")
554: (variable)
555: Lisp_Object variable;
556: {
557: Lisp_Object documentation;
558:
559: documentation = Fget (variable, Qvariable_documentation);
560: if ((XTYPE (documentation) == Lisp_String) &&
561: ((unsigned char) XSTRING (documentation)->data[0] == '*'))
562: return Qt;
563: else return Qnil;
564: }
565:
566:
567: DEFUN ("let*", FletX, SletX, 1, UNEVALLED, 0,
568: "(let* VARLIST BODY...) binds variables according to VARLIST then executes BODY.\n\
569: The value of the last form in BODY is returned.\n\
570: Each element of VARLIST is a symbol (which is bound to NIL)\n\
571: or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).\n\
572: Each VALUEFORM can refer to the symbols already bound by this VARLIST.")
573: (args)
574: Lisp_Object args;
575: {
576: Lisp_Object varlist, val, elt;
577: int count = specpdl_ptr - specpdl;
578: struct gcpro gcpro1, gcpro2, gcpro3;
579:
580: GCPRO3(args, elt, varlist);
581:
582: varlist = Fcar (args);
583: while (!NULL (varlist))
584: {
585: elt = Fcar (varlist);
586: if (XTYPE (elt) == Lisp_Symbol)
587: specbind (elt, Qnil);
588: else
589: {
590: val = Feval (Fcar (Fcdr (elt)));
591: specbind (Fcar (elt), val);
592: }
593: varlist = Fcdr (varlist);
594: }
595: UNGCPRO;
596: val = Fprogn (Fcdr (args));
597: unbind_to (count);
598: return val;
599: }
600:
601: DEFUN ("let", Flet, Slet, 1, UNEVALLED, 0,
602: "(let VARLIST BODY...) binds variables according to VARLIST then executes BODY.\n\
603: The value of the last form in BODY is returned.\n\
604: Each element of VARLIST is a symbol (which is bound to NIL)\n\
605: or a list (SYMBOL VALUEFORM) (which binds SYMBOL to the value of VALUEFORM).\n\
606: All the VALUEFORMs are evalled before any symbols are bound.")
607: (args)
608: Lisp_Object args;
609: {
610: Lisp_Object *temps, tem;
611: register Lisp_Object elt, varlist;
612: int count = specpdl_ptr - specpdl;
613: register int argnum;
614: struct gcpro gcpro1, gcpro2;
615:
616: varlist = Fcar (args);
617:
618: /* Make space to hold the values to give the bound variables */
619: elt = Flength (varlist);
620: temps = (Lisp_Object *) alloca (XFASTINT (elt) * sizeof (Lisp_Object));
621:
622: /* Compute the values and store them in `temps' */
623:
624: GCPRO2 (args, *temps);
625: gcpro2.nvars = 0;
626:
627: for (argnum = 0; !NULL (varlist); varlist = Fcdr (varlist))
628: {
629: elt = Fcar (varlist);
630: if (XTYPE (elt) == Lisp_Symbol)
631: temps [argnum++] = Qnil;
632: else
633: temps [argnum++] = Feval (Fcar (Fcdr (elt)));
634: gcpro2.nvars = argnum;
635: }
636: UNGCPRO;
637:
638: varlist = Fcar (args);
639: for (argnum = 0; !NULL (varlist); varlist = Fcdr (varlist))
640: {
641: elt = Fcar (varlist);
642: tem = temps[argnum++];
643: if (XTYPE (elt) == Lisp_Symbol)
644: specbind (elt, tem);
645: else
646: specbind (Fcar (elt), tem);
647: }
648:
649: elt = Fprogn (Fcdr (args));
650: unbind_to (count);
651: return elt;
652: }
653:
654: DEFUN ("while", Fwhile, Swhile, 1, UNEVALLED, 0,
655: "(while TEST BODY...) if TEST yields non-NIL, execute the BODY forms and repeat.")
656: (args)
657: Lisp_Object args;
658: {
659: Lisp_Object test, body, tem;
660: struct gcpro gcpro1, gcpro2;
661:
662: GCPRO2 (test, body);
663:
664: test = Fcar (args);
665: body = Fcdr (args);
666: while (tem = Feval (test), !NULL (tem))
667: {
668: QUIT;
669: Fprogn (body);
670: }
671:
672: UNGCPRO;
673: return Qnil;
674: }
675:
676: DEFUN ("macroexpand", Fmacroexpand, Smacroexpand, 1, 2, 0,
677: "If FORM is a macro call, expand it.\n\
678: If the result of expansion is another macro call, expand it, etc.\n\
679: Return the ultimate expansion.\n\
680: The second optional arg ENVIRONMENT species an environment of macro\n\
681: definitions to shadow the loaded ones for use in file byte-compilation.")
682: (form, env)
683: register Lisp_Object form;
684: Lisp_Object env;
685: {
686: register Lisp_Object expander, sym, def, tem;
687:
688: while (1)
689: {
690: /* Come back here each time we expand a macro call,
691: in case it expands into another macro call. */
692: if (XTYPE (form) != Lisp_Cons)
693: break;
694: sym = XCONS (form)->car;
695: if (XTYPE (sym) != Lisp_Symbol)
696: break;
697: /* Trace symbols aliases to other symbols
698: until we get a symbol that is not an alias. */
699: while (1)
700: {
701: tem = Fassq (sym, env);
702: if (NULL (tem))
703: {
704: def = XSYMBOL (sym)->function;
705: if (XTYPE (def) == Lisp_Symbol && !EQ (def, Qunbound))
706: sym = def;
707: else
708: break;
709: }
710: else
711: {
712: if (XTYPE (tem) == Lisp_Cons
713: && XTYPE (XCONS (tem)->cdr) == Lisp_Symbol)
714: sym = XCONS (tem)->cdr;
715: else
716: break;
717: }
718: }
719: /* Right now TEM is the result from SYM in ENV,
720: and if TEM is nil then DEF is SYM's function definition. */
721: if (NULL (tem))
722: {
723: /* SYM is not mentioned in ENV.
724: Look at its function definition. */
725: if (EQ (def, Qunbound)
726: || XTYPE (def) != Lisp_Cons)
727: /* Not defined or definition not suitable */
728: break;
729: if (EQ (XCONS (def)->car, Qautoload))
730: {
731: /* Autoloading function: will it be a macro when loaded? */
732: tem = Fnth (make_number (4), def);
733: if (NULL (tem))
734: break;
735: /* Yes, load it and try again. */
736: do_autoload (def, sym);
737: continue;
738: }
739: else if (!EQ (XCONS (def)->car, Qmacro))
740: break;
741: else expander = XCONS (def)->cdr;
742: }
743: else
744: {
745: expander = XCONS (tem)->cdr;
746: if (NULL (expander))
747: break;
748: }
749: form = Fapply (expander, XCONS (form)->cdr);
750: }
751: return form;
752: }
753:
754: DEFUN ("catch", Fcatch, Scatch, 1, UNEVALLED, 0,
755: "(catch TAG BODY...) perform BODY allowing nonlocal exits using (throw TAG).\n\
756: TAG is evalled to get the tag to use. throw to that tag exits this catch.\n\
757: Then the BODY is executed. If no throw happens, the value of the last BODY\n\
758: form is returned from catch. If a throw happens, it specifies the value to\n\
759: return from catch.")
760: (args)
761: Lisp_Object args;
762: {
763: Lisp_Object val;
764: int count = specpdl_ptr - specpdl;
765: struct gcpro *gcpro = gcprolist;
766: struct gcpro gcpro1;
767: struct catchtag c;
768: struct handler *hlist = handlerlist;
769:
770: c.tag = Feval (Fcar (args));
771: c.val = Qnil;
772: c.backlist = backtrace_list;
773: c.lisp_eval_depth = lisp_eval_depth;
774: if (_setjmp (c.jmp))
775: {
776: catchlist = c.next;
777: handlerlist = hlist;
778: backtrace_list = c.backlist;
779: lisp_eval_depth = c.lisp_eval_depth;
780: gcprolist = gcpro;
781: GCPRO1 (c.val);
782: unbind_to (count);
783: UNGCPRO;
784: return c.val;
785: }
786: c.next = catchlist;
787: catchlist = &c;
788: val = Fprogn (Fcdr (args));
789: catchlist = c.next;
790: return val;
791: }
792:
793: /* Set up a catch, then call C function `func'.
794: This is how catches are done from within C code. */
795:
796: Lisp_Object
797: internal_catch (tag, func, arg)
798: Lisp_Object tag;
799: Lisp_Object (*func) ();
800: Lisp_Object arg;
801: {
802: int count = specpdl_ptr - specpdl;
803: struct gcpro *gcpro = gcprolist;
804: struct gcpro gcpro1;
805: struct catchtag c;
806: struct handler *hlist = handlerlist;
807: Lisp_Object val;
808:
809: c.tag = tag;
810: c.val = Qnil;
811: c.backlist = backtrace_list;
812: c.lisp_eval_depth = lisp_eval_depth;
813: if (_setjmp (c.jmp))
814: {
815: catchlist = c.next;
816: handlerlist = hlist;
817: backtrace_list = c.backlist;
818: lisp_eval_depth = c.lisp_eval_depth;
819: gcprolist = gcpro;
820: GCPRO1 (c.val);
821: unbind_to (count);
822: UNGCPRO;
823: return c.val;
824: }
825: c.next = catchlist;
826: catchlist = &c;
827: val = (*func) (arg);
828: catchlist = c.next;
829: return val;
830: }
831:
832: DEFUN ("throw", Fthrow, Sthrow, 2, 2, 0,
833: "(throw TAG VALUE): throw to the catch for TAG and return VALUE from it.\n\
834: Both TAG and VALUE are evalled.")
835: (tag, val)
836: register Lisp_Object tag, val;
837: {
838: register struct catchtag *c;
839:
840: while (1)
841: {
842: if (!NULL (tag))
843: for (c = catchlist; c; c = c->next)
844: {
845: if (EQ (c->tag, tag))
846: {
847: c->val = val;
848: _longjmp (c->jmp, 1);
849: }
850: }
851: tag = Fsignal (Qno_catch, Fcons (tag, Fcons (val, Qnil)));
852: }
853: }
854:
855: DEFUN ("unwind-protect", Funwind_protect, Sunwind_protect, 1, UNEVALLED, 0,
856: "(unwind-protect BODYFORM UNWINDFORMS...) do BODYFORM, protecting with UNWINDFORMS.\n\
857: If BODYFORM completes normally, its value is returned\n\
858: after executing the UNWINDFORMS.\n\
859: If BODYFORM exits nonlocally, the UNWINDFORMS are executed anyway.")
860: (args)
861: Lisp_Object args;
862: {
863: Lisp_Object val;
864: int count = specpdl_ptr - specpdl;
865: struct gcpro gcpro1;
866:
867: record_unwind_protect (0, Fcdr (args));
868: (specpdl_ptr - 1)->symbol = Qnil;
869: val = Feval (Fcar (args));
870: GCPRO1 (val);
871: unbind_to (count);
872: UNGCPRO;
873: return val;
874: }
875:
876: struct handler *handlerlist;
877:
878: DEFUN ("condition-case", Fcondition_case, Scondition_case, 2, UNEVALLED, 0,
879: "Regain control when an error is signaled.\n\
880: (condition-case VAR BODYFORM HANDLERS...)\n\
881: executes BODYFORM and returns its value if no error happens.\n\
882: Each element of HANDLERS looks like (CONDITION-NAME BODY...)\n\
883: where the BODY is made of Lisp expressions.\n\
884: The handler is applicable to an error\n\
885: if CONDITION-NAME is one of the error's condition names.\n\
886: When a handler handles an error,\n\
887: control returns to the condition-case and the handler BODY... is executed\n\
888: with VAR bound to (SIGNALED-CONDITIONS . SIGNAL-DATA).\n\
889: The value of the last BODY form is returned from the condition-case.\n\
890: See SIGNAL for more info.")
891: (args)
892: Lisp_Object args;
893: {
894: register Lisp_Object val;
895: int count = specpdl_ptr - specpdl;
896: struct gcpro *gcpro = gcprolist;
897: struct gcpro gcpro1, gcpro2;
898: struct catchtag c;
899: struct handler h;
900: register Lisp_Object tem;
901:
902: tem = Fcar (args);
903: CHECK_SYMBOL (tem, 0);
904:
905: c.tag = Qnil;
906: c.val = Qnil;
907: c.backlist = backtrace_list;
908: c.lisp_eval_depth = lisp_eval_depth;
909: if (_setjmp (c.jmp))
910: {
911: catchlist = c.next;
912: handlerlist = h.next;
913: backtrace_list = c.backlist;
914: lisp_eval_depth = c.lisp_eval_depth;
915: gcprolist = gcpro;
916: GCPRO2 (c.val, h.var);
917: unbind_to (count);
918: UNGCPRO;
919: if (!NULL (h.var))
920: specbind (h.var, Fcdr (c.val));
921: val = Fprogn (Fcdr (Fcar (c.val)));
922: unbind_to (count);
923: return val;
924: }
925: c.next = catchlist;
926: catchlist = &c;
927: h.var = Fcar (args);
928: h.handler = Fcdr (Fcdr (args));
929:
930: for (val = h.handler; NULL (val); val = Fcdr (val))
931: {
932: tem = Fcar (val);
933: if ((!NULL (tem)) &&
934: (!LISTP (tem) || (XTYPE (XCONS (tem)->car) != Lisp_Symbol)))
935: error ("Illegal condition handler", tem);
936: }
937:
938: h.next = handlerlist;
939: h.tag = &c;
940: handlerlist = &h;
941:
942: val = Feval (Fcar (Fcdr (args)));
943: catchlist = c.next;
944: handlerlist = h.next;
945: return val;
946: }
947:
948: Lisp_Object
949: internal_condition_case (bfun, handlers, hfun)
950: Lisp_Object (*bfun) ();
951: Lisp_Object handlers;
952: Lisp_Object (*hfun) ();
953: {
954: Lisp_Object val;
955: int count = specpdl_ptr - specpdl;
956: struct gcpro *gcpro = gcprolist;
957: struct catchtag c;
958: struct handler h;
959:
960: c.tag = Qnil;
961: c.val = Qnil;
962: c.backlist = backtrace_list;
963: c.lisp_eval_depth = lisp_eval_depth;
964: if (_setjmp (c.jmp))
965: {
966: backtrace_list = c.backlist;
967: catchlist = &c;
968: handlerlist = &h;
969: /* Unbind with handler still in effect.
970: This is so that errors in unwind-protect unwind forms
971: do first not escape this contour.
972: But remove any handlers established within this one,
973: since their stack frames no longer exist. */
974: unbind_to (count);
975: catchlist = c.next;
976: handlerlist = h.next;
977: lisp_eval_depth = c.lisp_eval_depth;
978: gcprolist = gcpro;
979: return (*hfun) (Fcdr (c.val));
980: }
981: c.next = catchlist;
982: catchlist = &c;
983: h.handler = handlers;
984: h.var = Qnil;
985: h.next = handlerlist;
986: h.tag = &c;
987: handlerlist = &h;
988:
989: val = (*bfun) ();
990: catchlist = c.next;
991: handlerlist = h.next;
992: return val;
993: }
994:
995: static Lisp_Object find_handler_clause ();
996:
997: DEFUN ("signal", Fsignal, Ssignal, 2, 2, 0,
998: "Signal an error. Args are SIGNAL-NAME, and associated DATA.\n\
999: A signal name is a symbol with an error-conditions property\n\
1000: that is a list of condition names.\n\
1001: A handler for any of those names will get to handle this signal.\n\
1002: The symbol error should always be one of them.\n\
1003: \n\
1004: DATA should be a list. Its elements are printed as part of the error message.\n\
1005: If the signal is handled, DATA is made available to the handler.\n\
1006: See condition-case.")
1007: (sig, data)
1008: Lisp_Object sig, data;
1009: {
1010: register struct handler *allhandlers = handlerlist;
1011: Lisp_Object conditions;
1012: extern int gc_in_progress;
1013: extern int waiting_for_input;
1014: Lisp_Object debugger_value;
1015:
1016: immediate_quit = 0;
1017: if (gc_in_progress || waiting_for_input)
1018: abort ();
1019:
1020: conditions = Fget (sig, Qerror_conditions);
1021:
1022: for (; handlerlist; handlerlist = handlerlist->next)
1023: {
1024: register Lisp_Object clause;
1025: clause = find_handler_clause (handlerlist->handler, conditions,
1026: sig, data, &debugger_value);
1027:
1028: /* If have called debugger and user wants to continue,
1029: just return nil. */
1030: if (EQ (clause, Qlambda))
1031: return debugger_value;
1032:
1033: if (!NULL (clause))
1034: {
1035: struct handler *h = handlerlist;
1036: handlerlist = allhandlers;
1037: h->tag->val = Fcons (clause, Fcons (sig, data));
1038: _longjmp (h->tag->jmp, 1);
1039: }
1040: }
1041:
1042: handlerlist = allhandlers;
1043: debugger (sig, data);
1044: return Qnil;
1045: }
1046:
1047: /* Value of Qlambda means we have called debugger and
1048: user has continued. Store value returned fromdebugger
1049: into *debugger_value_ptr */
1050:
1051: static Lisp_Object
1052: find_handler_clause (handlers, conditions, sig, data, debugger_value_ptr)
1053: Lisp_Object handlers, conditions, sig, data;
1054: Lisp_Object *debugger_value_ptr;
1055: {
1056: register Lisp_Object h;
1057: register Lisp_Object tem;
1058: register Lisp_Object tem1;
1059:
1060: if (EQ (handlers, Qt)) /* t is used by handlers for all conditions, set up by C code. */
1061: return Qt;
1062: if (EQ (handlers, Qerror)) /* error is used similarly, but means display a backtrace too */
1063: {
1064: if (stack_trace_on_error)
1065: internal_with_output_to_temp_buffer ("*Backtrace*", Fbacktrace, Qnil);
1066: if (EQ (sig, Qquit) ? debug_on_quit : debug_on_error)
1067: {
1068: *debugger_value_ptr =
1069: call_debugger (Fcons (Qerror,
1070: Fcons (Fcons (sig, data),
1071: Qnil)));
1072: return Qlambda;
1073: }
1074: return Qt;
1075: }
1076: for (h = handlers; LISTP (h); h = Fcdr (h))
1077: {
1078: tem1 = Fcar (h);
1079: if (!LISTP (tem1))
1080: continue;
1081: tem = Fmemq (Fcar (tem1), conditions);
1082: if (!NULL (tem))
1083: return tem1;
1084: }
1085: return Qnil;
1086: }
1087:
1088: /* dump an error message; called like printf */
1089:
1090: /* VARARGS 1 */
1091: void
1092: error (m, a1, a2, a3)
1093: char *m;
1094: {
1095: char buf[200];
1096: sprintf (buf, m, a1, a2, a3);
1097: while (1)
1098: Fsignal (Qerror, Fcons (build_string (buf), Qnil));
1099: }
1100:
1101: DEFUN ("commandp", Fcommandp, Scommandp, 1, 1, 0,
1102: "T if FUNCTION makes provisions for interactive calling.\n\
1103: This means it contains a description for how to read arguments to give it.\n\
1104: The value is nil for an invalid function or a symbol with no function definition.\n\
1105: \n\
1106: Interactively callable functions include strings (treated as keyboard macros),\n\
1107: lambda-expressions that contain a top-level call to interactive ,\n\
1108: autoload definitions made by autoload with non-nil fourth argument,\n\
1109: and some of the built-in functions of Lisp.\n\
1110: \n\
1111: Also, a symbol is commandp if its function definition is commandp.")
1112: (function)
1113: Lisp_Object function;
1114: {
1115: register Lisp_Object fun;
1116: register Lisp_Object funcar;
1117: register Lisp_Object tem;
1118: register int i = 0;
1119:
1120: fun = function;
1121: while (XTYPE (fun) == Lisp_Symbol)
1122: {
1123: if (++i > 10) return Qnil;
1124: tem = Ffboundp (fun);
1125: if (NULL (tem)) return Qnil;
1126: fun = Fsymbol_function (fun);
1127: }
1128: if (XTYPE (fun) == Lisp_Subr)
1129: if (XSUBR (fun)->prompt)
1130: return Qt;
1131: else
1132: return Qnil;
1133: if (XTYPE (fun) == Lisp_Vector || XTYPE (fun) == Lisp_String)
1134: return Qt;
1135: if (!LISTP(fun))
1136: return Qnil;
1137: funcar = Fcar (fun);
1138: if (XTYPE (funcar) != Lisp_Symbol)
1139: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1140: if (EQ (funcar, Qlambda))
1141: return Fassq (Qinteractive, Fcdr (Fcdr (fun)));
1142: if (EQ (funcar, Qmocklisp))
1143: return Qt; /* All mocklisp functions can be called interactively */
1144: if (EQ (funcar, Qautoload))
1145: return Fcar (Fcdr (Fcdr (Fcdr (fun))));
1146: else
1147: return Qnil;
1148: }
1149:
1150: /* ARGSUSED */
1151: DEFUN ("autoload", Fautoload, Sautoload, 2, 5, 0,
1152: "Define FUNCTION to autoload from FILE.\n\
1153: FUNCTION is a symbol; FILE is a file name string to pass to load.\n\
1154: Third arg DOCSTRING is documentation for the function.\n\
1155: Fourth arg INTERACTIVE if non-nil says function can be called interactively.\n\
1156: Fifth arg MACRO if non-nil says the function is really a macro.\n\
1157: Third through fifth args give info about the real definition.\n\
1158: They default to nil.\n\
1159: If FUNCTION is already defined, this does nothing and returns nil.")
1160: (function, file, docstring, interactive, macro)
1161: Lisp_Object function, file, docstring, interactive, macro;
1162: {
1163: #ifdef NO_ARG_ARRAY
1164: Lisp_Object args[4];
1165: #endif
1166:
1167: CHECK_SYMBOL (function, 0);
1168: CHECK_STRING (file, 1);
1169:
1170: /* If function is defined and not as an autoload, don't override */
1171: if (!EQ (XSYMBOL (function)->function, Qunbound)
1172: && !(XTYPE (XSYMBOL (function)->function) == Lisp_Cons
1173: && EQ (XCONS (XSYMBOL (function)->function)->car, Qautoload)))
1174: return Qnil;
1175:
1176: #ifdef NO_ARG_ARRAY
1177: args[0] = file;
1178: args[1] = docstring;
1179: args[2] = interactive;
1180: args[3] = macro;
1181:
1182: return Ffset (function, Fcons (Qautoload, Flist (4, &args)));
1183: #else /* NO_ARG_ARRAY */
1184: return Ffset (function, Fcons (Qautoload, Flist (4, &file)));
1185: #endif /* not NO_ARG_ARRAY */
1186: }
1187:
1188: Lisp_Object
1189: un_autoload (oldqueue)
1190: Lisp_Object oldqueue;
1191: {
1192: register Lisp_Object queue, first, second;
1193:
1194: /* Queue to unwind is current value of Vautoload_queue.
1195: oldqueue is the shadowed value to leave in Vautoload_queue. */
1196: queue = Vautoload_queue;
1197: Vautoload_queue = oldqueue;
1198: while (LISTP (queue))
1199: {
1200: first = Fcar (queue);
1201: second = Fcdr (first);
1202: first = Fcar (first);
1203: if (EQ (second, Qnil))
1204: Vfeatures = first;
1205: else
1206: Ffset (first, second);
1207: queue = Fcdr (queue);
1208: }
1209: return Qnil;
1210: }
1211:
1212: do_autoload (fundef, funname)
1213: Lisp_Object fundef, funname;
1214: {
1215: int count = specpdl_ptr - specpdl;
1216: Lisp_Object fun, val;
1217:
1218: fun = funname;
1219:
1220: /* Value saved here is to be restored into Vautoload_queue */
1221: record_unwind_protect (un_autoload, Vautoload_queue);
1222: Vautoload_queue = Qt;
1223: Fload (Fcar (Fcdr (fundef)), Qnil, noninteractive ? Qt : Qnil);
1224: /* Once loading finishes, don't undo it. */
1225: Vautoload_queue = Qt;
1226: unbind_to (count);
1227:
1228: while (XTYPE (fun) == Lisp_Symbol)
1229: {
1230: val = XSYMBOL (fun)->function;
1231: if (EQ (val, Qunbound))
1232: Fsymbol_function (fun); /* Get the right kind of error! */
1233: fun = val;
1234: }
1235: if (XTYPE (fun) == Lisp_Cons
1236: && EQ (XCONS (fun)->car, Qautoload))
1237: error ("Autoloading failed to define function %s",
1238: XSYMBOL (funname)->name->data);
1239: }
1240:
1241: DEFUN ("eval", Feval, Seval, 1, 1, 0,
1242: "Evaluate FORM and return its value.")
1243: (form)
1244: Lisp_Object form;
1245: {
1246: Lisp_Object fun, val, original_fun, original_args;
1247: Lisp_Object funcar;
1248: struct backtrace backtrace;
1249: struct gcpro gcpro1, gcpro2, gcpro3;
1250:
1251: if (XTYPE (form) == Lisp_Symbol)
1252: {
1253: if (EQ (Vmocklisp_arguments, Qt))
1254: return Fsymbol_value (form);
1255: val = Fsymbol_value (form);
1256: if (NULL (val))
1257: XFASTINT (val) = 0;
1258: else if (EQ (val, Qt))
1259: XFASTINT (val) = 1;
1260: return val;
1261: }
1262: if (!LISTP (form))
1263: return form;
1264:
1265: QUIT;
1266: if (consing_since_gc > gc_cons_threshold)
1267: {
1268: GCPRO1 (form);
1269: Fgarbage_collect ();
1270: UNGCPRO;
1271: }
1272:
1273: if (++lisp_eval_depth > max_lisp_eval_depth)
1274: {
1275: if (max_lisp_eval_depth < 100)
1276: max_lisp_eval_depth = 100;
1277: if (lisp_eval_depth > max_lisp_eval_depth)
1278: error ("Lisp nesting exceeds max-lisp-eval-depth");
1279: }
1280:
1281: original_fun = Fcar (form);
1282: original_args = Fcdr (form);
1283:
1284: backtrace.next = backtrace_list;
1285: backtrace_list = &backtrace;
1286: backtrace.function = &original_fun; /* This also protects them from gc */
1287: backtrace.args = &original_args;
1288: backtrace.nargs = UNEVALLED;
1289: backtrace.evalargs = 1;
1290: backtrace.debug_on_exit = 0;
1291:
1292: if (debug_on_next_call)
1293: do_debug_on_call (Qt);
1294:
1295: /* At this point, only original_fun and original_args
1296: have values that will be used below */
1297: retry:
1298: fun = original_fun;
1299: while (XTYPE (fun) == Lisp_Symbol)
1300: {
1301: val = XSYMBOL (fun)->function;
1302: if (EQ (val, Qunbound))
1303: Fsymbol_function (fun); /* Get the right kind of error! */
1304: fun = val;
1305: }
1306:
1307: if (XTYPE (fun) == Lisp_Subr)
1308: {
1309: Lisp_Object numargs;
1310: Lisp_Object argvals[5];
1311: Lisp_Object args_left;
1312: register int i, maxargs;
1313:
1314: args_left = original_args;
1315: numargs = Flength (args_left);
1316:
1317: if (XINT (numargs) < XSUBR (fun)->min_args ||
1318: (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < XINT (numargs)))
1319: return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
1320:
1321: if (XSUBR (fun)->max_args == UNEVALLED)
1322: {
1323: backtrace.evalargs = 0;
1324: val = (*XSUBR (fun)->function) (args_left);
1325: goto done;
1326: }
1327:
1328: if (XSUBR (fun)->max_args == MANY)
1329: {
1330: /* Pass a vector of evaluated arguments */
1331: Lisp_Object *vals;
1332: register int argnum = 0;
1333:
1334: vals = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object));
1335:
1336: GCPRO3 (args_left, fun, fun);
1337: gcpro3.var = vals;
1338: gcpro3.nvars = XINT (numargs);
1339:
1340: while (!NULL (args_left))
1341: {
1342: vals[argnum++] = Feval (Fcar (args_left));
1343: args_left = Fcdr (args_left);
1344: }
1345: UNGCPRO;
1346:
1347: backtrace.args = vals;
1348: backtrace.nargs = XINT (numargs);
1349:
1350: val = (*XSUBR (fun)->function) (XINT (numargs), vals);
1351: goto done;
1352: }
1353:
1354: GCPRO3 (args_left, fun, fun);
1355: gcpro3.var = argvals;
1356: gcpro3.nvars = 5;
1357:
1358: maxargs = XSUBR (fun)->max_args;
1359: for (i = 0; i < maxargs; i++, args_left = Fcdr (args_left))
1360: argvals[i] = Feval (Fcar (args_left));
1361:
1362: UNGCPRO;
1363:
1364: backtrace.args = argvals;
1365: backtrace.nargs = XINT (numargs);
1366:
1367: switch (i)
1368: {
1369: case 0:
1370: val = (*XSUBR (fun)->function) ();
1371: goto done;
1372: case 1:
1373: val = (*XSUBR (fun)->function) (argvals[0]);
1374: goto done;
1375: case 2:
1376: val = (*XSUBR (fun)->function) (argvals[0], argvals[1]);
1377: goto done;
1378: case 3:
1379: val = (*XSUBR (fun)->function) (argvals[0], argvals[1],
1380: argvals[2]);
1381: goto done;
1382: case 4:
1383: val = (*XSUBR (fun)->function) (argvals[0], argvals[1],
1384: argvals[2], argvals[3]);
1385: goto done;
1386: case 5:
1387: val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2],
1388: argvals[3], argvals[4]);
1389: goto done;
1390: }
1391: }
1392: if (!LISTP(fun))
1393: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1394: funcar = Fcar (fun);
1395: if (XTYPE (funcar) != Lisp_Symbol)
1396: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1397: if (EQ (funcar, Qautoload))
1398: {
1399: do_autoload (fun, original_fun);
1400: goto retry;
1401: }
1402: if (EQ (funcar, Qmacro))
1403: val = Feval (Fapply (Fcdr (fun), original_args));
1404: else if (EQ (funcar, Qlambda))
1405: val = apply_lambda (fun, original_args, 1);
1406: else if (EQ (funcar, Qmocklisp))
1407: val = ml_apply (fun, original_args);
1408: else
1409: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1410:
1411: done:
1412: if (!EQ (Vmocklisp_arguments, Qt))
1413: {
1414: if (NULL (val))
1415: XFASTINT (val) = 0;
1416: else if (EQ (val, Qt))
1417: XFASTINT (val) = 1;
1418: }
1419: lisp_eval_depth--;
1420: if (backtrace.debug_on_exit)
1421: val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
1422: backtrace_list = backtrace.next;
1423: return val;
1424: }
1425:
1426: DEFUN ("apply", Fapply, Sapply, 2, 2, 0,
1427: "Call FUNCTION with arguments being the elements of ARGS.")
1428: (original_fun, original_args)
1429: Lisp_Object original_fun, original_args;
1430: {
1431: Lisp_Object fun;
1432: Lisp_Object funcar;
1433: Lisp_Object val;
1434: struct backtrace backtrace;
1435: struct gcpro gcpro1, gcpro2;
1436:
1437: QUIT;
1438: if (consing_since_gc > gc_cons_threshold)
1439: {
1440: GCPRO2 (original_fun, original_args);
1441: Fgarbage_collect ();
1442: UNGCPRO;
1443: }
1444:
1445: if (++lisp_eval_depth > max_lisp_eval_depth)
1446: {
1447: if (max_lisp_eval_depth < 100)
1448: max_lisp_eval_depth = 100;
1449: if (lisp_eval_depth > max_lisp_eval_depth)
1450: error ("Lisp nesting exceeds max-lisp-eval-depth");
1451: }
1452:
1453: backtrace.next = backtrace_list;
1454: backtrace_list = &backtrace;
1455: backtrace.function = &original_fun; /* This also protects them */
1456: backtrace.args = &original_args; /* from gc */
1457: backtrace.nargs = MANY;
1458: backtrace.evalargs = 0;
1459: backtrace.debug_on_exit = 0;
1460:
1461: if (debug_on_next_call)
1462: do_debug_on_call (Qlambda);
1463:
1464: retry:
1465:
1466: fun = original_fun;
1467: while (XTYPE (fun) == Lisp_Symbol)
1468: {
1469: val = XSYMBOL (fun)->function;
1470: if (EQ (val, Qunbound))
1471: Fsymbol_function (fun); /* Get the right kind of error! */
1472: fun = val;
1473: }
1474:
1475: if (XTYPE (fun) == Lisp_Subr)
1476: {
1477: Lisp_Object numargs;
1478: Lisp_Object argvals[5];
1479: register Lisp_Object args_left;
1480: register int i, maxargs;
1481:
1482: args_left = original_args;
1483: numargs = Flength (args_left);
1484:
1485: if (XINT (numargs) < XSUBR (fun)->min_args ||
1486: (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < XINT (numargs)))
1487: return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
1488:
1489: if (XSUBR (fun)->max_args == UNEVALLED)
1490: {
1491: val = (*XSUBR (fun)->function) (original_args);
1492: goto done;
1493: }
1494:
1495: if (XSUBR (fun)->max_args == MANY)
1496: {
1497: /* Pass a vector of evaluated arguments */
1498: register Lisp_Object *vals;
1499: register int argnum = 0;
1500:
1501: vals = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object));
1502:
1503: while (!NULL (args_left))
1504: {
1505: vals[argnum++] = Fcar (args_left);
1506: args_left = Fcdr (args_left);
1507: }
1508:
1509: backtrace.args = vals;
1510: backtrace.nargs = argnum;
1511: val = (*XSUBR (fun)->function) (XINT (numargs), vals);
1512: goto done;
1513: }
1514:
1515: maxargs = XSUBR (fun)->max_args;
1516: for (i = 0; i < maxargs; i++, args_left = Fcdr (args_left))
1517: argvals[i] = Fcar (args_left);
1518:
1519: backtrace.args = argvals;
1520: backtrace.nargs = XINT (numargs);
1521:
1522: switch (i)
1523: {
1524: case 0:
1525: val = (*XSUBR (fun)->function) ();
1526: goto done;
1527: case 1:
1528: val = (*XSUBR (fun)->function) (argvals[0]);
1529: goto done;
1530: case 2:
1531: val = (*XSUBR (fun)->function) (argvals[0], argvals[1]);
1532: goto done;
1533: case 3:
1534: val = (*XSUBR (fun)->function) (argvals[0], argvals[1],
1535: argvals[2]);
1536: goto done;
1537: case 4:
1538: val = (*XSUBR (fun)->function) (argvals[0], argvals[1],
1539: argvals[2], argvals[3]);
1540: goto done;
1541: case 5:
1542: val = (*XSUBR (fun)->function) (argvals[0], argvals[1], argvals[2],
1543: argvals[3], argvals[4]);
1544: goto done;
1545: }
1546: }
1547: if (!LISTP(fun))
1548: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1549: funcar = Fcar (fun);
1550: if (XTYPE (funcar) != Lisp_Symbol)
1551: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1552: if (EQ (funcar, Qautoload))
1553: {
1554: do_autoload (fun, original_fun);
1555: goto retry;
1556: }
1557: if (EQ (funcar, Qlambda))
1558: val = apply_lambda (fun, original_args, 0);
1559: else if (EQ (funcar, Qmocklisp))
1560: val = ml_apply (fun, original_args);
1561: else
1562: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1563:
1564: done:
1565: lisp_eval_depth--;
1566: if (backtrace.debug_on_exit)
1567: val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
1568: backtrace_list = backtrace.next;
1569: return val;
1570: }
1571:
1572: /* Call function fn with argument arg */
1573: /* ARGSUSED */
1574: Lisp_Object
1575: call1 (fn, arg)
1576: Lisp_Object fn, arg;
1577: {
1578: #ifdef NO_ARG_ARRAY
1579: Lisp_Object args[2];
1580: args[0] = fn;
1581: args[1] = arg;
1582: return Ffuncall (2, args);
1583: #else /* not NO_ARG_ARRAY */
1584: return Ffuncall (2, &fn);
1585: #endif /* not NO_ARG_ARRAY */
1586: }
1587:
1588: /* Call function fn with arguments arg, arg1 */
1589: /* ARGSUSED */
1590: Lisp_Object
1591: call2 (fn, arg, arg1)
1592: Lisp_Object fn, arg, arg1;
1593: {
1594: #ifdef NO_ARG_ARRAY
1595: Lisp_Object args[3];
1596: args[0] = fn;
1597: args[1] = arg;
1598: args[2] = arg1;
1599: return Ffuncall (3, args);
1600: #else /* not NO_ARG_ARRAY */
1601: return Ffuncall (3, &fn);
1602: #endif /* not NO_ARG_ARRAY */
1603: }
1604:
1605: /* Call function fn with arguments arg, arg1, arg2 */
1606: /* ARGSUSED */
1607: Lisp_Object
1608: call3 (fn, arg, arg1, arg2)
1609: Lisp_Object fn, arg, arg1, arg2;
1610: {
1611: #ifdef NO_ARG_ARRAY
1612: Lisp_Object args[4];
1613: args[0] = fn;
1614: args[1] = arg;
1615: args[2] = arg1;
1616: args[3] = arg2;
1617: return Ffuncall (4, args);
1618: #else /* not NO_ARG_ARRAY */
1619: return Ffuncall (4, &fn);
1620: #endif /* not NO_ARG_ARRAY */
1621: }
1622:
1623: DEFUN ("funcall", Ffuncall, Sfuncall, 1, MANY, 0,
1624: "Call first argument as a function, passing remaining arguments to it.\n\
1625: Thus, (funcall 'cons 'x 'y) returns (x . y).")
1626: (nargs, args)
1627: int nargs;
1628: Lisp_Object *args;
1629: {
1630: Lisp_Object fun;
1631: Lisp_Object funcar;
1632: int numargs = nargs - 1;
1633: Lisp_Object lisp_numargs;
1634: Lisp_Object val;
1635: struct backtrace backtrace;
1636: struct gcpro gcpro1;
1637: register Lisp_Object *internal_args;
1638: register int i;
1639:
1640: QUIT;
1641: if (consing_since_gc > gc_cons_threshold)
1642: {
1643: GCPRO1 (*args);
1644: gcpro1.nvars = nargs;
1645: Fgarbage_collect ();
1646: UNGCPRO;
1647: }
1648:
1649: if (++lisp_eval_depth > max_lisp_eval_depth)
1650: {
1651: if (max_lisp_eval_depth < 100)
1652: max_lisp_eval_depth = 100;
1653: if (lisp_eval_depth > max_lisp_eval_depth)
1654: error ("Lisp nesting exceeds max-lisp-eval-depth");
1655: }
1656:
1657: backtrace.next = backtrace_list;
1658: backtrace_list = &backtrace;
1659: backtrace.function = &args[0];
1660: backtrace.args = &args[1];
1661: backtrace.nargs = nargs - 1;
1662: backtrace.evalargs = 0;
1663: backtrace.debug_on_exit = 0;
1664:
1665: if (debug_on_next_call)
1666: do_debug_on_call (Qlambda);
1667:
1668: retry:
1669:
1670: fun = args[0];
1671: while (XTYPE (fun) == Lisp_Symbol)
1672: {
1673: val = XSYMBOL (fun)->function;
1674: if (EQ (val, Qunbound))
1675: Fsymbol_function (fun); /* Get the right kind of error! */
1676: fun = val;
1677: }
1678:
1679: if (XTYPE (fun) == Lisp_Subr)
1680: {
1681: if (numargs < XSUBR (fun)->min_args ||
1682: (XSUBR (fun)->max_args >= 0 && XSUBR (fun)->max_args < numargs))
1683: {
1684: XFASTINT (lisp_numargs) = numargs;
1685: return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (lisp_numargs, Qnil)));
1686: }
1687:
1688: if (XSUBR (fun)->max_args == UNEVALLED)
1689: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1690:
1691: if (XSUBR (fun)->max_args == MANY)
1692: {
1693: val = (*XSUBR (fun)->function) (numargs, args + 1);
1694: goto done;
1695: }
1696:
1697: if (XSUBR (fun)->max_args > numargs)
1698: {
1699: internal_args = (Lisp_Object *) alloca (XSUBR (fun)->max_args * sizeof (Lisp_Object));
1700: bcopy (args + 1, internal_args, numargs * sizeof (Lisp_Object));
1701: for (i = numargs; i < XSUBR (fun)->max_args; i++)
1702: internal_args[i] = Qnil;
1703: }
1704: else
1705: internal_args = args + 1;
1706: switch (XSUBR (fun)->max_args)
1707: {
1708: case 0:
1709: val = (*XSUBR (fun)->function) ();
1710: goto done;
1711: case 1:
1712: val = (*XSUBR (fun)->function) (internal_args[0]);
1713: goto done;
1714: case 2:
1715: val = (*XSUBR (fun)->function) (internal_args[0],
1716: internal_args[1]);
1717: goto done;
1718: case 3:
1719: val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1720: internal_args[2]);
1721: goto done;
1722: case 4:
1723: val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1724: internal_args[2],
1725: internal_args[3]);
1726: goto done;
1727: case 5:
1728: val = (*XSUBR (fun)->function) (internal_args[0], internal_args[1],
1729: internal_args[2], internal_args[3],
1730: internal_args[4]);
1731: goto done;
1732: }
1733: }
1734: if (!LISTP(fun))
1735: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1736: funcar = Fcar (fun);
1737: if (XTYPE (funcar) != Lisp_Symbol)
1738: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1739: if (EQ (funcar, Qlambda))
1740: val = funcall_lambda (fun, numargs, args + 1);
1741: else if (EQ (funcar, Qmocklisp))
1742: val = ml_apply (fun, Flist (numargs, args + 1));
1743: else if (EQ (funcar, Qautoload))
1744: {
1745: do_autoload (fun, args[0]);
1746: goto retry;
1747: }
1748: else
1749: return Fsignal (Qinvalid_function, Fcons (fun, Qnil));
1750:
1751: done:
1752: lisp_eval_depth--;
1753: if (backtrace.debug_on_exit)
1754: val = call_debugger (Fcons (Qexit, Fcons (val, Qnil)));
1755: backtrace_list = backtrace.next;
1756: return val;
1757: }
1758:
1759: Lisp_Object
1760: apply_lambda (fun, args, eval_flag)
1761: Lisp_Object fun, args;
1762: int eval_flag;
1763: {
1764: Lisp_Object args_left;
1765: Lisp_Object numargs;
1766: register Lisp_Object *arg_vector;
1767: struct gcpro gcpro1, gcpro2, gcpro3;
1768: register int i;
1769: register Lisp_Object tem;
1770:
1771: numargs = Flength (args);
1772: arg_vector = (Lisp_Object *) alloca (XINT (numargs) * sizeof (Lisp_Object));
1773: args_left = args;
1774:
1775: GCPRO3 (*arg_vector, args_left, fun);
1776: gcpro1.nvars = XINT (numargs);
1777:
1778: for (i = 0; i < XINT (numargs); i++)
1779: {
1780: tem = Fcar (args_left), args_left = Fcdr (args_left);
1781: if (eval_flag) tem = Feval (tem);
1782: arg_vector[i] = tem;
1783: }
1784:
1785: UNGCPRO;
1786:
1787: if (eval_flag)
1788: {
1789: backtrace_list->args = arg_vector;
1790: backtrace_list->nargs = i;
1791: }
1792: backtrace_list->evalargs = 0;
1793: tem = funcall_lambda (fun, XINT (numargs), arg_vector);
1794:
1795: /* Do the debug-on-exit now, while arg_vector still exists. */
1796: if (backtrace_list->debug_on_exit)
1797: tem = call_debugger (Fcons (Qexit, Fcons (tem, Qnil)));
1798: /* Don't do it again when we return to eval. */
1799: backtrace_list->debug_on_exit = 0;
1800: return tem;
1801: }
1802:
1803: Lisp_Object
1804: funcall_lambda (fun, nargs, arg_vector)
1805: Lisp_Object fun;
1806: int nargs;
1807: register Lisp_Object *arg_vector;
1808: {
1809: Lisp_Object val, tem;
1810: register Lisp_Object syms_left;
1811: Lisp_Object numargs;
1812: register Lisp_Object next;
1813: int count = specpdl_ptr - specpdl;
1814: register int i;
1815: int optional = 0, rest = 0;
1816:
1817: specbind (Qmocklisp_arguments, Qt); /* t means NOT mocklisp! */
1818:
1819: XFASTINT (numargs) = nargs;
1820:
1821: i = 0;
1822: for (syms_left = Fcar (Fcdr (fun)); !NULL (syms_left); syms_left = Fcdr (syms_left))
1823: {
1824: next = Fcar (syms_left);
1825: if (EQ (next, Qand_rest))
1826: rest = 1;
1827: else if (EQ (next, Qand_optional))
1828: optional = 1;
1829: else if (rest)
1830: {
1831: specbind (Fcar (syms_left), Flist (nargs - i, &arg_vector[i]));
1832: i = nargs;
1833: }
1834: else if (i < nargs)
1835: {
1836: tem = arg_vector[i++];
1837: specbind (next, tem);
1838: }
1839: else if (!optional)
1840: return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
1841: else
1842: specbind (next, Qnil);
1843: }
1844:
1845: if (i < nargs)
1846: return Fsignal (Qwrong_number_of_arguments, Fcons (fun, Fcons (numargs, Qnil)));
1847:
1848: val = Fprogn (Fcdr (Fcdr (fun)));
1849: unbind_to (count);
1850: return val;
1851: }
1852:
1853: void
1854: grow_specpdl ()
1855: {
1856: register struct specbinding *old = specpdl;
1857: if (specpdl_size >= max_specpdl_size)
1858: {
1859: if (max_specpdl_size < 400)
1860: max_specpdl_size = 400;
1861: if (specpdl_size >= max_specpdl_size)
1862: {
1863: Fsignal (Qerror,
1864: build_string ("Variable binding depth exceeds max-specpdl-size"));
1865: max_specpdl_size *= 2;
1866: }
1867: }
1868: specpdl_size *= 2;
1869: if (specpdl_size > max_specpdl_size)
1870: specpdl_size = max_specpdl_size;
1871: specpdl = (struct specbinding *) xrealloc (specpdl, specpdl_size * sizeof (struct specbinding));
1872: specpdl_ptr += specpdl - old;
1873: }
1874:
1875: void
1876: specbind (symbol, value)
1877: Lisp_Object symbol, value;
1878: {
1879: if (specpdl_ptr == specpdl + specpdl_size)
1880: grow_specpdl ();
1881: specpdl_ptr->symbol = symbol;
1882: specpdl_ptr->old_value = EQ (XSYMBOL (symbol)->value, Qunbound) ? Qunbound : Fsymbol_value (symbol);
1883: specpdl_ptr++;
1884: Fset (symbol, value);
1885: }
1886:
1887: void
1888: record_unwind_protect (function, arg)
1889: Lisp_Object (*function)();
1890: Lisp_Object arg;
1891: {
1892: if (specpdl_ptr == specpdl + specpdl_size)
1893: grow_specpdl ();
1894: XSETTYPE (specpdl_ptr->symbol, Lisp_Internal_Function);
1895: XSETFUNCTION (specpdl_ptr->symbol, function);
1896: specpdl_ptr->old_value = arg;
1897: specpdl_ptr++;
1898: }
1899:
1900: void
1901: unbind_to (count)
1902: int count;
1903: {
1904: register struct specbinding *downto = specpdl + count;
1905: int quitf = !NULL (Vquit_flag);
1906:
1907: Vquit_flag = Qnil;
1908:
1909: while (specpdl_ptr != downto)
1910: {
1911: --specpdl_ptr;
1912: /* Note that a "binding" of nil is really an unwind protect,
1913: so in that case the "old value" is a list of forms to evaluate. */
1914: if (NULL (specpdl_ptr->symbol))
1915: Fprogn (specpdl_ptr->old_value);
1916: /* a "binding" of a Lisp_Internal_Function (rather than a symbol)
1917: means to call that function.
1918: This is used when C code makes an unwind-protect. */
1919: else if (XTYPE (specpdl_ptr->symbol) == Lisp_Internal_Function)
1920: (*XFUNCTION (specpdl_ptr->symbol)) (specpdl_ptr->old_value);
1921: else
1922: Fset (specpdl_ptr->symbol, specpdl_ptr->old_value);
1923: }
1924: if (NULL (Vquit_flag) && quitf) Vquit_flag = Qt;
1925: }
1926:
1927: /* Get the value of symbol's global binding, even if that binding
1928: is not now dynamically visible. This is used in turning per-buffer bindings on and off */
1929:
1930: DEFUN ("global-value", Fglobal_value, Sglobal_value, 1, 1, 0,
1931: "Return the global value of VARIABLE, even if other bindings of it exist currently.\n\
1932: Normal evaluation of VARIABLE would get the innermost binding.")
1933: (symbol)
1934: Lisp_Object symbol;
1935: {
1936: register struct specbinding *ptr = specpdl;
1937:
1938: CHECK_SYMBOL (symbol, 0);
1939: for (; ptr != specpdl_ptr; ptr++)
1940: {
1941: if (EQ (ptr->symbol, symbol))
1942: return ptr->old_value;
1943: }
1944: return Fsymbol_value (symbol);
1945: }
1946:
1947: DEFUN ("global-set", Fglobal_set, Sglobal_set, 2, 2, 0,
1948: "Set the global binding of VARIABLE to VALUE, ignoring other bindings.\n\
1949: Normal setting of VARIABLE with set would set the innermost binding.")
1950: (symbol, newval)
1951: Lisp_Object symbol, newval;
1952: {
1953: register struct specbinding *ptr = specpdl;
1954:
1955: CHECK_SYMBOL (symbol, 0);
1956: for (; ptr != specpdl_ptr; ptr++)
1957: {
1958: if (EQ (ptr->symbol, symbol))
1959: {
1960: ptr->old_value = newval;
1961: return newval;
1962: }
1963: }
1964: return Fset (symbol, newval);
1965: }
1966:
1967: DEFUN ("backtrace-debug", Fbacktrace_debug, Sbacktrace_debug, 2, 2, 0,
1968: "Set the debug-on-exit flag of eval frame LEVEL levels down to FLAG.\n\
1969: The debugger is entered when that frame exits, if the flag is non-nil.")
1970: (level, flag)
1971: Lisp_Object level, flag;
1972: {
1973: register struct backtrace *backlist = backtrace_list;
1974: register int i;
1975:
1976: CHECK_NUMBER (level, 0);
1977:
1978: for (i = 0; backlist && i < XINT (level); i++)
1979: {
1980: backlist = backlist->next;
1981: }
1982:
1983: if (backlist)
1984: backlist->debug_on_exit = !NULL (flag);
1985:
1986: return flag;
1987: }
1988:
1989: DEFUN ("backtrace", Fbacktrace, Sbacktrace, 0, 0, "",
1990: "Print a trace of Lisp function calls currently active.\n\
1991: Output stream used is value of standard-output.")
1992: ()
1993: {
1994: register struct backtrace *backlist = backtrace_list;
1995: register int i;
1996: register Lisp_Object tail;
1997: Lisp_Object tem;
1998:
1999: while (backlist)
2000: {
2001: write_string (backlist->debug_on_exit ? "* " : " ", 2);
2002: if (backlist->nargs == UNEVALLED)
2003: write_string ("(", -1);
2004: tem = *backlist->function;
2005: Fprin1 (tem, Qnil);
2006: if (backlist->nargs == UNEVALLED)
2007: {
2008: if (backlist->evalargs)
2009: write_string (" ...computing arguments...", -1);
2010: else
2011: write_string (" ...", -1);
2012: }
2013: else if (backlist->nargs == MANY)
2014: {
2015: write_string ("(", -1);
2016: for (tail = *backlist->args, i = 0; !NULL (tail); tail = Fcdr (tail), i++)
2017: {
2018: if (i) write_string (" ", -1);
2019: Fprin1 (Fcar (tail), Qnil);
2020: }
2021: }
2022: else
2023: {
2024: write_string ("(", -1);
2025: for (i = 0; i < backlist->nargs; i++)
2026: {
2027: if (i) write_string (" ", -1);
2028: Fprin1 (backlist->args[i], Qnil);
2029: }
2030: }
2031: write_string (")\n", -1);
2032: backlist = backlist->next;
2033: }
2034: return Qnil;
2035: }
2036:
2037: syms_of_eval ()
2038: {
2039: DefIntVar ("max-specpdl-size", &max_specpdl_size,
2040: "Limit on number of Lisp variable bindings & unwind-protects before error.");
2041:
2042: DefIntVar ("max-lisp-eval-depth", &max_lisp_eval_depth,
2043: "Limit on depth in eval, apply and funcall before error.");
2044:
2045: DefLispVar ("quit-flag", &Vquit_flag,
2046: "Non-nil causes eval to abort, unless inhibit-quit is non-nil.\n\
2047: Typing C-G sets quit-flag non-nil, regardless of inhibit-quit.");
2048: Vquit_flag = Qnil;
2049:
2050: DefLispVar ("inhibit-quit", &Vinhibit_quit,
2051: "Non-nil inhibits C-g quitting from happening immediately.\n\
2052: Note that quit-flag will still be set by typing C-g,\n\
2053: so a quit will be signalled as soon as inhibit-quit is nil.\n\
2054: To prevent this happening, set quit-flag to nil\n\
2055: before making inhibit-quit nil.");
2056: Vinhibit_quit = Qnil;
2057:
2058: Qautoload = intern ("autoload");
2059: staticpro (&Qautoload);
2060:
2061: Qmacro = intern ("macro");
2062: staticpro (&Qmacro);
2063:
2064: Qexit = intern ("exit");
2065: staticpro (&Qexit);
2066:
2067: Qinteractive = intern ("interactive");
2068: staticpro (&Qinteractive);
2069:
2070: Qcommandp = intern ("commandp");
2071: staticpro (&Qcommandp);
2072:
2073: Qdefun = intern ("defun");
2074: staticpro (&Qdefun);
2075:
2076: Qand_rest = intern ("&rest");
2077: staticpro (&Qand_rest);
2078:
2079: Qand_optional = intern ("&optional");
2080: staticpro (&Qand_optional);
2081:
2082: DefBoolVar ("stack-trace-on-error", &stack_trace_on_error,
2083: "*Non-nil means automatically display a backtrace buffer\n\
2084: after any error that is handled by the editor command loop.");
2085: stack_trace_on_error = 0;
2086:
2087: DefBoolVar ("debug-on-error", &debug_on_error,
2088: "*Non-nil means enter debugger if an error is signaled.\n\
2089: Does not apply to errors handled by condition-case.\n\
2090: See also variable debug-on-quit.");
2091: debug_on_error = 0;
2092:
2093: DefBoolVar ("debug-on-quit", &debug_on_quit,
2094: "*Non-nil means enter debugger if quit is signaled (C-G, for example).\n\
2095: Does not apply if quit is handled by a condition-case.");
2096: debug_on_quit = 0;
2097:
2098: DefBoolVar ("debug-on-next-call", &debug_on_next_call,
2099: "Non-nil means enter debugger before next eval, apply or funcall.");
2100:
2101: DefLispVar ("debugger", &Vdebugger,
2102: "Function to call to invoke debugger.\n\
2103: If due to frame exit, args are 'exit and value being returned;\n\
2104: this function's value will be returned instead of that.\n\
2105: If due to error, args are 'error and list of signal's args.\n\
2106: If due to apply or funcall entry, one arg, 'lambda.\n\
2107: If due to eval entry, one arg, 't.");
2108: Vdebugger = Qnil;
2109:
2110: Qmocklisp_arguments = intern ("mocklisp-arguments");
2111: staticpro (&Qmocklisp_arguments);
2112: DefLispVar ("mocklisp-arguments", &Vmocklisp_arguments,
2113: "While in a mocklisp function, the list of its unevaluated args.");
2114: Vmocklisp_arguments = Qt;
2115:
2116: staticpro (&Vautoload_queue);
2117: Vautoload_queue = Qnil;
2118:
2119: defsubr (&Sor);
2120: defsubr (&Sand);
2121: defsubr (&Sif);
2122: defsubr (&Scond);
2123: defsubr (&Sprogn);
2124: defsubr (&Sprog1);
2125: defsubr (&Sprog2);
2126: defsubr (&Ssetq);
2127: defsubr (&Sglobal_set);
2128: defsubr (&Sglobal_value);
2129: defsubr (&Squote);
2130: defsubr (&Sfunction);
2131: defsubr (&Sdefun);
2132: defsubr (&Sdefmacro);
2133: defsubr (&Sdefvar);
2134: defsubr (&Sdefconst);
2135: defsubr (&Suser_variable_p);
2136: defsubr (&Slet);
2137: defsubr (&SletX);
2138: defsubr (&Swhile);
2139: defsubr (&Smacroexpand);
2140: defsubr (&Scatch);
2141: defsubr (&Sthrow);
2142: defsubr (&Sunwind_protect);
2143: defsubr (&Scondition_case);
2144: defsubr (&Ssignal);
2145: defsubr (&Sinteractive_p);
2146: defsubr (&Scommandp);
2147: defsubr (&Sautoload);
2148: defsubr (&Seval);
2149: defsubr (&Sapply);
2150: defsubr (&Sfuncall);
2151: defsubr (&Sbacktrace_debug);
2152: defsubr (&Sbacktrace);
2153: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.