Annotation of GNUtools/emacs/src/eval.c, revision 1.1.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.