<< JunoAlgebra.mesa>> <<>> <> <> <> <> <> << This module is concerned with the interpretation of Juno symbolic expressions. It defines the semantics of the Juno language.>> DIRECTORY JunoStorage USING [Point, Coords], JunoGraphics USING[Color], JunoParseUnparse USING [Se], Rope USING [ROPE]; JunoAlgebra: DEFINITIONS = BEGIN OPEN Stor: JunoStorage, Parser: JunoParseUnparse, Gr: JunoGraphics; << - - - - SYMBOLIC EXPRESSIONS >> Se: TYPE = Parser.Se; -- Symbolic Expression. Either: << ATOM (variable, operator, or function name) REF REAL, REF INT ROPE LIST OF Se of the form (operator arg) or (operator arg arg)>> << - - - - VALUES >> Value: TYPE = REF ANY; -- the result of evaluating a Symbolic Expression. Either: << REF REAL, REF INT ROPE Point (see JunoStorage) LIST OF Value>> ValueList: TYPE = LIST OF Value; << - - - - IMPORTED TYPES>> Point: TYPE = Stor.Point; Coords: TYPE = Stor.Coords; << - - - - ALISTS >> AList: TYPE = LIST OF REF ANY; -- Association list. << Of the form (atom value atom value ... atom value) >> GetDef: PROC [name: ATOM, alist: AList] RETURNS [value: Value]; <> AddDef: PROC [name: ATOM, value: Value, alist: AList] RETURNS [newAlist: AList]; <> << - - - - EXPRESSION EVALUATION >> << The global (procedure) A-List:>> << The global or procedure AList (that maps procedure names into symbolic expresions) is an implicit paramter of Eval, Apply and its relatives. It is maintained by the JunoProcViewer module.>> << The contents of the global a-list reflect what the parser found in the proc viewers during the most recent call to JunoProcViewer.ParseAll. Any edits since then will not be noticed by the evaluator. Ergo, JunoTop should call ParseAll frequently, e.g. before every refresh and before each additional "call procedure" command from the user. >> << Comand mode vs. eval mode:>> << The cmd flag in Eval and Apply specifies that the given Se should be interpreted as an executable command, rather than a value -returning expression.>> << If cmd = false, an atomic expr is looked up in the varable alist, and the result returned without further evaluations. If cmd=FALSE, atomic exprs are looked up in the proc file alist; the result must be a parameterless lambda, that is evaluated again (In juno, a call to a parameterless procedure Foo is written ``Foo'' instead of "Foo()"). >> << Some operations (like print and draw) are allowed only if cmd=TRUE; conversely, others (such as unary minus) are allowed only when cmd=FALSE. Note that function arguments are always evaluated with cmd=FALSE, and the left part of "A; B" is always evaluated with cmd=TRUE.>> Eval: PROC [expr: Se, alist: AList, cmd: BOOL _ FALSE] RETURNS [value: Value]; <> Apply: PROC[op: Se, args: ValueList, cmd: BOOL _ FALSE] RETURNS [value: Value]; <> <> < ...) ).>> EvalError: SIGNAL [what: Rope.ROPE] RETURNS [value: Value]; <> << - - - - PROCEDURE CALL>> Call: PROC[func: ATOM, args: ValueList]; <> << - - - - MISCELLANEA>> EvalColor: PROC[expr: Se, alist: AList] RETURNS [color: Gr.Color]; <> END.