Annotation of GNUtools/emacs/src/eval.c, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.