|
|
1.1 ! root 1: .\" Copyright (c) 1980 Regents of the University of California. ! 2: .\" All rights reserved. The Berkeley software License Agreement ! 3: .\" specifies the terms and conditions for redistribution. ! 4: .\" ! 5: .\" @(#)ch4.n 6.2 (Berkeley) 5/14/86 ! 6: .\" ! 7: ." $Header: ch4.n,v 1.4 83/07/27 15:11:44 layer Exp $ ! 8: .pp ! 9: .Lc Special\ Functions 4 ! 10: .Lf and "[g_arg1 ...]" ! 11: .Re ! 12: the value of the last argument if all arguments evaluate ! 13: to a non-nil value, otherwise ! 14: .i and ! 15: returns nil. ! 16: It returns t if there are no arguments. ! 17: .No ! 18: the arguments are evaluated left to right and evaluation will cease ! 19: with the first nil encountered. ! 20: .Lf apply "'u_func 'l_args" ! 21: .Re ! 22: the result of applying function u_func to the arguments in the list l_args. ! 23: .No ! 24: If u_func is a lambda, then the \fI(length\ l_args)\fP should equal the ! 25: number of formal parameters for the u_func. ! 26: If u_func is a nlambda or macro, then l_args is bound to the single ! 27: formal parameter. ! 28: .Eb ! 29: ; \fIadd1\fP is a lambda of 1 argument ! 30: \-> \fI(apply 'add1 '(3))\fP ! 31: 4 ! 32: ! 33: ; we will define \fIplus1\fP as a macro which will be equivalent to \fIadd1\fP ! 34: \-> \fI(def plus1 (macro (arg) (list 'add1 (cadr arg))))\fP ! 35: plus1 ! 36: \-> \fI(plus1 3)\fP ! 37: 4 ! 38: ! 39: ; now if we \fIapply\fP a macro we obtain the form it changes to. ! 40: \-> \fI(apply 'plus1 '(plus1 3))\fP ! 41: (add1 3) ! 42: ! 43: ; if we \fIfuncall\fP a macro however, the result of the macro is \fIeval\fPed ! 44: ; before it is returned. ! 45: \-> \fI(funcall 'plus1 '(plus1 3))\fP ! 46: 4 ! 47: ! 48: ; for this particular macro, the \fIcar\fP of the \fIarg\fP is not checked ! 49: ; so that this too will work ! 50: \-> \fI(apply 'plus1 '(foo 3))\fP ! 51: (add1 3) ! 52: ! 53: .Ee ! 54: .Lf arg "['x_numb]" ! 55: .Re ! 56: if x_numb is specified then the x_numb'\fIth\fP argument to ! 57: the enclosing lexpr ! 58: If x_numb is not specified then this returns the number of arguments ! 59: to the enclosing lexpr. ! 60: .No ! 61: it is an error to the interpreter if x_numb is given and out of range. ! 62: .Lf break "[g_message ['g_pred]]" ! 63: .Wh ! 64: if g_message is not given it is assumed to be the null string, and ! 65: if g_pred is not given it is assumed to be t. ! 66: .Re ! 67: the value of \fI(*break 'g_pred 'g_message)\fP ! 68: .Lf *break "'g_pred 'g_message" ! 69: .Re ! 70: nil immediately if g_pred is nil, else ! 71: the value of the next (return 'value) expression typed in at top level. ! 72: .Se ! 73: If the predicate, g_pred, evaluates to non-null, ! 74: the lisp system stops and prints out `Break ' ! 75: followed by g_message. ! 76: It then enters a break loop ! 77: which allows one to interactively debug a program. ! 78: To continue execution from a break you can use the ! 79: .i return ! 80: function. ! 81: to return to top level or another break level, you can use ! 82: .i retbrk ! 83: or ! 84: .i reset . ! 85: .Lf caseq "'g_key-form l_clause1 ..." ! 86: .Wh ! 87: l_clause\fIi\fP is a list of the form ! 88: (g_comparator ['g_form\fIi\fP ...]). ! 89: The comparators may be symbols, small fixnums, a list of small fixnums or ! 90: symbols. ! 91: .No ! 92: The way caseq works is that it evaluates g_key-form, ! 93: yielding a value we will call the selector. ! 94: Each clause is examined until the selector is found ! 95: consistent with the comparator. ! 96: For a symbol, or a fixnum, this means the two must be \fIeq\fP. ! 97: For a list, this means that the selector must be \fIeq\fP to ! 98: some element of the list. ! 99: .br ! 100: .sp ! 101: The comparator consisting of the symbol \fBt\fP has special semantics: ! 102: it matches anything, and consequently, should be the last comparator. ! 103: .br ! 104: .sp ! 105: In any case, having chosen a clause, \fIcaseq\fP evaluates each form ! 106: within that clause and ! 107: .Re ! 108: the value of the last form. If no comparators are matched, ! 109: \fIcaseq\fP returns nil. ! 110: .Eb ! 111: Here are two ways of defining the same function: ! 112: \->\fI(defun fate (personna) ! 113: (caseq personna ! 114: (cow '(jumped over the moon)) ! 115: (cat '(played nero)) ! 116: ((dish spoon) '(ran away with each other)) ! 117: (t '(lived happily ever after))))\fP ! 118: fate ! 119: \->\fI(defun fate (personna) ! 120: (cond ! 121: ((eq personna 'cow) '(jumped over the moon)) ! 122: ((eq personna 'cat) '(played nero)) ! 123: ((memq personna '(dish spoon)) '(ran away with each other)) ! 124: (t '(lived happily ever after))))\fP ! 125: fate ! 126: .Ee ! 127: .Lf catch "g_exp [ls_tag]" ! 128: .Wh ! 129: if ls_tag is not given, it is assumed to be nil. ! 130: .Re ! 131: the result of \fI(*catch 'ls_tag g_exp)\fP ! 132: .No ! 133: catch is defined as a macro. ! 134: .Lf *catch "'ls_tag g_exp" ! 135: .Wh ! 136: ls_tag is either a symbol or a list of symbols. ! 137: .Re ! 138: the result of evaluating g_exp or the value thrown during the evaluation ! 139: of g_exp. ! 140: .Se ! 141: this first sets up a `catch frame' on the lisp runtime stack. ! 142: Then it begins to evaluate g_exp. ! 143: If g_exp evaluates normally, its value is returned. ! 144: If, however, a value is thrown during the evaluation of g_exp then ! 145: this *catch will return with that value if one of these cases ! 146: is true: ! 147: .nr $p 0 ! 148: .np ! 149: the tag thrown to is ls_tag ! 150: .np ! 151: ls_tag is a list and the tag thrown to is a member of this list ! 152: .np ! 153: ls_tag is nil. ! 154: .No ! 155: Errors are implemented as a special kind of throw. ! 156: A catch with no tag will not catch an error but a catch whose tag is ! 157: the error type will catch that type of error. ! 158: See Chapter 10 for more information. ! 159: .Lf comment "[g_arg ...]" ! 160: .Re ! 161: the symbol comment. ! 162: .No ! 163: This does absolutely nothing. ! 164: .Lf cond "[l_clause1 ...]" ! 165: .Re ! 166: the last value evaluated in the first clause satisfied. ! 167: If no clauses are satisfied then nil is returned. ! 168: .No ! 169: This is the basic conditional `statement' in lisp. ! 170: The clauses are processed from left to right. ! 171: The first element of a clause is evaluated. ! 172: If it evaluated to a non-null value then that clause is satisfied and ! 173: all following elements of that clause are evaluated. ! 174: The last value computed is returned as the value of the cond. ! 175: If there is just one element in the clause then its value is returned. ! 176: If the first element of a clause evaluates to nil, then the other ! 177: elements of that clause are not evaluated and the system moves to ! 178: the next clause. ! 179: .Lf cvttointlisp ! 180: .Se ! 181: The reader is modified to conform with the Interlisp syntax. ! 182: The character % is made the escape character and special meanings for ! 183: comma, backquote and backslash are removed. ! 184: Also the reader is told to convert upper case to lower case. ! 185: .Lf cvttofranzlisp ! 186: .Se ! 187: .Fr "'s" ! 188: default syntax is reinstated. ! 189: One would run this function after having run any ! 190: of the other ! 191: .i cvtto- ! 192: functions. ! 193: Backslash is made the escape character, super-brackets work again, ! 194: and the reader distinguishes between upper and ! 195: lower case. ! 196: .Lf cvttomaclisp ! 197: .Se ! 198: The reader is modified to conform with Maclisp syntax. ! 199: The character / is made the escape character and the special meanings ! 200: for backslash, left and right bracket are removed. ! 201: The reader is made case-insensitive. ! 202: .Lf cvttoucilisp ! 203: .Se ! 204: The reader is modified to conform with UCI Lisp syntax. ! 205: The character / is made the escape character, tilde is made the comment ! 206: character, exclamation point takes on the unquote function normally ! 207: held by comma, and backslash, comma, semicolon become normal ! 208: characters. ! 209: Here too, the reader is made case-insensitive. ! 210: .Lf debug "s_msg" ! 211: .Se ! 212: Enter the Fixit package described in Chapter 15. ! 213: This package allows you to examine the evaluation stack in detail. ! 214: To leave the Fixit package type 'ok'. ! 215: .Lf debugging "'g_arg" ! 216: .Se ! 217: If g_arg is non-null, ! 218: Franz unlinks the transfer tables, does a \fI(*rset\ t)\fP to turn on ! 219: evaluation monitoring and sets the all-error catcher (ER%all) to be ! 220: \fIdebug-err-handler\fP. ! 221: If g_arg is nil, ! 222: all of the above changes are undone. ! 223: .Lf declare "[g_arg ...]" ! 224: .Re ! 225: nil ! 226: .No ! 227: this is a no-op to the evaluator. ! 228: It has special meaning to the compiler (see Chapter 12). ! 229: .Lf def "s_name (s_type l_argl g_exp1 ...)" ! 230: .Wh ! 231: s_type is one of lambda, nlambda, macro or lexpr. ! 232: .Re ! 233: s_name ! 234: .Se ! 235: This defines the function s_name to the lisp system. ! 236: If s_type is nlambda or macro then the argument list l_argl must contain ! 237: exactly one non-nil symbol. ! 238: .Lf defmacro "s_name l_arg g_exp1 ..." ! 239: .Lx defcmacro "s_name l_arg g_exp1 ..." ! 240: .Re ! 241: s_name ! 242: .Se ! 243: This defines the macro s_name. ! 244: \fIdefmacro\fP makes it easy to write macros since it makes ! 245: the syntax just like \fIdefun\fP. ! 246: Further information on \fIdefmacro\fP is in \(sc8.3.2. ! 247: \fIdefcmacro\fP defines compiler-only macros, or cmacros. ! 248: A cmacro is stored on the property list of a ! 249: symbol under the indicator \fBcmacro\fP. ! 250: Thus a function can ! 251: have a normal definition and a cmacro definition. ! 252: For an example of the use of cmacros, see the definitions ! 253: of nthcdr and nth in /usr/lib/lisp/common2.l ! 254: .Lf defun "s_name [s_mtype] ls_argl g_exp1 ... " ! 255: .Wh ! 256: s_mtype is one of fexpr, expr, args or macro. ! 257: .Re ! 258: s_name ! 259: .Se ! 260: This defines the function s_name. ! 261: .No ! 262: this exists for Maclisp compatibility, it is just a macro which ! 263: changes the defun form to the def form. ! 264: An s_mtype of fexpr is converted to nlambda ! 265: and of expr to lambda. Macro remains the same. ! 266: If ls_arg1 is a non-nil symbol, then the type is assumed to be lexpr and ! 267: ls_arg1 is the symbol which is bound to the number of args when the ! 268: function is entered. ! 269: .br ! 270: For compatibility with the Lisp Machine Lisp, there are three types of ! 271: optional parameters that can occur in ls_argl: \fI&optional\fP declares that ! 272: the following symbols are optional, and may or may not appear in the ! 273: argument list to the function, \fI&rest symbol\fP ! 274: declares that all forms in the ! 275: function call that are not accounted for by previous lambda bindings ! 276: are to be assigned to \fIsymbol\fP, and \fI&aux form1 ... formn\fP ! 277: declares that the \fIformi\fP are either symbols, in which case they ! 278: are lambda bound to \fBnil\fP, or lists, in which case the first element ! 279: of the list is lambda bound to the second, evaluated element. ! 280: .Eb ! 281: ; \fIdef\fP and \fIdefun\fP here are used to define identical functions ! 282: ; you can decide for yourself which is easier to use. ! 283: \-> \fI(def append1 (lambda (lis extra) (append lis (list extra))))\fP ! 284: append1 ! 285: ! 286: \-> \fI(defun append1 (lis extra) (append lis (list extra)))\fP ! 287: append1 ! 288: ! 289: ; Using the & forms... ! 290: \-> \fI(defu\kCn test (a b &optional c &aux (retval 0) &rest z) ! 291: \h'|\nCu'\kB(if c them (msg \kA"Optional arg present" N ! 292: \h'|\nAu'"c is " c N)) ! 293: \h'|\nBu'(msg \kA"rest is " z N ! 294: \h'|\nAu'"retval is " retval N))\fP ! 295: test ! 296: \-> \fI(test 1 2 3 4)\fP ! 297: Optional arg present ! 298: c is 3 ! 299: rest is (4) ! 300: retval is 0 ! 301: .Ee ! 302: .Lf defvar "s_variable ['g_init]" ! 303: .Re ! 304: s_variable. ! 305: .No ! 306: This form is put at the top level in files, like \fIdefun\fB. ! 307: .Se ! 308: This declares s_variable to be special. If g_init is present ! 309: and s_variable is unbound when the file is read in, s_variable ! 310: will be set to the value of g_init. ! 311: An advantage of `(defvar foo)' over `(declare (special foo))' is that if ! 312: a file containing defvars is loaded (or fasl'ed) in during compilation, ! 313: the variables mentioned in the defvar's will be declared special. The only ! 314: way to have that effect with `(declare (special foo))' is to \fIinclude\fP ! 315: the file. ! 316: .Lf do "l_vrbs l_test g_exp1 ..." ! 317: .Re ! 318: the last form in the cdr of l_test evaluated, or a value explicitly given by ! 319: a return evaluated within the do body. ! 320: .No ! 321: This is the basic iteration form for ! 322: .Fr . ! 323: l_vrbs is a list of zero or more var-init-repeat forms. ! 324: A var-init-repeat form looks like: ! 325: .br ! 326: .tl ''(s_name [g_init [g_repeat]])'' ! 327: There are three cases depending on what is present in the form. ! 328: If just s_name is present, this means that when the do is entered, ! 329: s_name is lambda-bound to nil and is never modified by the system ! 330: (though the program is certainly free to modify its value). ! 331: If the form is (s_name\ 'g_init) then the only difference is that ! 332: s_name is lambda-bound to the value of g_init instead of nil. ! 333: If g_repeat is also present then s_name is lambda-bound to g_init ! 334: when the loop is entered and after each pass through the do body ! 335: s_name is bound to the value of g_repeat. ! 336: .br ! 337: l_test is either nil or has the form of a cond clause. ! 338: If it is nil then the do body will be evaluated only once and the ! 339: do will return nil. ! 340: Otherwise, before the do body is evaluated the car of l_test is ! 341: evaluated and if the result is non-null, this signals an end to ! 342: the looping. ! 343: Then the rest of the forms in l_test are evaluated ! 344: and the value of the last one is returned as the value of the do. ! 345: If the cdr of l_test is nil, then nil is returned -- thus this is not ! 346: exactly like a cond clause. ! 347: .br ! 348: g_exp1 and those forms which follow constitute the do body. ! 349: A do body is like a prog body and thus may have labels and one may ! 350: use the functions go and return. ! 351: .br ! 352: The sequence of evaluations is this: ! 353: .nr $p 0 ! 354: .np ! 355: the init forms are evaluated left to right and stored in temporary ! 356: locations. ! 357: .np ! 358: Simultaneously all do variables are lambda bound to the value of ! 359: their init forms or nil. ! 360: .np ! 361: If l_test is non-null, then the car is evaluated and if it is non-null, ! 362: the rest of the forms in l_test are evaluated and the last value is ! 363: returned as the value ! 364: of the do. ! 365: .np ! 366: The forms in the do body are evaluated left to right. ! 367: .np ! 368: If l_test is nil the do function returns with the value nil. ! 369: .np ! 370: The repeat forms are evaluated and saved in temporary locations. ! 371: .np ! 372: The variables with repeat forms are simultaneously ! 373: bound to the values of those forms. ! 374: .np ! 375: Go to step 3. ! 376: .No ! 377: there is an alternate form of do which can be used when there is ! 378: only one do variable. ! 379: It is described next. ! 380: .Eb ! 381: ; this is a simple function which numbers the elements of a list. ! 382: ; It uses a \fIdo\fP function with two local variables. ! 383: \-> \fI(defun printem (lis) ! 384: (do ((xx lis (cdr xx)) ! 385: (i 1 (1+ i))) ! 386: ((null xx) (patom "all done") (terpr)) ! 387: (print i) ! 388: (patom ": ") ! 389: (print (car xx)) ! 390: (terpr)))\fP ! 391: printem ! 392: \-> \fI(printem '(a b c d))\fP ! 393: 1: a ! 394: 2: b ! 395: 3: c ! 396: 4: d ! 397: all done ! 398: nil ! 399: \-> ! 400: .Ee ! 401: .Lf do "s_name g_init g_repeat g_test g_exp1 ..." ! 402: .nr $p 0 ! 403: .No ! 404: this is another, less general, form of do. ! 405: It is evaluated by: ! 406: .np ! 407: evaluating g_init ! 408: .np ! 409: lambda binding s_name to value of g_init ! 410: .np ! 411: g_test is evaluated and if it is not nil the do function returns with nil. ! 412: .np ! 413: the do body is evaluated beginning at g_exp1. ! 414: .np ! 415: the repeat form is evaluated and stored in s_name. ! 416: .np ! 417: go to step 3. ! 418: .Re ! 419: nil ! 420: .Lf environment "[l_when1 l_what1 l_when2 l_what2 ...]" ! 421: .Lx environment-maclisp "[l_when1 l_what1 l_when2 l_what2 ...]" ! 422: .Lx environment-lmlisp "[l_when1 l_what1 l_when2 l_what2 ...]" ! 423: .Wh ! 424: the when's are a subset of (eval compile load), and the symbols have the ! 425: same meaning as they do in 'eval-when'. ! 426: .br ! 427: .sp ! 428: The what's may be ! 429: .br ! 430: (files file1 file2 ... fileN), ! 431: .br ! 432: which insure that the named files are loaded. ! 433: To see if file\fIi\fP is loaded, ! 434: it looks for a 'version' property under ! 435: file\fIi\fP's property list. Thus to prevent multiple loading, ! 436: you should put ! 437: .br ! 438: (putprop 'myfile t 'version), ! 439: .br ! 440: at the end of myfile.l. ! 441: .br ! 442: .sp ! 443: Another acceptable form for a what is ! 444: .br ! 445: (syntax type) ! 446: .br ! 447: Where type is either maclisp, intlisp, ucilisp, franzlisp. ! 448: .Se ! 449: \fIenvironment-maclisp\fP sets the environment to that which ! 450: `liszt -m' would generate. ! 451: .br ! 452: .sp ! 453: \fIenvironment-lmlisp\fP sets up the lisp machine environment. This is like ! 454: maclisp but it has additional macros. ! 455: .br ! 456: .sp ! 457: For these specialized environments, only the \fBfiles\fP clauses are useful. ! 458: .Eg ! 459: (environment-maclisp (compile eval) (files foo bar)) ! 460: .Re ! 461: the last list of files requested. ! 462: .Lf err "['s_value [nil]]" ! 463: .Re ! 464: nothing (it never returns). ! 465: .Se ! 466: This causes an error and if this error is caught by an ! 467: .i errset ! 468: then that ! 469: .i errset ! 470: will return s_value instead of nil. ! 471: If the second arg is given, then it must be nil (\s-2MAC\s0lisp ! 472: compatibility). ! 473: .Lf error "['s_message1 ['s_message2]]" ! 474: .Re ! 475: nothing (it never returns). ! 476: .Se ! 477: s_message1 and s_message2 are \fIpatom\fPed if they are given and ! 478: then \fIerr\fP is called (with no arguments), which causes an error. ! 479: .Lf errset "g_expr [s_flag]" ! 480: .Re ! 481: a list of one element, which is the value resulting from evaluating g_expr. ! 482: If an error occurs during the evaluation of g_expr, then the locus of control ! 483: will return to the ! 484: .i errset ! 485: which will then return nil (unless the error was caused by a call to ! 486: .i err, ! 487: with a non-null argument). ! 488: .Se ! 489: S_flag is evaluated before g_expr is evaluated. ! 490: If s_flag is not given, then it is assumed to be t. ! 491: If an error occurs during the evaluation of g_expr, and s_flag evaluated to ! 492: a non-null value, then the error message associated with the ! 493: error is printed before control returns to the errset. ! 494: .Lf eval "'g_val ['x_bind-pointer]" ! 495: .Re ! 496: the result of evaluating g_val. ! 497: .No ! 498: The evaluator evaluates g_val in this way: ! 499: .br ! 500: If g_val is a symbol, then the evaluator returns its value. ! 501: If g_val had never been assigned a value, then this causes ! 502: an `Unbound Variable' error. ! 503: If x_bind-pointer is given, then the variable is evaluated with ! 504: respect to that pointer (see \fIevalframe\fP for details on bind-pointers). ! 505: .br ! 506: .sp ! 507: If g_val is of type value, then its value is returned. ! 508: If g_val is of any other type than list, g_val is returned. ! 509: .br ! 510: .sp ! 511: If g_val is a list object then g_val is either a function call or ! 512: array reference. ! 513: Let g_car be the first element of g_val. ! 514: We continually evaluate g_car until we end up with a symbol with ! 515: a non-null function binding ! 516: or a non-symbol. ! 517: Call what we end up with: g_func. ! 518: .br ! 519: .sp ! 520: G_func must be one of three types: list, binary or array. ! 521: If it is a list then the first element of the list, which ! 522: we shall call g_functype, must be either ! 523: lambda, nlambda, macro or lexpr. ! 524: If g_func is a binary, then its discipline, which we shall call ! 525: g_functype, is either lambda, nlambda, macro or a string. ! 526: If g_func is an array then this form is evaluated specially, see ! 527: Chapter 9 on arrays. ! 528: If g_func is a list or binary, then g_functype will determine how ! 529: the arguments to this function, the cdr of g_val, are processed. ! 530: If g_functype is a string, then this is a foreign function call (see \(sc8.5 ! 531: for more details). ! 532: .br ! 533: .sp ! 534: If g_functype is lambda or lexpr, the arguments are evaluated ! 535: (by calling ! 536: .i eval ! 537: recursively) and stacked. ! 538: If g_functype is nlambda then the argument list is stacked. ! 539: If g_functype is macro then the entire form, g_val is stacked. ! 540: .br ! 541: .sp ! 542: Next, the formal variables are lambda bound. ! 543: The formal variables are the cadr of g_func. If g_functype is ! 544: nlambda, lexpr or macro, there should only be one formal variable. ! 545: The values on the stack are lambda bound to the formal variables ! 546: except in the case of a lexpr, where the number of actual arguments ! 547: is bound to the formal variable. ! 548: .br ! 549: .sp ! 550: After the binding is done, the function is invoked, either by ! 551: jumping to the entry point in the case of a binary or ! 552: by evaluating the list of forms beginning at cddr g_func. ! 553: The result of this function invocation is returned as the value ! 554: of the call to eval. ! 555: .Lf evalframe "'x_pdlpointer" ! 556: .Re ! 557: an evalframe descriptor for the evaluation frame just before x_pdlpointer. ! 558: If x_pdlpointer is nil, it returns the evaluation frame of the frame just ! 559: before the current call to \fIevalframe\fP. ! 560: .No ! 561: An evalframe descriptor describes a call to \fIeval\fP, \fIapply\fP ! 562: or \fIfuncall\fP. ! 563: The form of the descriptor is ! 564: .br ! 565: \fI(type pdl-pointer expression bind-pointer np-index lbot-index)\fP ! 566: .br ! 567: where type is `eval' if this describes a call to \fIeval\fP or `apply' ! 568: if this is a call to \fIapply\fP or \fIfuncall\fP. ! 569: pdl-pointer is a number which describes ! 570: this context. ! 571: It can be passed to ! 572: .i evalframe ! 573: to obtain the next descriptor and ! 574: can be passed to ! 575: .i freturn ! 576: to cause a return from this context. ! 577: bind-pointer is the size of variable binding stack when this ! 578: evaluation began. ! 579: The bind-pointer can be given as a second argument ! 580: to \fIeval\fP to order to evaluate variables in the same context as ! 581: this evaluation. ! 582: If type is `eval' then expression ! 583: will have the form \fI(function-name\ arg1\ ...)\fP. ! 584: If type is `apply' then expression will have the form ! 585: \fI(function-name\ (arg1\ ...))\fP. ! 586: np-index and lbot-index are pointers into the ! 587: argument stack (also known as the \fInamestack\fP array) at the time of call. ! 588: lbot-index points to the first argument, np-index points one beyond ! 589: the last argument. ! 590: .br ! 591: In order for there to be enough information ! 592: for \fIevalframe\fP to return, you must call \fI(*rset\ t)\fP. ! 593: .Ex ! 594: \fI(progn (evalframe nil))\fP ! 595: .br ! 596: returns \fI(eval 2147478600 (progn (evalframe nil)) 1 8 7)\fP ! 597: .Lf evalhook "'g_form 'su_evalfunc ['su_funcallfunc]" ! 598: .Re ! 599: the result of evaluating g_form after lambda binding `evalhook' to ! 600: su_evalfunc and, if it is given, lambda binding `funcallhook' to ! 601: su_funcallhook. ! 602: .No ! 603: As explained in \(sc14.4, the function ! 604: .i eval ! 605: may pass the job of evaluating a form to a user `hook' function when ! 606: various switches are set. ! 607: The hook function normally prints the form to be evaluated on the ! 608: terminal and then evaluates it by calling ! 609: .i evalhook . ! 610: .i Evalhook ! 611: does the lambda binding mentioned above and then calls ! 612: .i eval ! 613: to evaluate the form after setting an internal switch to tell ! 614: .i eval ! 615: not to call the user's hook function just this one time. ! 616: This allows the evaluation process to advance one step and yet ! 617: insure that further calls to ! 618: .i eval ! 619: will cause traps to the hook function (if su_evalfunc is non-null). ! 620: .br ! 621: In order for \fIevalhook\fP to work, \fI(*rset\ t)\fP and ! 622: \fI(sstatus\ evalhook\ t)\fP must have been done previously. ! 623: .Lf exec "s_arg1 ..." ! 624: .Re ! 625: the result of forking and executing the command named by concatenating ! 626: the s_arg\fIi\fP together with spaces in between. ! 627: .Lf exece "'s_fname ['l_args ['l_envir]]" ! 628: .Re ! 629: the error code from the system if it was unable to ! 630: execute the command s_fname with arguments ! 631: l_args and with the environment set up as specified in l_envir. ! 632: If this function is successful, it will not return, instead the lisp ! 633: system will be overlaid by the new command. ! 634: .Lf freturn "'x_pdl-pointer 'g_retval" ! 635: .Re ! 636: g_retval from the context given by x_pdl-pointer. ! 637: .No ! 638: A pdl-pointer denotes a certain expression currently being evaluated. ! 639: The pdl-pointer for a given expression can be obtained from ! 640: .i evalframe . ! 641: .Lf frexp "'f_arg" ! 642: .Re ! 643: a list cell \fI(exponent . mantissa)\fP which represents the ! 644: given flonum ! 645: .No ! 646: The exponent will be a fixnum, the mantissa a 56 bit bignum. ! 647: If you think of the the binary point occurring right after the ! 648: high order bit of mantissa, then ! 649: f_arg\ =\ 2\*[exponent\*]\ *\ mantissa. ! 650: .Lf funcall "'u_func ['g_arg1 ...]" ! 651: .Re ! 652: the value of applying function u_func to the arguments g_arg\fIi\fP ! 653: and then evaluating that result if u_func is a macro. ! 654: .No ! 655: If u_func is a macro or nlambda then there should be only one g_arg. ! 656: \fIfuncall\fP is the function which the evaluator uses to evaluate ! 657: lists. ! 658: If \fIfoo\fP is a lambda or lexpr or array, ! 659: then \fI(funcall\ 'foo\ 'a\ 'b\ 'c)\fP ! 660: is equivalent to \fI(foo\ 'a\ 'b\ 'c)\fP. ! 661: If \fIfoo\fP is a nlambda ! 662: then \fI(funcall\ 'foo\ '(a\ b\ c))\fP is equivalent to ! 663: \fI(foo a b c)\fP. ! 664: Finally, if ! 665: .i foo ! 666: is a macro then ! 667: .i (funcall\ 'foo\ '(foo\ a\ b\ c)) ! 668: is equivalent to ! 669: .i (foo\ a\ b\ c) . ! 670: .Lf funcallhook "'l_form 'su_funcallfunc ['su_evalfunc]" ! 671: .Re ! 672: the result of \fIfuncall\fPing ! 673: the \fI(car\ l_form)\fP ! 674: on the already evaluated ! 675: arguments in the \fI(cdr\ l_form)\fP ! 676: after lambda binding `funcallhook' to ! 677: su_funcallfunc and, if it is given, lambda binding `evalhook' to ! 678: su_evalhook. ! 679: .No ! 680: This function is designed to continue the evaluation process ! 681: with as little work as possible after a funcallhook trap has occurred. ! 682: It is for this reason that the form of l_form is unorthodox: its ! 683: .i car ! 684: is the name of the function to call and its ! 685: .i cdr ! 686: are a list of arguments to stack (without evaluating again) ! 687: before calling the given function. ! 688: After stacking the arguments ! 689: but ! 690: before calling ! 691: .i funcall ! 692: an internal switch is set to prevent \fIfuncall\fP ! 693: from passing the job of funcalling to su_funcallfunc. ! 694: If \fIfuncall\fP is called recursively in funcalling l_form and ! 695: if su_funcallfunc is non-null, then ! 696: the arguments to ! 697: .i funcall ! 698: will actually be given to su_funcallfunc (a lexpr) ! 699: to be funcalled. ! 700: .br ! 701: In order for \fIevalhook\fP to work, \fI(*rset\ t)\fP and ! 702: \fI(sstatus\ evalhook\ t)\fP must have been done previously. ! 703: A more detailed description of ! 704: .i evalhook ! 705: and ! 706: .i funcallhook ! 707: is given in Chapter 14. ! 708: .Lf function "u_func" ! 709: .Re ! 710: the function binding of u_func if it is an symbol with a function binding ! 711: otherwise u_func is returned. ! 712: .Lf getdisc "'y_func" ! 713: .Re ! 714: the discipline of the machine coded function (either lambda, nlambda ! 715: or macro). ! 716: .Lf go "g_labexp" ! 717: .Wh ! 718: g_labexp is either a symbol or an expression. ! 719: .Se ! 720: If g_labexp is an expression, that expression is evaluated and ! 721: should ! 722: result in a symbol. ! 723: The locus of control moves to just following the symbol g_labexp in the ! 724: current prog or do body. ! 725: .No ! 726: this is only valid in the context of a prog or do body. ! 727: The interpreter and compiler will allow non-local ! 728: .i go 's ! 729: although the compiler won't allow a \fIgo\fP to leave a function body. ! 730: The compiler will not allow g_labexp to be an expression. ! 731: .Lf if "'g_a 'g_b" ! 732: .Lx if "'g_a 'g_b 'g_c ..." ! 733: .Lx if "'g_a \fBthen\fP 'g_b [...] [\fBelseif\fP 'g_c \fBthen\fP 'g_d ...] [\fBelse\fP 'g_e [...]" ! 734: .Lx if "'g_a \fBthen\fP 'g_b [...] [\fBelseif\fP 'g_c \fBthenret\fP] [\fBelse\fP 'g_d [...]" ! 735: .No ! 736: The various forms of \fIif\fP are intended to be a more readable ! 737: conditional statement, to be used in place of \fIcond\fP. There ! 738: are two varieties of \fIif\fP, with keywords, and without. The ! 739: keyword-less variety is inherited from common Maclisp usage. ! 740: A keyword-less, two argument \fIif\fP is equivalent to a one-clause ! 741: \fIcond\fP, i.e. (\fIcond\fP (a b)). Any other keyword-less \fIif\fP ! 742: must have at least three arguments. The first two arguments are the ! 743: first clause of the equivalent \fIcond\fP, and all remaining arguments ! 744: are shoved into a second clause beginning with \fBt\fP. Thus, the ! 745: second form of \fIif\fP is equivalent to ! 746: .br ! 747: (\fIcond\fP (a b) (t c ...)). ! 748: .br ! 749: .sp ! 750: The keyword variety has the following grouping of arguments: ! 751: a predicate, a then-clause, and optional ! 752: else-clause. The predicate is evaluated, and if the result is ! 753: non-nil, the then-clause will be performed, in the sense ! 754: described below. Otherwise, (i.e. the result of the predicate ! 755: evaluation was precisely nil), the else-clause will be performed. ! 756: .br ! 757: .sp ! 758: Then-clauses will either consist entirely ! 759: of the single keyword \fBthenret\fP, or will start with the keyword ! 760: \fBthen\fP, and be followed by at least one general expression. ! 761: (These general expressions must not be one of the keywords.) ! 762: To actuate a \fBthenret\fP means to cease further evaluation ! 763: of the \fIif\fP, and to return the value of the predicate just calculated. ! 764: The performance of the longer clause means to evaluate each general expression ! 765: in turn, and then return the last value calculated. ! 766: .br ! 767: .sp ! 768: The else-clause may begin with the keyword \fBelse\fP and be followed ! 769: by at least one general expression. ! 770: The rendition of this clause is just like that of a then-clause. ! 771: An else-clause ! 772: may begin alternatively with the keyword \fBelseif\fP, and be followed ! 773: (recursively) by a predicate, then-clause, and optional else-clause. ! 774: Evaluation of this clause, is just evaluation of an \fIif\fP-form, with ! 775: the same predicate, then- and else-clauses. ! 776: .Lf I-throw-err "'l_token" ! 777: .Wh ! 778: l_token is the \fIcdr\fP of the value returned from a \fI*catch\fP with ! 779: the tag ER%unwind-protect. ! 780: .Re ! 781: nothing (never returns in the current context) ! 782: .Se ! 783: The error or throw denoted by l_token is continued. ! 784: .No ! 785: This function is used to implement \fIunwind-protect\fP which allows the ! 786: processing of a transfer of control though a certain context to be ! 787: interrupted, a user function to be executed and than the transfer of ! 788: control to continue. ! 789: The form of l_token is either ! 790: .br ! 791: \fI(t tag value)\fP for a throw or ! 792: .br ! 793: \fI(nil type message valret contuab uniqueid [arg ...])\fP for an error. ! 794: .br ! 795: This function is not to be used for implementing throws or ! 796: errors and is only documented here for completeness. ! 797: .Lf let "l_args g_exp1 ... g_exprn" ! 798: .Re ! 799: the result of evaluating g_exprn within the bindings given by l_args. ! 800: .No ! 801: l_args is either nil (in which case ! 802: .i let ! 803: is just like ! 804: .i progn ) ! 805: or it is a list of binding objects. ! 806: A binding object is a list \fI(symbol\ expression)\fP. ! 807: When a ! 808: .i let ! 809: is entered, ! 810: all of the expressions are evaluated and then simultaneously ! 811: lambda-bound to the corresponding symbols. ! 812: In effect, a ! 813: .i let ! 814: expression is just like a lambda expression except the symbols and ! 815: their initial values are next to each other, making the expression ! 816: easier to understand. ! 817: There are some added features to the ! 818: .i let ! 819: expression: ! 820: A binding object can just be a symbol, in which case the expression ! 821: corresponding to that symbol is `nil'. ! 822: If a binding object is a list and the first element of that list is ! 823: another list, then that list is assumed to be a binding template ! 824: and ! 825: .i let ! 826: will do a ! 827: .i desetq ! 828: on it. ! 829: .Lf let* "l_args g_exp1 ... g_expn" ! 830: .Re ! 831: the result of evaluating g_exprn within the bindings given by l_args. ! 832: .No ! 833: This is identical to ! 834: .i let ! 835: except the expressions in the binding list l_args are evaluated ! 836: and bound sequentially instead of in parallel. ! 837: .Lf lexpr-funcall "'g_function ['g_arg1 ...] 'l_argn" ! 838: .No ! 839: This is a cross between funcall and apply. ! 840: The last argument, must be a list (possibly empty). ! 841: The element of list arg are stack and then the function is ! 842: funcalled. ! 843: .Ex ! 844: (lexpr-funcall 'list 'a '(b c d)) is the same as ! 845: (funcall 'list 'a 'b 'c 'd) ! 846: .Lf listify "'x_count" ! 847: .Re ! 848: a list of x_count of the arguments to the current function (which ! 849: must be a lexpr). ! 850: .No ! 851: normally arguments 1 through x_count are returned. ! 852: If x_count is negative then a list of last abs(x_count) arguments are ! 853: returned. ! 854: .Lf map "'u_func 'l_arg1 ..." ! 855: .Re ! 856: l_arg1 ! 857: .No ! 858: The function u_func is applied to successive sublists of the l_arg\fIi\fP. ! 859: All sublists should have the same length. ! 860: .\".pg ! 861: .Lf mapc "'u_func 'l_arg1 ..." ! 862: .Re ! 863: l_arg1. ! 864: .No ! 865: The function u_func is applied to successive elements of the argument ! 866: lists. ! 867: All of the lists should have the same length. ! 868: .Lf mapcan "'u_func 'l_arg1 ..." ! 869: .Re ! 870: nconc applied to the results of the functional evaluations. ! 871: .No ! 872: The function u_func is applied to successive elements of the ! 873: argument lists. ! 874: All sublists should have the same length. ! 875: .Lf mapcar "'u_func 'l_arg1 ..." ! 876: .Re ! 877: a list of the values returned from the functional application. ! 878: .No ! 879: the function u_func is applied to successive elements of the ! 880: argument lists. ! 881: All sublists should have the same length. ! 882: .Lf mapcon "'u_func 'l_arg1 ..." ! 883: .Re ! 884: nconc applied to the results of the functional evaluation. ! 885: .No ! 886: the function u_func is applied to successive sublists of the ! 887: argument lists. ! 888: All sublists should have the same length. ! 889: .Lf maplist "'u_func 'l_arg1 ..." ! 890: .Re ! 891: a list of the results of the functional evaluations. ! 892: .No ! 893: the function u_func is applied to successive sublists of the arguments ! 894: lists. ! 895: All sublists should have the same length. ! 896: .lp ! 897: Readers may find the following summary table useful in remembering ! 898: the differences between the six mapping functions: ! 899: .(b ! 900: .TS ! 901: box; ! 902: c | c s s. ! 903: \ Value returned is ! 904: ! 905: .T& ! 906: c | c c c. ! 907: T{ ! 908: .na ! 909: Argument to functional is ! 910: .ad ! 911: T} l_arg1 list of results \fInconc\fP of results ! 912: _ ! 913: .T& ! 914: c | c c c. ! 915: ! 916: elements of list mapc mapcar mapcan ! 917: ! 918: sublists map maplist mapcon ! 919: .TE ! 920: .)b ! 921: .Lf mfunction "t_entry 's_disc" ! 922: .Re ! 923: a lisp object of type binary composed of t_entry and s_disc. ! 924: .No ! 925: t_entry is a pointer to the machine code for a function, and s_disc is the ! 926: discipline (e.g. lambda). ! 927: .\".pg ! 928: .Lf oblist ! 929: .Re ! 930: a list of all symbols on the oblist. ! 931: .Lf or "[g_arg1 ... ]" ! 932: .Re ! 933: the value of the first non-null argument or nil if all arguments ! 934: evaluate to nil. ! 935: .No ! 936: Evaluation proceeds left to right and stops as soon as one of the arguments ! 937: evaluates to a non-null value. ! 938: .Lf prog "l_vrbls g_exp1 ..." ! 939: .Re ! 940: the value explicitly given in a return form ! 941: or else nil if no return is done by the time the last g_exp\fIi\fP is ! 942: evaluated. ! 943: .No ! 944: the local variables are lambda-bound to nil, ! 945: then the g_exp\fIi\fP ! 946: are evaluated from left to right. ! 947: This is a prog body (obviously) and this means than ! 948: any symbols seen are not evaluated, ! 949: but are treated as labels. ! 950: This also means that return's and go's are allowed. ! 951: .Lf prog1 "'g_exp1 ['g_exp2 ...]" ! 952: .Re ! 953: g_exp1 ! 954: .Lf prog2 "'g_exp1 'g_exp2 ['g_exp3 ...]" ! 955: .Re ! 956: g_exp2 ! 957: .No ! 958: the forms are evaluated from left to right and the value of g_exp2 is ! 959: returned. ! 960: .Lf progn "'g_exp1 ['g_exp2 ...]" ! 961: .Re ! 962: the last g_exp\fIi\fP. ! 963: .Lf progv "'l_locv 'l_initv g_exp1 ..." ! 964: .Wh ! 965: l_locv is a list of symbols and l_initv is a list of expressions. ! 966: .Re ! 967: the value of the last g_exp\fIi\fP evaluated. ! 968: .No ! 969: The expressions in l_initv are evaluated from left to right ! 970: and then lambda-bound to the symbols in l_locv. ! 971: If there are too few expressions in l_initv then the missing values ! 972: are assumed to be nil. ! 973: If there are too many expressions in l_initv then the extra ones are ! 974: ignored (although they are evaluated). ! 975: Then the g_exp\fIi\fP are evaluated left to right. ! 976: The body of a progv is like the body of a progn, it is ! 977: .i not ! 978: a prog body. ! 979: (C.f. ! 980: .i let ) ! 981: .Lf purcopy "'g_exp" ! 982: .Re ! 983: a copy of g_exp with new pure cells allocated wherever possible. ! 984: .No ! 985: pure space is never swept up by the garbage collector, so this should ! 986: only be done on expressions which are not likely to become garbage ! 987: in the future. ! 988: In certain cases, data objects in pure space become read-only after ! 989: a ! 990: .i dumplisp ! 991: and then an attempt to modify the object will result in an illegal memory ! 992: reference. ! 993: .Lf purep "'g_exp" ! 994: .Re ! 995: t iff the object g_exp is in pure space. ! 996: .Lf putd "'s_name 'u_func" ! 997: .Re ! 998: u_func ! 999: .Se ! 1000: this sets the function binding of symbol s_name to u_func. ! 1001: .Lf return "['g_val]" ! 1002: .Re ! 1003: g_val (or nil if g_val is not present) from the enclosing prog or do body. ! 1004: .No ! 1005: this form is only valid in the context of a prog or do body. ! 1006: .Lf selectq "'g_key-form [l_clause1 ...]" ! 1007: .No ! 1008: This function is just like \fIcaseq\fP (see above), except that ! 1009: the symbol \fBotherwise\fP has the same semantics as the ! 1010: symbol \fBt\fP, when used as a comparator. ! 1011: .Lf setarg "'x_argnum 'g_val" ! 1012: .Wh ! 1013: x_argnum is greater than zero and less than or equal to the number of ! 1014: arguments to the lexpr. ! 1015: .Re ! 1016: g_val ! 1017: .Se ! 1018: the lexpr's x_argnum'th argument is set to g-val. ! 1019: .No ! 1020: this can only be used within the body of a lexpr. ! 1021: .Lf throw "'g_val [s_tag]" ! 1022: .Wh ! 1023: if s_tag is not given, it is assumed to be nil. ! 1024: .Re ! 1025: the value of \fI(*throw 's_tag 'g_val)\fP. ! 1026: .Lf *throw "'s_tag 'g_val" ! 1027: .Re ! 1028: g_val from the first enclosing catch with ! 1029: the tag s_tag or with no tag at all. ! 1030: .No ! 1031: this is used in conjunction with ! 1032: .i *catch ! 1033: to cause a clean jump to an enclosing context. ! 1034: .Lf unwind-protect "g_protected [g_cleanup1 ...]" ! 1035: .Re ! 1036: the result of evaluating g_protected. ! 1037: .No ! 1038: Normally g_protected is evaluated and its value ! 1039: remembered, then the g_cleanup\fIi\fP ! 1040: are evaluated and finally the saved value of g_protected is returned. ! 1041: If something should happen when evaluating g_protected which causes ! 1042: control to pass through g_protected and thus through ! 1043: the call to the unwind-protect, ! 1044: then the g_cleanup\fIi\fP will still be evaluated. ! 1045: This is useful if g_protected does something sensitive which ! 1046: must be cleaned up whether or not g_protected completes.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.