123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- PSL Manual 7 February 1983 The Interpreter
- section 11.0 page 11.1
- CHAPTER 11
CHAPTER 11
CHAPTER 11
- THE INTERPRETER
THE INTERPRETER
THE INTERPRETER
- 11.1. Evaluator Functions Eval and Apply. . . . . . . . 11.1
- 11.2. Support Functions for Eval and Apply . . . . . . . 11.5
- 11.3. Special Evaluator Functions, Quote, and Function . . . 11.6
- 11.4. Support Functions for Macro Evaluation . . . . . . 11.6
- 11.1. Evaluator Functions Eval and Apply
11.1. Evaluator Functions Eval and Apply
11.1. Evaluator Functions Eval and Apply
- The PSL evaluator uses an identifier's function cell (SYMFNC(id#) which
- is directly accessible from kernel functions only) to access the address of
- the code for executing the identifier's function definition, as described
- in chapter 10. The function cell contains either the entry address of a
- compiled function, or the address of a support routine that either signals
- an undefined function or calls the lambda interpreter. The PSL model of a
- function call is to place the arguments (after treatment appropriate to
- function type) in "registers", and then to jump to or call the code in the
- function cell.
- ____
Expressions which can be legally evaluated are called forms. They are
- restricted S-expressions:
- ____ __
form ::= id
- ________
| constant
- __ ____ ____
| (id form ... form)
- ___
| (special . any) % Special cases: COND, PROG, etc.
- _____ _____
_____ _____
_____ _____
fexpr macro
fexpr macro
% usually fexprs or macros.
- Eval Apply
Eval Apply ____
The definitions of Eval and Apply may clarify which expressions are forms.
- Eval Apply ContinuableError
Eval Apply ContinuableError
In Eval, Apply, and the support functions below, ContinuableError is used
- ______
to indicate malformed lambda expressions, undefined functions or mismatched
- argument numbers; the user is permitted to correct the offending expression
- Break
Break
or to define a missing function inside a Break loop.
- Eval Apply
Eval Apply
The functions Eval and Apply are central to the PSL interpreter. Since
- their efficiency is important, some of the support functions they use are
- LambdaApply LambdaEvalApply CodeApply
LambdaApply LambdaEvalApply CodeApply
hand-coded in LAP. The functions LambdaApply, LambdaEvalApply, CodeApply,
- CodeEvalApply IDApply1 Eval Apply
CodeEvalApply IDApply1 Eval Apply
CodeEvalApply, and IDApply1 are support functions for Eval and Apply.
- CodeApply CodeEvalApply IDApply1
CodeApply CodeEvalApply IDApply1
CodeApply and CodeEvalApply are coded in LAP. IDApply1 is handled by the
- compiler.
The Interpreter 7 February 1983 PSL Manual
- page 11.2 section 11.1
- Eval
Eval _ ____ ___ ____
(Eval U:form): any expr
- _
The value of the form U is computed. The following is an
- approximation of the real code, leaving out some implementation
- details.
PSL Manual 7 February 1983 The Interpreter
- section 11.1 page 11.3
- (DE EVAL (U)
- (PROG (FN)
- (COND
- ((IDP U) (RETURN (VALUECELL U))))
- % ValueCell returns the contents of Value Cell if ID
- % BoundP, else signals unbound error.
- (COND ((NOT (PAIRP U)) (RETURN U)))
- % This is a "constant" which EVAL's to itself
- (COND
- ((EQCAR (CAR U) 'LAMBDA)
- (RETURN
- (LAMBDAEVALAPPLY (CAR U) (CDR U)))))
- % LambdaEvalApply applies the lambda- expression Car U
- % list containing the evaluation of each argument in C
- (COND
- ((CODEP (CAR U))
- (RETURN (CODEEVALAPPLY (CAR U) (CDR U)))))
- % CodeEvalApply applies the function with code-pointer
- % to the list containing the evaluation of each argume
- % Cdr U.
- (COND
- ((NOT (IDP (CAR U)))
- (RETURN
- % permit user to correct U, and reevaluate.
- (CONTINUABLEERROR 1101
- "Ill-formed expression in EVAL" U))))
- (SETQ FN (GETD (CAR U)))
- (COND
- ((NULL FN)
- % user might define missing function and retry
- (RETURN
- (CONTINUABLEERROR 1001 "Undefined function EVAL
- (COND
- ((EQ (CAR FN) 'EXPR)
- (RETURN
- (COND
- ((CODEP (CDR FN))
- % CodeEvalApply applies the function with
- % codepointer Cdr FN to the list containing
- % evaluation of each argument in Cdr U.
- (CODEEVALAPPLY (CDR FN) (CDR U)))
- (T
- (LAMBDAEVALAPPLY
- (CDR FN) (CDR U)))))))
- % LambdaEvalApply applies the lambda-expression Cdr FN
The Interpreter 7 February 1983 PSL Manual
- page 11.4 section 11.1
- % list containing the evaluation of each argument in C
- (COND
- ((EQ (CAR FN) 'FEXPR)
- % IDApply1 applies the fexpr Car U to the list of
- % unevaluated arguments.
- (RETURN (IDAPPLY1 (CDR U) (CAR U))))
- ((EQ (CAR FN) 'MACRO)
- % IDApply1 first expands the macro call U and then
- % evaluates the result.
- (RETURN (EVAL (IDAPPLY1 U (CAR U)))))
- ((EQ (CAR FN) 'NEXPR)
- % IDApply1 applies the nexpr Car U to the list obt
- % by evaluating the arguments in Cdr U.
- (RETURN (IDAPPLY1 (EVLIS (CDR U)) (CAR U)))))))
- Apply
Apply __ __ ________ ____ ____ ____ ___ ____
(Apply FN:{id,function} ARGS:form-list): any expr
- Apply
Apply
Apply allows one to make an indirect function call. It returns
- __ ____
the value of FN with actual parameters ARGS. The actual
- ____
parameters in ARGS are already in the form required for binding
- __
to the formal parameters of FN. PSL permits the application of
- _____ ______ _____
_____ ______ _____
_____ ______ _____
macro nexprs fexpr Apply Cdr
macro nexprs fexpr Apply Cdr
macros, nexprs and fexprs; the effect is the same as (Apply (Cdr
- GetD
GetD __ ____
(GetD FN)) ARGS); i.e. no fix-up is done to quote arguments, etc.
- Apply List
Apply List
as in some LISPs. A call to Apply using List on the second
- Apply List
Apply List
argument [e.g. (Apply F (List X Y))] is compiled so that the
- ____
list is not actually constructed.
- The following is an approximation of the real code, leaving out
- implementation details.
PSL Manual 7 February 1983 The Interpreter
- section 11.1 page 11.5
- (DE APPLY (FN ARGS)
- (PROG (DEFN)
- (COND
- ((CODEP FN)
- % Spread the ARGS into the registers and transfer
- % entry point of the function.
- (RETURN (CODEAPPLY FN ARGS)))
- ((EQCAR FN 'LAMBDA)
- % Bind the actual parameters in ARGS to the formal
- % parameters of the lambda expression If the two l
- % are not of equal length then signal
- % (CONTINUABLEERROR 1204
- % "Number of parameters do not match"
- % (CONS FN ARGS))
- (RETURN (LAMBDAAPPLY FN ARGS)))
- ((NOT (IDP FN))
- (RETURN (CONTINUABLEERROR 1104
- "Ill-formed function in APPLY"
- (CONS FN ARG))))
- ((NULL (SETQ DEFN (GETD FN)))
- (RETURN (CONTINUABLEERROR 1004
- "Undefined function in Apply"
- (CONS FN ARGS))))
- (T
- % Do EXPR's, NEXPR's, FEXPR's and MACRO's alike, a
- % EXPR's
- (RETURN (APPLY (CDR DEFN) ARGS))))))
- [??? Instead, could check for specific function types in Apply ???]
[??? Instead, could check for specific function types in Apply ???]
[??? Instead, could check for specific function types in Apply ???]
- 11.2. Support Functions for Eval and Apply
11.2. Support Functions for Eval and Apply
11.2. Support Functions for Eval and Apply
- EvLis
EvLis _ ___ ____ ___ ____ ____
(EvLis U:any-list): any-list expr
- EvLis
EvLis ____ _
EvLis returns a list of the evaluation of each element of U.
- LambdaApply
LambdaApply __ ______ _ ___ ____ ___ ____
(LambdaApply FN:lambda, U:any-list): any expr
- __ ______ ______
Checks that FN is a legal lambda, binds the formals of the lambda
- LBind1 EvProgN
LBind1 _ EvProgN
using LBind1 to the arguments in U, and then uses EvProgN to
- ______
evaluate the forms in the lambda body. Finally the formals are
- UnBindN
UnBindN
unbound, using UnBindN, and the result returned.
The Interpreter 7 February 1983 PSL Manual
- page 11.6 section 11.2
- LambdaEvalApply
LambdaEvalApply __ ______ _ ____ ____ ___ ____
(LambdaEvalApply FN:lambda, U:form-list): any expr
- LambdaApply EvLis
LambdaApply __ EvLis _
Essentially LambdaApply(FN,EvLis(U)), though done more
- efficiently.
- CodeApply
CodeApply __ ____ _______ _ ___ ____ ___ ____
(CodeApply FN:code-pointer, U:any-list): any expr
- _
Efficiently spreads the arguments in U into the "registers", and
- __
then transfers to the starting address referred to by FN
- CodeEvalApply
CodeEvalApply __ ____ _______ _ ___ ____ ___ ____
(CodeEvalApply FN:code-pointer, U:any-list): any expr
- CodeApply EvLis
CodeApply __ EvLis _
Essentially CodeApply(FN,EvLis(U)), though more efficient.
- The following entry points are used to get efficient calls on named
- functions, and are open compiled.
- IdApply0
IdApply0 __ __ ___ ____
(IdApply0 FN:id): any expr
- IdApply1
IdApply1 __ ____ __ __ ___ ____
(IdApply1 A1:form, FN:id): any expr
- IdApply2
IdApply2 __ ____ __ ____ __ __ ___ ____
(IdApply2 A1:form, A2:form, FN:id): any expr
- IdApply3
IdApply3 __ ____ __ ____ __ ____ __ __ ___ ____
(IdApply3 A1:form, A2:form, A3:form, FN:id): any expr
- IdApply4
IdApply4 __ ____ __ ____ __ ____ __ ____ __ __ ___ ____
(IdApply4 A1:form, A2:form, A3:form, A4:form, FN:id): any expr
- EvProgN
EvProgN _ ____ ____ ___ ____
(EvProgN U:form-list): any expr
- _
Evaluates each form in U in turn, returning the value of the
- ProgN
ProgN
last. Used for various implied ProgNs.
- 11.3. Special Evaluator Functions, Quote, and Function
11.3. Special Evaluator Functions, Quote, and Function
11.3. Special Evaluator Functions, Quote, and Function
- Quote
Quote _ ___ ___ _____
(Quote U:any): any fexpr
- Eval
_ Eval
Returns U. Thus the argument is not evaluated by Eval.
PSL Manual 7 February 1983 The Interpreter
- section 11.3 page 11.7
- MkQuote
MkQuote _ ___ ____ ____
(MkQuote U:any): list expr
- MkQuote List
MkQuote _ List
(MkQuote U) returns (List 'QUOTE U)
- Function
Function __ ________ ________ _____
(Function FN:function): function fexpr
- __ __
The function FN is to be passed to another function. If FN is to
- have side effects its free variables must be FLUID or GLOBAL.
- Function Quote
Function Quote
Function is like Quote but its argument may be affected by
- compilation.
- [??? Add FQUOTE, and make FUNCTION become CLOSURE ???]
[??? Add FQUOTE, and make FUNCTION become CLOSURE ???]
[??? Add FQUOTE, and make FUNCTION become CLOSURE ???]
- Closure
Closure
See also the discussion of Closure and related functions in Section 10.3.
- 11.4. Support Functions for Macro Evaluation
11.4. Support Functions for Macro Evaluation
11.4. Support Functions for Macro Evaluation
- Expand
Expand _ ____ __ ________ ____ ____
(Expand L:list, FN:function): list expr
- __
FN is a defined function of two arguments to be used in the
- _____
_____
_____
macro Expand
macro Expand ____
expansion of a macro. Expand returns a list in the form:
- (FN L[0] (FN L[1] ... (FN L[n-1] L[n]) ... ))
- _
"n" is the number of elements in L, L[i] is the i'th element of
- _
L.
- (DE EXPAND (L FN)
- (COND ((NULL (CDR L)) (CAR L))
- (T (LIST FN (CAR L) (EXPAND (CDR L) FN)))))
- [??? Add RobustExpand (sure!) (document) ???]
[??? Add RobustExpand (sure!) (document) ???]
[??? Add RobustExpand (sure!) (document) ???]
- [??? Add an Evalhook and Apply hook for CMU toplevel (document) ???]
[??? Add an Evalhook and Apply hook for CMU toplevel (document) ???]
[??? Add an Evalhook and Apply hook for CMU toplevel (document) ???]
|