#!/bin/bash # If this file has already been sourced, just return test $(EVALUATOR__FUNCTIONS_BUILTIN_SH+true)TODO && return declare -g EVALUATOR__FUNCTIONS_BUILTIN_SH = 'true' source ${BASH_SOURCE%/*}/common.sh source ${BASH_SOURCE%/*}/variables.sh source ${BASH_SOURCE%/*}/environment.sh proc evaluator::functions::builtin::add { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::add $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare result = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(env) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) sh-expr ' result += ${currentValue} ' variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Integer $(result) setglobal RESULT = $(RESULT) } proc evaluator::functions::builtin::subtract { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::subtract $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare result = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(envToken) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) sh-expr ' result -= "${currentValue}" ' variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Integer $(result) setglobal RESULT = $(RESULT) } proc evaluator::functions::builtin::multiply { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::multiply $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare result = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(envToken) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) sh-expr ' result *= "${currentValue}" ' variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Integer $(result) setglobal RESULT = $(RESULT) } proc evaluator::functions::builtin::divide { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::divide $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare result = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(envToken) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) sh-expr ' result /= "${currentValue}" ' variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Integer $(result) setglobal RESULT = $(RESULT) } proc evaluator::functions::builtin::equals { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::equals $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare first = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(envToken) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) if [[ $first -ne $currentValue ]] { variable::new Boolean false setglobal RESULT = $(RESULT) return } variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Boolean true setglobal RESULT = $(RESULT) return } proc evaluator::functions::builtin::greaterthan { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::equals $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare first = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(envToken) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) if [[ ! $first -gt $currentValue ]] { variable::new Boolean false setglobal RESULT = $(RESULT) return } variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Boolean true setglobal RESULT = $(RESULT) return } proc evaluator::functions::builtin::lessthan { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::equals $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare first = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(envToken) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) if [[ ! $first -lt $currentValue ]] { variable::new Boolean false setglobal RESULT = $(RESULT) return } variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Boolean true setglobal RESULT = $(RESULT) return } proc evaluator::functions::builtin::greaterthanorequal { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::equals $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare first = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(envToken) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) if [[ ! $first -ge $currentValue ]] { variable::new Boolean false setglobal RESULT = $(RESULT) return } variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Boolean true setglobal RESULT = $(RESULT) return } proc evaluator::functions::builtin::lessthanorequal { if [[ ${EVALUATOR_DEBUG} == 1 ]] { stderr "evaluator::functions::builtin::equals $(@)" ; }TODO declare env = $(1)TODO declare functionName = $(2)TODO declare argsToken = $(3) variable::LinkedList::length $(argsToken) if [[ $RESULT < 2 ]] { stderr "add not valid with less than 2 arguments" exit 1 } variable::LinkedList::first $(argsToken)TODO ; declare headToken = $(RESULT) evaluator::eval $(env) $(RESULT) variable::value $(RESULT)TODO ; declare first = $(RESULT) variable::LinkedList::rest $(argsToken)TODO ; declare rest = $(RESULT)TODO declare currentToken = ''TODO declare currentValue = '' while ! variable::LinkedList::isEmpty_c $(rest) { variable::LinkedList::first $(rest) evaluator::eval $(envToken) $(RESULT) setglobal currentToken = $(RESULT) if ! variable::type::instanceOf $(currentToken) Integer { variable::type $(currentToken) stderr "Cannot add type [$(RESULT)]" exit 1 } variable::value $(currentToken) ; setglobal currentValue = $(RESULT) if [[ ! $first -le $currentValue ]] { variable::new Boolean false setglobal RESULT = $(RESULT) return } variable::LinkedList::rest $(rest); setglobal rest = $(RESULT) } variable::new Boolean true setglobal RESULT = $(RESULT) return }