#!/bin/bash # If this file has already been sourced, just return test $(EVALUATOR_SH+true)TODO && return declare -g EVALUATOR_SH = 'true' source ${BASH_SOURCE%/*}/common.sh source ${BASH_SOURCE%/*}/variables.sh source ${BASH_SOURCE%/*}/callable.sh source ${BASH_SOURCE%/*}/specialforms.sh source ${BASH_SOURCE%/*}/specialforms.lambda.sh source ${BASH_SOURCE%/*}/environment.sh sourceTODO ${BASH_SOURCE%/*}/evaluator.functions.builtin.sh declare -g EVALUATOR_DEBUG = '0' # We declare this so that we have a variable we can use over an over, # rather than creating a new variable each time we need a result # declare -g EVALUATOR_VARIABLE="EVAL_RESULT" # variable::new -name "${EVALUATOR_VARIABLE}" Nil "" # # eval # proc evaluator::eval { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::eval $(@)" ; }TODO declare envToken = $(1)TODO declare exprToken = $(2) if variable::type::instanceOf $(exprToken) Atom { variable::clone $(exprToken) global RESULT := $(RESULT) return } elif variable::type::instanceOf $(exprToken) Callable { variable::clone $(exprToken) global RESULT := $(RESULT) return } elif variable::type::instanceOf $(exprToken) Identifier { environment::getValue $(envToken) $(exprToken) global RESULT := $(RESULT) return } elif variable::type::instanceOf $(exprToken) LinkedList { evaluator::eval_list $(@) global RESULT := $(RESULT) return } else { stderr "evaluator::eval / Unhandled type for token [$exprToken]" variable::printMetadata exit 1 } stderr "should never get here" exit 1 } proc evaluator::evalFromLinkedList { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::eval $(@)" ; }TODO declare envToken = $(1)TODO declare expressions = $(2)TODO ;# A LinkedList of expressions # evaluate expressions declare currentSexp = '', currentResult = '' while ! variable::LinkedList::isEmpty_c "${expressions}" { variable::LinkedList::first $(expressions) ; global currentSexp := $(RESULT) variable::LinkedList::rest $(expressions) ; global expressions := $(RESULT) evaluator::eval $envToken $currentSexp global currentResult := $(RESULT) } global RESULT := $(currentResult) return 0 } proc evaluator::eval_list { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::eval_list $(@)" ; }TODO declare envToken = $(1)TODO declare listToken = $(2) if ! variable::type::instanceOf $listToken LinkedList { stderr "evaluator::eval_list / must be a list" exit 1 } variable::LinkedList::length $(listToken) if [[ "${RESULT}" -eq 0 ]] { variable::new Nil "" global RESULT := $(RESULT) return } variable::LinkedList::first $(listToken) evaluator::eval $(envToken) $(RESULT)TODO ; declare headItem = $(RESULT) variable::type $(headItem)TODO ; declare headType = $(RESULT) variable::value $(headItem)TODO ; declare headValue = $(RESULT) # variable::toSexp $listToken # variable::debug $headItem variable::LinkedList::rest $listTokenTODO ; declare rest = $(RESULT) matchstr $(headType) { BuiltinFunction { evaluator::call_builtinFunction $(envToken) $(headItem) $(rest) global RESULT := $(RESULT) } BuiltinMacro { # Lookup the identifier in the environment and return it's value evaluator::call_builtinMacro $(envToken) $(headItem) $(rest) global RESULT := $(RESULT) } SpecialForm { # Lookup the identifier in the environment and return it's value evaluator::call_specialForm $(envToken) $(headItem) $(rest) global RESULT := $(RESULT) } Lambda { evaluator::call_lambda $(envToken) $(headItem) $(rest) global RESULT := $(RESULT) } Macro { stderr "evaluator::eval_list / evaluator::eval_list not implemented yet" exit 1 } * { stderr "evaluator::eval_list / type [$(headType)] not valid" exit 1 } } } proc evaluator::call_builtinFunction { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::call_builtinFunction($(#@)) $(@)" ; }TODO declare env = $(1)TODO declare functionToken = $(2)TODO declare argsToken = $(3) variable::value $(functionToken)TODO ; declare functionName = $(RESULT) if ! functionExists $functionName { stderr "The builtin function [$(functionName)] does not exist" exit 1 } eval $(functionName) $(env) $(functionName) $(argsToken) global RESULT := $RESULT } proc evaluator::call_lambda { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::call_lambda $(@)" ; }TODO declare env = $(1)TODO declare lambdaToken = $(2)TODO declare argsToken = $(3) variable::LinkedList::newTODO ; declare passedArgs = $(RESULT) while ! variable::LinkedList::isEmpty_c "${argsToken}" { variable::LinkedList::first $(argsToken) evaluator::eval $(env) $(RESULT) variable::LinkedList::append $passedArgs $(RESULT) variable::LinkedList::rest $(argsToken); global argsToken := $(RESULT) } variable::Lambda::call $lambdaToken $passedArgs global RESULT := $(RESULT) } proc evaluator::call_builtinMacro { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::call_builtinMacro $(@)" ; } variable::set $(EVALUATOR_VARIABLE) nil nilTODO declare env = $(1)TODO declare identifier = $(2)TODO declare -a values = '('${3}) matchstr $(identifier) { "if" { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::call_identifier in 'if'" ; } stderr "[if] not implemented yet" } * { stderr "evaluator::call_identifier / Not implemented [$(identifier)]" } } } proc evaluator::call_specialForm { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::call_specialForm($(#@)) $(@)" ; }TODO declare env = $(1)TODO declare functionToken = $(2)TODO declare argsToken = $(3) variable::value $(functionToken)TODO ; declare functionName = $(RESULT) if ! functionExists $functionName { stderr "The builtin function [$(functionName)] does not exist" exit 1 } eval $(functionName) $(env) $(functionName) $(argsToken) global RESULT := $(RESULT) } proc evaluator::setup_builtinTODO { declare env = $(1)TODO declare type = $(2)TODO declare identifier = $(3)TODO declare functionName = $(4) variable::new $(type) $(functionName)TODO declare t1 = $(RESULT) variable::new String $(identifier)TODO declare t2 = $(RESULT) environment::setVariable $(env) $(t2) $(t1) } proc evaluator::setup_builtinsTODO { declare env = $(1) evaluator::setup_builtin $(env) BuiltinFunction "+" "evaluator::functions::builtin::add" evaluator::setup_builtin $(env) BuiltinFunction "-" "evaluator::functions::builtin::subtract" evaluator::setup_builtin $(env) BuiltinFunction "*" "evaluator::functions::builtin::multiply" evaluator::setup_builtin $(env) BuiltinFunction "/" "evaluator::functions::builtin::divide" evaluator::setup_builtin $(env) BuiltinFunction "=" "evaluator::functions::builtin::equals" evaluator::setup_builtin $(env) BuiltinFunction "<" "evaluator::functions::builtin::lessthan" evaluator::setup_builtin $(env) BuiltinFunction ">" "evaluator::functions::builtin::greaterthan" evaluator::setup_builtin $(env) BuiltinFunction "<=" "evaluator::functions::builtin::lessthanorequal" evaluator::setup_builtin $(env) BuiltinFunction ">=" "evaluator::functions::builtin::greaterthanorequal" evaluator::setup_builtin $(env) SpecialForm "if" "evaluator::specialforms::if" evaluator::setup_builtin $(env) SpecialForm "lambda" "evaluator::specialforms::lambda" evaluator::setup_builtin $(env) SpecialForm "let" "evaluator::specialforms::let" evaluator::setup_builtin $(env) SpecialForm 'let*' "evaluator::specialforms::letstar" environment::pushScope $(env) } # ====================================================== if test $0 != $BASH_SOURCE { return } proc createTestEnv { environment::new evaluator::setup_builtins $(RESULT) } proc setInEnvTODO { declare env = $(1)TODO declare name = $(2)TODO declare type = $(3)TODO declare value = $(4) variable::new Identifier $(name)TODO ; declare nameToken = $(RESULT) variable::new $(type) $(value)TODO ; declare valueToken = $(RESULT) environment::setVariable $(env) $(nameToken) $(valueToken) variable::new Identifier $(name) } proc appendToListTODO { declare listToken = $(1)TODO declare -a items = '("'TODO ${@:2}") declare -i size = ''TODO declare -i max_index = ''TODO declare currentType = ''TODO declare currentValue = '' (( size=${#items[@]}, max_index=size-1 )) if ((size % 2 != 0)) { stderr "appendToList: number of items to add to list not even" exit 1 }TODO for ((i=0; i<=max_index; i=i+2)); do currentType="${items[${i}]}" currentValue="${items[((i+1))]}" variable::new "${currentType}" "${currentValue}" variable::LinkedList::append "${listToken}" "${RESULT}" done } declare env = '' # Atom, return the value createTestEnv ; global env := $(RESULT) variable::new Boolean true ; global valueToken := $(RESULT) evaluator::eval $(env) $valueToken variable::debug $(RESULT) ; \ assert::equals "Boolean :: true" $(RESULT) "atom/boolean" # # Identifier/Variable # createTestEnv ; global env := $(RESULT) setInEnv $(env) v Integer 4 ; global token := $(RESULT) evaluator::eval $(env) $(token) variable::debug $(RESULT) ; \ assert::equals "Integer :: 4" $(RESULT) "identifier evaluation" # + createTestEnv ; global env := $(RESULT) variable::LinkedList::new ; global vCode := $(RESULT) appendToList $vCode Identifier '+' Integer 5 Integer 2 evaluator::eval $(env) $vCode variable::debug $(RESULT) ; \ assert::equals "Integer :: 7" $(RESULT) "(+ 5 2)" # - createTestEnv ; global env := $(RESULT) variable::LinkedList::new ; global vCode := $(RESULT) appendToList $vCode Identifier '-' Integer 5 Integer 2 evaluator::eval $(env) $vCode variable::debug $(RESULT) ; \ assert::equals "Integer :: 3" $(RESULT) "(- 5 2)" # * createTestEnv ; global env := $(RESULT) variable::LinkedList::new ; global vCode := $(RESULT) appendToList $vCode Identifier '*' Integer 5 Integer 2 evaluator::eval $(env) $vCode variable::debug $(RESULT) ; \ assert::equals "Integer :: 10" $(RESULT) "(* 5 2)" # / createTestEnv ; global env := $(RESULT) variable::LinkedList::new ; global vCode := $(RESULT) appendToList $vCode Identifier '/' Integer 6 Integer 2 evaluator::eval $(env) $vCode variable::debug $(RESULT) ; \ assert::equals "Integer :: 3" $(RESULT) "(/ 6 2)" # = / true createTestEnv ; global env := $(RESULT) variable::LinkedList::new ; global vCode := $(RESULT) appendToList $vCode Identifier '=' Integer 2 Integer 2 evaluator::eval $(env) $vCode variable::debug $(RESULT) ; \ assert::equals "Boolean :: true" $(RESULT) "(= 2 2)" # = / false createTestEnv ; global env := $(RESULT) variable::LinkedList::new ; global vCode := $(RESULT) appendToList $vCode Identifier '=' Integer 2 Integer 3 evaluator::eval $(env) $vCode variable::debug $(RESULT) ; \ assert::equals "Boolean :: false" $(RESULT) "(= 2 3)" # # variable as argument # createTestEnv ; global env := $(RESULT) setInEnv $(env) u Integer 4 ; global token := $(RESULT) setInEnv $(env) v Integer 4 ; global token := $(RESULT) setInEnv $(env) w Integer 2 ; global token := $(RESULT) # variable as argument / + / first variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '+' Identifier 'v' Integer 2 evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 6" $(RESULT) "(+ 2)" # variable as argument / + / second variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '+' Integer 2 Identifier 'v' evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 6" $(RESULT) "(+ 2 )" # variable as argument / - / first variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '-' Identifier 'v' Integer 2 evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 2" $(RESULT) "(- 2)" # variable as argument / - / second variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '-' Integer 2 Identifier 'v' evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: -2" $(RESULT) "(- 2 )" # variable as argument / * / first variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '*' Identifier 'v' Integer 2 evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 8" $(RESULT) "(* 2)" # variable as argument / * / second variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '*' Integer 2 Identifier 'v' evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 8" $(RESULT) "(* 2 )" # variable as argument / / / first variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '/' Identifier 'v' Integer 2 evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 2" $(RESULT) "(/ 2)" # variable as argument / + / second variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '/' Integer 12 Identifier 'v' evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 3" $(RESULT) "(/ 12 )" # variable as argument / = / first variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '=' Identifier 'v' Integer 2 evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Boolean :: false" $(RESULT) "(= 2)" # variable as argument / + / second variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '=' Integer 4 Identifier 'v' evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Boolean :: true" $(RESULT) "(= 4 )" # # Sub expressions # createTestEnv ; global env := $(RESULT) setInEnv $(env) u Integer 4 ; global token := $(RESULT) setInEnv $(env) v Integer 4 ; global token := $(RESULT) setInEnv $(env) w Integer 2 ; global token := $(RESULT) variable::new LinkedList ; global slistOne := $(RESULT) appendToList $slistOne Identifier + Integer 4 Identifier v variable::new LinkedList ; global slistTwo := $(RESULT) appendToList $slistTwo Identifier - Integer 4 Identifier w variable::new LinkedList ; global vCode := $(RESULT) appendToList $vCode Identifier '*' variable::LinkedList::append $vCode $slistTwo variable::LinkedList::append $vCode $slistOne evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 16" $(RESULT) "(* (+ 4 ) (- 4 ))" # # lambda # createTestEnv ; global lambdaEnv := $(RESULT) setInEnv $lambdaEnv "y" Integer 10 variable::LinkedList::new ; global lambdaArgs := $(RESULT) appendToList $lambdaArgs Identifier "x" variable::LinkedList::new ; global lambdaExpression := $(RESULT) appendToList $lambdaExpression Identifier '*' Identifier "x" Identifier "y" variable::LinkedList::new ; global lambdaCode := $(RESULT) variable::LinkedList::append $lambdaCode $lambdaExpression variable::Lambda::new "$lambdaEnv $lambdaArgs $lambdaCode" ; global lambda := $(RESULT) createTestEnv ; global env := $(RESULT) setInEnv $(env) "a" Integer 5 variable::new LinkedList ; global vCode := $(RESULT) variable::LinkedList::append $vCode $lambda appendToList $vCode Identifier "a" evaluator::eval $(env) $(vCode) variable::debug $(RESULT) ; \ assert::equals "Integer :: 50" $(RESULT) "env(a=5) ((lambda[env(y=10)] (x) (* y x)) a)" #variable::printMetadata #echo "typeof ${vCode}=$(variable::type_p $vCode)" assert::report if test $(1+isset) && test $1 == "debug" { variable::printMetadata } (CommandList children: [ (AndOr children: [ (C {(Lit_Other "[")} { (BracedVarSub token: suffix_op: (StringUnary op_id:VTest_Plus arg_word:{(true)}) spids: [9 13] ) } {(Lit_Other "]")} ) (ControlFlow token:) ] op_id: Op_DAmp ) (Assignment keyword: Assign_Declare flags: ["'-g'"] pairs: [(assign_pair lhs:(LhsName name:EVALUATOR_SH) op:Equal rhs:{(true)} spids:[25])] spids: [21] ) (C {(.)} { (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ("*")}) spids: [31 36] ) (/common.sh) } ) (C {(.)} { (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ("*")}) spids: [41 46] ) (/variables.sh) } ) (C {(.)} { (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ("*")}) spids: [51 56] ) (/callable.sh) } ) (C {(.)} { (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ("*")}) spids: [61 66] ) (/specialforms.sh) } ) (C {(.)} { (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ("*")}) spids: [71 76] ) (/specialforms.lambda.sh) } ) (C {(.)} { (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ("*")}) spids: [81 86] ) (/environment.sh) } ) (C {(.)} { (BracedVarSub token: suffix_op: (StringUnary op_id:VOp1_Percent arg_word:{(Lit_Slash /) ("*")}) spids: [91 96] ) (/evaluator.functions.builtin.sh) } ) (Assignment keyword: Assign_Declare flags: ["'-g'"] pairs: [(assign_pair lhs:(LhsName name:EVALUATOR_DEBUG) op:Equal rhs:{(0)} spids:[104])] spids: [100] ) (FuncDef name: "evaluator::eval" body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {(${ VSub_Name EVALUATOR_DEBUG)} right: {(1)} ) ) terminator: ) ] action: [ (Sentence child: (C {(stderr)} {(DQ ("evaluator::eval ") (${ VSub_At "@"))}) terminator: ) ] spids: [-1 157] ) ] spids: [-1 170] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:envToken) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [176] ) ] spids: [174] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:exprToken) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [186] ) ] spids: [184] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (type) (Lit_Other ":") (Lit_Other ":") (instanceOf) } {(DQ (${ VSub_Name exprToken))} {(Atom)} ) terminator: ) ] action: [ (C {(variable) (Lit_Other ":") (Lit_Other ":") (clone)} {(DQ (${ VSub_Name exprToken))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [229] ) ] spids: [229] ) (ControlFlow token:) ] spids: [-1 214] ) (if_arm cond: [ (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (type) (Lit_Other ":") (Lit_Other ":") (instanceOf) } {(DQ (${ VSub_Name exprToken))} {(Callable)} ) terminator: ) ] action: [ (C {(variable) (Lit_Other ":") (Lit_Other ":") (clone)} {(DQ (${ VSub_Name exprToken))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [274] ) ] spids: [274] ) (ControlFlow token:) ] spids: [240 259] ) (if_arm cond: [ (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (type) (Lit_Other ":") (Lit_Other ":") (instanceOf) } {(DQ (${ VSub_Name exprToken))} {(Identifier)} ) terminator: ) ] action: [ (C {(environment) (Lit_Other ":") (Lit_Other ":") (getValue)} {(DQ (${ VSub_Name envToken))} {(DQ (${ VSub_Name exprToken))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [325] ) ] spids: [325] ) (ControlFlow token:) ] spids: [285 304] ) (if_arm cond: [ (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (type) (Lit_Other ":") (Lit_Other ":") (instanceOf) } {(DQ (${ VSub_Name exprToken))} {(LinkedList)} ) terminator: ) ] action: [ (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval_list)} {(DQ (${ VSub_At "@"))}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [370] ) ] spids: [370] ) (ControlFlow token:) ] spids: [336 355] ) ] else_action: [ (C {(stderr)} { (DQ ("evaluator::eval / Unhandled type for token [") ($ VSub_Name "$exprToken") ("]") ) } ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (printMetadata)}) (C {(exit)} {(1)}) ] spids: [381 405] ) (C {(stderr)} {(DQ ("should never get here"))}) (C {(exit)} {(1)}) ] spids: [139] ) spids: [130 138] ) (FuncDef name: "evaluator::evalFromLinkedList" body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {(${ VSub_Name EVALUATOR_DEBUG)} right: {(1)} ) ) terminator: ) ] action: [ (Sentence child: (C {(stderr)} {(DQ ("evaluator::eval ") (${ VSub_At "@"))}) terminator: ) ] spids: [-1 449] ) ] spids: [-1 462] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:envToken) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [468] ) ] spids: [466] ) (Sentence child: (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:expressions) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [478] ) ] spids: [476] ) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs:(LhsName name:currentSexp) op:Equal spids:[497]) (assign_pair lhs:(LhsName name:currentResult) op:Equal spids:[499]) ] spids: [495] ) (While cond: [ (Sentence child: (Pipeline children: [ (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (isEmpty_c) } {(DQ (${ VSub_Name expressions))} ) ] negated: True ) terminator: ) ] body: (DoGroup children: [ (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (first) } {(DQ (${ VSub_Name expressions))} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:currentSexp) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [541] ) ] spids: [541] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (rest) } {(DQ (${ VSub_Name expressions))} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:expressions) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [563] ) ] spids: [563] ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {($ VSub_Name "$envToken")} {($ VSub_Name "$currentSexp")} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:currentResult) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [579] ) ] spids: [579] ) ] spids: [522 585] ) ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name currentResult))} spids: [588] ) ] spids: [588] ) (ControlFlow token: arg_word:{(0)}) ] spids: [431] ) spids: [422 430] ) (FuncDef name: "evaluator::eval_list" body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {(${ VSub_Name EVALUATOR_DEBUG)} right: {(1)} ) ) terminator: ) ] action: [ (Sentence child: (C {(stderr)} {(DQ ("evaluator::eval_list ") (${ VSub_At "@"))}) terminator: ) ] spids: [-1 630] ) ] spids: [-1 643] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:envToken) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [649] ) ] spids: [647] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:listToken) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [659] ) ] spids: [657] ) (If arms: [ (if_arm cond: [ (Sentence child: (Pipeline children: [ (C {(variable) (Lit_Other ":") (Lit_Other ":") (type) (Lit_Other ":") (Lit_Other ":") (instanceOf) } {($ VSub_Name "$listToken")} {(LinkedList)} ) ] negated: True ) terminator: ) ] action: [ (C {(stderr)} {(DQ ("evaluator::eval_list / must be a list"))}) (C {(exit)} {(1)}) ] spids: [-1 685] ) ] spids: [-1 700] ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (length) } {(DQ (${ VSub_Name listToken))} ) (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_eq left: {(DQ (${ VSub_Name RESULT))} right: {(0)} ) ) terminator: ) ] action: [ (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(Nil)} {(DQ )}) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [751] ) ] spids: [751] ) (ControlFlow token:) ] spids: [-1 736] ) ] spids: [-1 762] ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (first) } {(DQ (${ VSub_Name listToken))} ) (Sentence child: (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name envToken))} {(DQ (${ VSub_Name RESULT))} ) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:headItem) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [802] ) ] spids: [800] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (type)} {(DQ (${ VSub_Name headItem))}) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:headType) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [825] ) ] spids: [823] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (value)} {(DQ (${ VSub_Name headItem))}) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:headValue) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [848] ) ] spids: [846] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (rest) } {($ VSub_Name "$listToken")} ) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:rest) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [880] ) ] spids: [878] ) (Case to_match: {(DQ (${ VSub_Name headType))} arms: [ (case_arm pat_list: [{(BuiltinFunction)}] action: [ (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (call_builtinFunction)} {(DQ (${ VSub_Name envToken))} {(DQ (${ VSub_Name headItem))} {(DQ (${ VSub_Name rest))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [928] ) ] spids: [928] ) ] spids: [900 901 936 -1] ) (case_arm pat_list: [{(BuiltinMacro)}] action: [ (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (call_builtinMacro)} {(DQ (${ VSub_Name envToken))} {(DQ (${ VSub_Name headItem))} {(DQ (${ VSub_Name rest))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [970] ) ] spids: [970] ) ] spids: [939 940 978 -1] ) (case_arm pat_list: [{(SpecialForm)}] action: [ (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (call_specialForm)} {(DQ (${ VSub_Name envToken))} {(DQ (${ VSub_Name headItem))} {(DQ (${ VSub_Name rest))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1012] ) ] spids: [1012] ) ] spids: [981 982 1020 -1] ) (case_arm pat_list: [{(Lambda)}] action: [ (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (call_lambda)} {(DQ (${ VSub_Name envToken))} {(DQ (${ VSub_Name headItem))} {(DQ (${ VSub_Name rest))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1051] ) ] spids: [1051] ) ] spids: [1023 1024 1059 -1] ) (case_arm pat_list: [{(Macro)}] action: [ (C {(stderr)} { (DQ ( "evaluator::eval_list / evaluator::eval_list not implemented yet" ) ) } ) (C {(exit)} {(1)}) ] spids: [1062 1063 1078 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (C {(stderr)} { (DQ ("evaluator::eval_list / type [") (${ VSub_Name headType) ("] not valid")) } ) (C {(exit)} {(1)}) ] spids: [1081 1082 1101 -1] ) ] spids: [889 897 1104] ) ] spids: [612] ) spids: [603 611] ) (FuncDef name: "evaluator::call_builtinFunction" body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {(${ VSub_Name EVALUATOR_DEBUG)} right: {(1)} ) ) terminator: ) ] action: [ (Sentence child: (C {(stderr)} { (DQ ("evaluator::call_builtinFunction(") (BracedVarSub token: prefix_op: VSub_Pound spids: [1143 1146] ) (") ") (${ VSub_At "@") ) } ) terminator: ) ] spids: [-1 1137] ) ] spids: [-1 1155] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [1161] ) ] spids: [1159] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:functionToken) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [1171] ) ] spids: [1169] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:argsToken) op: Equal rhs: {(DQ (${ VSub_Number 3))} spids: [1181] ) ] spids: [1179] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (value)} {(DQ (${ VSub_Name functionToken))} ) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:functionName) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1205] ) ] spids: [1203] ) (If arms: [ (if_arm cond: [ (Sentence child: (Pipeline children: [(C {(functionExists)} {($ VSub_Name "$functionName")})] negated: True ) terminator: ) ] action: [ (C {(stderr)} { (DQ ("The builtin function [") (${ VSub_Name functionName) ("] does not exist")) } ) (C {(exit)} {(1)}) ] spids: [-1 1222] ) ] spids: [-1 1241] ) (C {(eval)} {(DQ (${ VSub_Name functionName))} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name functionName))} {(DQ (${ VSub_Name argsToken))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {($ VSub_Name "$RESULT")} spids: [1271] ) ] spids: [1271] ) ] spids: [1119] ) spids: [1110 1118] ) (FuncDef name: "evaluator::call_lambda" body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {(${ VSub_Name EVALUATOR_DEBUG)} right: {(1)} ) ) terminator: ) ] action: [ (Sentence child: (C {(stderr)} {(DQ ("evaluator::call_lambda ") (${ VSub_At "@"))}) terminator: ) ] spids: [-1 1304] ) ] spids: [-1 1317] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [1323] ) ] spids: [1321] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:lambdaToken) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [1333] ) ] spids: [1331] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:argsToken) op: Equal rhs: {(DQ (${ VSub_Number 3))} spids: [1343] ) ] spids: [1341] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new) } ) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:passedArgs) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1364] ) ] spids: [1362] ) (While cond: [ (Sentence child: (Pipeline children: [ (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (isEmpty_c) } {(DQ (${ VSub_Name argsToken))} ) ] negated: True ) terminator: ) ] body: (DoGroup children: [ (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (first) } {(DQ (${ VSub_Name argsToken))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name RESULT))} ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (append) } {($ VSub_Name "$passedArgs")} {(DQ (${ VSub_Name RESULT))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (rest) } {(DQ (${ VSub_Name argsToken))} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:argsToken) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1460] ) ] spids: [1460] ) ] spids: [1392 1468] ) ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (Lambda) (Lit_Other ":") (Lit_Other ":") (call)} {($ VSub_Name "$lambdaToken")} {($ VSub_Name "$passedArgs")} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1485] ) ] spids: [1485] ) ] spids: [1286] ) spids: [1277 1285] ) (FuncDef name: "evaluator::call_builtinMacro" body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {(${ VSub_Name EVALUATOR_DEBUG)} right: {(1)} ) ) terminator: ) ] action: [ (Sentence child: (C {(stderr)} {(DQ ("evaluator::call_builtinMacro ") (${ VSub_At "@"))}) terminator: ) ] spids: [-1 1522] ) ] spids: [-1 1535] ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (set)} {(${ VSub_Name EVALUATOR_VARIABLE)} {(nil)} {(nil)} ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [1556] ) ] spids: [1554] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:identifier) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [1566] ) ] spids: [1564] ) (Assignment keyword: Assign_Declare flags: ["'-a'"] pairs: [ (assign_pair lhs: (LhsName name:values) op: Equal rhs: {(ArrayLiteralPart words:[{(${ VSub_Number 3)}])} spids: [1578] ) ] spids: [1574] ) (Case to_match: {(DQ (${ VSub_Name identifier))} arms: [ (case_arm pat_list: [{(DQ (if))}] action: [ (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {(${ VSub_Name EVALUATOR_DEBUG)} right: {(1)} ) ) terminator: ) ] action: [ (Sentence child: (C {(stderr)} {(DQ ("evaluator::call_identifier in 'if'"))}) terminator: ) ] spids: [-1 1619] ) ] spids: [-1 1629] ) (C {(stderr)} {(DQ ("[if] not implemented yet"))}) ] spids: [1599 1601 1639 -1] ) (case_arm pat_list: [{(Lit_Other "*")}] action: [ (C {(stderr)} { (DQ ("evaluator::call_identifier / Not implemented [") (${ VSub_Name identifier) ("]") ) } ) ] spids: [1642 1643 1657 -1] ) ] spids: [1587 1595 1660] ) ] spids: [1504] ) spids: [1495 1503] ) (FuncDef name: "evaluator::call_specialForm" body: (BraceGroup children: [ (If arms: [ (if_arm cond: [ (Sentence child: (DBracket expr: (BoolBinary op_id: BoolBinary_GlobDEqual left: {(${ VSub_Name EVALUATOR_DEBUG)} right: {(1)} ) ) terminator: ) ] action: [ (Sentence child: (C {(stderr)} { (DQ ("evaluator::call_specialForm(") (BracedVarSub token: prefix_op: VSub_Pound spids: [1698 1701] ) (") ") (${ VSub_At "@") ) } ) terminator: ) ] spids: [-1 1692] ) ] spids: [-1 1710] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [1716] ) ] spids: [1714] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:functionToken) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [1726] ) ] spids: [1724] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:argsToken) op: Equal rhs: {(DQ (${ VSub_Number 3))} spids: [1736] ) ] spids: [1734] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (value)} {(DQ (${ VSub_Name functionToken))} ) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:functionName) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1760] ) ] spids: [1758] ) (If arms: [ (if_arm cond: [ (Sentence child: (Pipeline children: [(C {(functionExists)} {($ VSub_Name "$functionName")})] negated: True ) terminator: ) ] action: [ (C {(stderr)} { (DQ ("The builtin function [") (${ VSub_Name functionName) ("] does not exist")) } ) (C {(exit)} {(1)}) ] spids: [-1 1777] ) ] spids: [-1 1796] ) (C {(eval)} {(DQ (${ VSub_Name functionName))} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name functionName))} {(DQ (${ VSub_Name argsToken))} ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:RESULT) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1826] ) ] spids: [1826] ) ] spids: [1674] ) spids: [1665 1673] ) (FuncDef name: "evaluator::setup_builtin" body: (BraceGroup children: [ (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [1851] ) ] spids: [1849] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:type) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [1861] ) ] spids: [1859] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:identifier) op: Equal rhs: {(DQ (${ VSub_Number 3))} spids: [1871] ) ] spids: [1869] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:functionName) op: Equal rhs: {(DQ (${ VSub_Number 4))} spids: [1881] ) ] spids: [1879] ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(DQ (${ VSub_Name type))} {(DQ (${ VSub_Name functionName))} ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:t1) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1910] ) ] spids: [1908] ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(String)} {(DQ (${ VSub_Name identifier))} ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:t2) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [1935] ) ] spids: [1933] ) (C {(environment) (Lit_Other ":") (Lit_Other ":") (setVariable)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name t2))} {(DQ (${ VSub_Name t1))} ) ] spids: [1846] ) spids: [1837 1845] ) (FuncDef name: "evaluator::setup_builtins" body: (BraceGroup children: [ (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [1984] ) ] spids: [1982] ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ ("+"))} {(DQ ("evaluator::functions::builtin::add"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ (-))} {(DQ ("evaluator::functions::builtin::subtract"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ ("*"))} {(DQ ("evaluator::functions::builtin::multiply"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ (/))} {(DQ ("evaluator::functions::builtin::divide"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ ("="))} {(DQ ("evaluator::functions::builtin::equals"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ ("<"))} {(DQ ("evaluator::functions::builtin::lessthan"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ (">"))} {(DQ ("evaluator::functions::builtin::greaterthan"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ ("<="))} {(DQ ("evaluator::functions::builtin::lessthanorequal"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(BuiltinFunction)} {(DQ (">="))} {(DQ ("evaluator::functions::builtin::greaterthanorequal"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(SpecialForm)} {(DQ (if))} {(DQ ("evaluator::specialforms::if"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(SpecialForm)} {(DQ (lambda))} {(DQ ("evaluator::specialforms::lambda"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(SpecialForm)} {(DQ (let))} {(DQ ("evaluator::specialforms::let"))} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtin)} {(DQ (${ VSub_Name env))} {(SpecialForm)} {(SQ <"let*">)} {(DQ ("evaluator::specialforms::letstar"))} ) (C {(environment) (Lit_Other ":") (Lit_Other ":") (pushScope)} {(DQ (${ VSub_Name env))}) ] spids: [1979] ) spids: [1970 1978] ) (If arms: [ (if_arm cond: [ (Sentence child: (C {(Lit_Other "[")} {($ VSub_Number "$0")} {(KW_Bang "!") (Lit_Other "=")} {($ VSub_Name "$BASH_SOURCE")} {(Lit_Other "]")} ) terminator: ) ] action: [(ControlFlow token:)] spids: [-1 2315] ) ] spids: [-1 2320] ) (FuncDef name: createTestEnv body: (BraceGroup children: [ (C {(environment) (Lit_Other ":") (Lit_Other ":") (new)}) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (setup_builtins)} {(DQ (${ VSub_Name RESULT))} ) ] spids: [2329] ) spids: [2323 2328] ) (FuncDef name: setInEnv body: (BraceGroup children: [ (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [2362] ) ] spids: [2360] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:name) op: Equal rhs: {(DQ (${ VSub_Number 2))} spids: [2372] ) ] spids: [2370] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:type) op: Equal rhs: {(DQ (${ VSub_Number 3))} spids: [2382] ) ] spids: [2380] ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:value) op: Equal rhs: {(DQ (${ VSub_Number 4))} spids: [2392] ) ] spids: [2390] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(Identifier)} {(DQ (${ VSub_Name name))} ) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:nameToken) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2417] ) ] spids: [2415] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(DQ (${ VSub_Name type))} {(DQ (${ VSub_Name value))} ) terminator: ) (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:valueToken) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2446] ) ] spids: [2444] ) (C {(environment) (Lit_Other ":") (Lit_Other ":") (setVariable)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name nameToken))} {(DQ (${ VSub_Name valueToken))} ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(Identifier)} {(DQ (${ VSub_Name name))} ) ] spids: [2357] ) spids: [2351 2356] ) (FuncDef name: appendToList body: (BraceGroup children: [ (Assignment keyword: Assign_Declare pairs: [ (assign_pair lhs: (LhsName name:listToken) op: Equal rhs: {(DQ (${ VSub_Number 1))} spids: [2505] ) ] spids: [2503] ) (Assignment keyword: Assign_Declare flags: ["'-a'"] pairs: [ (assign_pair lhs: (LhsName name:items) op: Equal rhs: { (ArrayLiteralPart words: [ { (DQ (BracedVarSub token: suffix_op: (Slice begin:(ArithWord w:{(Lit_Digits 2)})) spids: [2520 2524] ) ) } ] ) } spids: [2517] ) ] spids: [2513] ) (Assignment keyword: Assign_Declare flags: ["'-i'"] pairs: [(assign_pair lhs:(LhsName name:size) op:Equal spids:[2533])] spids: [2529] ) (Assignment keyword: Assign_Declare flags: ["'-i'"] pairs: [(assign_pair lhs:(LhsName name:max_index) op:Equal spids:[2540])] spids: [2536] ) (Assignment keyword: Assign_Declare pairs: [(assign_pair lhs:(LhsName name:currentType) op:Equal spids:[2545])] spids: [2543] ) (Assignment keyword: Assign_Declare pairs: [(assign_pair lhs:(LhsName name:currentValue) op:Equal spids:[2550])] spids: [2548] ) (DParen child: (ArithBinary op_id: Arith_Comma left: (BinaryAssign op_id: Arith_Equal left: (LhsName name:size) right: (ArithWord w: { (BracedVarSub token: prefix_op: VSub_Pound bracket_op: (WholeArray op_id:Lit_At) spids: [2559 2565] ) } ) ) right: (BinaryAssign op_id: Arith_Equal left: (LhsName name:max_index) right: (ArithBinary op_id: Arith_Minus left: (ArithVarRef name:size) right: (ArithWord w:{(Lit_Digits 1)}) ) ) ) ) (If arms: [ (if_arm cond: [ (Sentence child: (DParen child: (ArithBinary op_id: Arith_NEqual left: (ArithBinary op_id: Arith_Percent left: (ArithVarRef name:size) right: (ArithWord w:{(Lit_Digits 2)}) ) right: (ArithWord w:{(Lit_Digits 0)}) ) ) terminator: ) ] action: [ (C {(stderr)} {(DQ ("appendToList: number of items to add to list not even"))}) (C {(exit)} {(1)}) ] spids: [-1 2594] ) ] spids: [-1 2609] ) (ForExpr init: (BinaryAssign op_id: Arith_Equal left: (LhsName name:i) right: (ArithWord w:{(Lit_Digits 0)}) ) cond: (ArithBinary op_id: Arith_LessEqual left: (ArithVarRef name:i) right: (ArithVarRef name:max_index) ) update: (BinaryAssign op_id: Arith_Equal left: (LhsName name:i) right: (ArithBinary op_id: Arith_Plus left: (ArithVarRef name:i) right: (ArithWord w:{(Lit_Digits 2)}) ) ) body: (DoGroup children: [ (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:currentType) op: Equal rhs: { (DQ (BracedVarSub token: bracket_op: (ArrayIndex expr:(ArithWord w:{(${ VSub_Name i)})) spids: [2639 2646] ) ) } spids: [2637] ) ] spids: [2637] ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:currentValue) op: Equal rhs: { (DQ (BracedVarSub token: bracket_op: (ArrayIndex expr: (ArithBinary op_id: Arith_Plus left: (ArithVarRef name:i) right: (ArithWord w:{(Lit_Digits 1)}) ) ) spids: [2652 2663] ) ) } spids: [2650] ) ] spids: [2650] ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(DQ (${ VSub_Name currentType))} {(DQ (${ VSub_Name currentValue))} ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (append) } {(DQ (${ VSub_Name listToken))} {(DQ (${ VSub_Name RESULT))} ) ] spids: [2634 2706] ) ) ] spids: [2500] ) spids: [2494 2499] ) (Assignment keyword: Assign_Declare pairs: [(assign_pair lhs:(LhsName name:env) op:Equal spids:[2714])] spids: [2712] ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2724] ) ] spids: [2724] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(Boolean)} {(true)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:valueToken) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2742] ) ] spids: [2742] ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {($ VSub_Name "$valueToken")} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Boolean :: true"))} {(DQ (${ VSub_Name RESULT))} {(DQ (atom/boolean))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2810] ) ] spids: [2810] ) (Sentence child: (C {(setInEnv)} {(DQ (${ VSub_Name env))} {(v)} {(Integer)} {(4)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:token) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2833] ) ] spids: [2833] ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name token))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 4"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("identifier evaluation"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2901] ) ] spids: [2901] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2918] ) ] spids: [2918] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"+">)} {(Integer)} {(5)} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {($ VSub_Name "$vCode")} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 7"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(+ 5 2)"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [2998] ) ] spids: [2998] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3015] ) ] spids: [3015] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <->)} {(Integer)} {(5)} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {($ VSub_Name "$vCode")} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 3"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(- 5 2)"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3095] ) ] spids: [3095] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3112] ) ] spids: [3112] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"*">)} {(Integer)} {(5)} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {($ VSub_Name "$vCode")} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 10"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(* 5 2)"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3192] ) ] spids: [3192] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3209] ) ] spids: [3209] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ )} {(Integer)} {(6)} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {($ VSub_Name "$vCode")} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 3"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(/ 6 2)"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3289] ) ] spids: [3289] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3306] ) ] spids: [3306] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"=">)} {(Integer)} {(2)} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {($ VSub_Name "$vCode")} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Boolean :: true"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(= 2 2)"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3386] ) ] spids: [3386] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3403] ) ] spids: [3403] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"=">)} {(Integer)} {(2)} {(Integer)} {(3)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {($ VSub_Name "$vCode")} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Boolean :: false"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(= 2 3)"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3489] ) ] spids: [3489] ) (Sentence child: (C {(setInEnv)} {(DQ (${ VSub_Name env))} {(u)} {(Integer)} {(4)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:token) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3512] ) ] spids: [3512] ) (Sentence child: (C {(setInEnv)} {(DQ (${ VSub_Name env))} {(v)} {(Integer)} {(4)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:token) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3535] ) ] spids: [3535] ) (Sentence child: (C {(setInEnv)} {(DQ (${ VSub_Name env))} {(w)} {(Integer)} {(2)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:token) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [3558] ) ] spids: [3558] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [3578] ) ] spids: [3578] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"+">)} {(Identifier)} {(SQ )} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 6"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(+ 2)"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [3667] ) ] spids: [3667] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"+">)} {(Integer)} {(2)} {(Identifier)} {(SQ )} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 6"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(+ 2 )"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [3756] ) ] spids: [3756] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <->)} {(Identifier)} {(SQ )} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 2"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(- 2)"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [3845] ) ] spids: [3845] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <->)} {(Integer)} {(2)} {(Identifier)} {(SQ )} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: -2"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(- 2 )"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [3934] ) ] spids: [3934] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"*">)} {(Identifier)} {(SQ )} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 8"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(* 2)"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4023] ) ] spids: [4023] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"*">)} {(Integer)} {(2)} {(Identifier)} {(SQ )} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 8"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(* 2 )"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4112] ) ] spids: [4112] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ )} {(Identifier)} {(SQ )} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 2"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(/ 2)"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4201] ) ] spids: [4201] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ )} {(Integer)} {(12)} {(Identifier)} {(SQ )} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 3"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(/ 12 )"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4290] ) ] spids: [4290] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"=">)} {(Identifier)} {(SQ )} {(Integer)} {(2)} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Boolean :: false"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(= 2)"))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4379] ) ] spids: [4379] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"=">)} {(Integer)} {(4)} {(Identifier)} {(SQ )} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Boolean :: true"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(= 4 )"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:env) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4469] ) ] spids: [4469] ) (Sentence child: (C {(setInEnv)} {(DQ (${ VSub_Name env))} {(u)} {(Integer)} {(4)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:token) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4492] ) ] spids: [4492] ) (Sentence child: (C {(setInEnv)} {(DQ (${ VSub_Name env))} {(v)} {(Integer)} {(4)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:token) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4515] ) ] spids: [4515] ) (Sentence child: (C {(setInEnv)} {(DQ (${ VSub_Name env))} {(w)} {(Integer)} {(2)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:token) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4538] ) ] spids: [4538] ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:slistOne) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4555] ) ] spids: [4555] ) (C {(appendToList)} {($ VSub_Name "$slistOne")} {(Identifier)} {(Lit_Other "+")} {(Integer)} {(4)} {(Identifier)} {(v)} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:slistTwo) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4585] ) ] spids: [4585] ) (C {(appendToList)} {($ VSub_Name "$slistTwo")} {(Identifier)} {(-)} {(Integer)} {(4)} {(Identifier)} {(w)} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4615] ) ] spids: [4615] ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(SQ <"*">)}) (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (append)} {($ VSub_Name "$vCode")} {($ VSub_Name "$slistTwo")} ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (append)} {($ VSub_Name "$vCode")} {($ VSub_Name "$slistOne")} ) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 16"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("(* (+ 4 ) (- 4 ))"))} ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:lambdaEnv) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4719] ) ] spids: [4719] ) (C {(setInEnv)} {($ VSub_Name "$lambdaEnv")} {(DQ (y))} {(Integer)} {(10)}) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:lambdaArgs) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4748] ) ] spids: [4748] ) (C {(appendToList)} {($ VSub_Name "$lambdaArgs")} {(Identifier)} {(DQ (x))}) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:lambdaExpression) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4775] ) ] spids: [4775] ) (C {(appendToList)} {($ VSub_Name "$lambdaExpression")} {(Identifier)} {(SQ <"*">)} {(Identifier)} {(DQ (x))} {(Identifier)} {(DQ (y))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (new)} ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:lambdaCode) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4814] ) ] spids: [4814] ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (append)} {($ VSub_Name "$lambdaCode")} {($ VSub_Name "$lambdaExpression")} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (Lambda) (Lit_Other ":") (Lit_Other ":") (new)} { (DQ ($ VSub_Name "$lambdaEnv") (" ") ($ VSub_Name "$lambdaArgs") (" ") ($ VSub_Name "$lambdaCode") ) } ) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:lambda) op: Equal rhs: {(DQ (${ VSub_Name RESULT))} spids: [4851] ) ] spids: [4851] ) (Sentence child:(C {(createTestEnv)}) terminator:) (Assignment keyword: Assign_None pairs: [(assign_pair lhs:(LhsName name:env) op:Equal rhs:{(${ VSub_Name RESULT)} spids:[4863])] spids: [4863] ) (C {(setInEnv)} {(DQ (${ VSub_Name env))} {(DQ (a))} {(Integer)} {(5)}) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (new)} {(LinkedList)}) terminator: ) (Assignment keyword: Assign_None pairs: [ (assign_pair lhs: (LhsName name:vCode) op: Equal rhs: {(${ VSub_Name RESULT)} spids: [4894] ) ] spids: [4894] ) (C {(variable) (Lit_Other ":") (Lit_Other ":") (LinkedList) (Lit_Other ":") (Lit_Other ":") (append)} {($ VSub_Name "$vCode")} {($ VSub_Name "$lambda")} ) (C {(appendToList)} {($ VSub_Name "$vCode")} {(Identifier)} {(DQ (a))}) (C {(evaluator) (Lit_Other ":") (Lit_Other ":") (eval)} {(DQ (${ VSub_Name env))} {(DQ (${ VSub_Name vCode))} ) (Sentence child: (C {(variable) (Lit_Other ":") (Lit_Other ":") (debug)} {(DQ (${ VSub_Name RESULT))}) terminator: ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (equals)} {(DQ ("Integer :: 50"))} {(DQ (${ VSub_Name RESULT))} {(DQ ("env(a=5) ((lambda[env(y=10)] (x) (* y x)) a)"))} ) (C {(assert) (Lit_Other ":") (Lit_Other ":") (report)}) (If arms: [ (if_arm cond: [ (Sentence child: (AndOr children: [ (C {(Lit_Other "[")} { (BracedVarSub token: suffix_op: (StringUnary op_id:VTest_Plus arg_word:{(isset)}) spids: [4991 4995] ) } {(Lit_Other "]")} ) (C {(Lit_Other "[")} {(DQ ($ VSub_Number "$1"))} {(Lit_Other "=") (Lit_Other "=")} {(DQ (debug))} {(Lit_Other "]")} ) ] op_id: Op_DAmp ) terminator: ) ] action: [(C {(variable) (Lit_Other ":") (Lit_Other ":") (printMetadata)})] spids: [-1 5017] ) ] spids: [-1 5026] ) ] )