K3OVRFE3Y23DN47XNAISH6XM5JGSCNRR6TOEO5KAKBNB54MFO27AC
UNG2I2YG7NASZK7A2UYXTBYEM6RCMAU3BD4C57RUQKHNZQUTGIIAC
O6PFGAUDYCMK6SC6V5RB5ELXZ7W54OB7XPYCMECCA4BSBUVLFAPAC
UW27LKXM2BJ77FQLTY4WPKDSSWI2RFNFRJ7CB4U3TS7KYVIV72LQC
RXKXDAF3GEASFJBBXAMTGPMPTHL74ZOHVBKVZ2YQXAZKMHISRY7QC
A2JAXDJWT2FAKADYOY6QOQ7LQRMTTCDIOYT7STSESVHLZQEQJBMAC
KMV35KHLCXIV5YQUDRSTS6PIMLNIL2KTJZS77XXMPA6IX37NHZ2QC
6XHALMLUA5B5BBYFSWIFHSJ2BXCL6RSAW5TCKRGJEI2LURH2TQ4AC
GW4AAYNF7I66D72G5PMFTQRK7B4KZVYKAHKRPC2IY7IX37JKEHJQC
lisp_eval_should_be '(+ 1 2 3)' '6' 'multiarg +'
lisp_eval_should_be '(* 2 3 5)' '30' 'multiarg *'
lisp_eval_should_be '(/ 3 5)' '0.6' '/'
lisp_eval_should_be '(// 6 5)' '1' 'quotient'
lisp_eval_should_be '(% 6 5)' '1' 'modulo'
lisp_eval_should_be '(** 3 4)' '81' 'power'
lisp_eval_should_be '(atan2 0 -1)' '3.14159' 'atan2'
(setq only2- (lambda (a b) (only2- a b))) \
(setq - (lambda xs (reduce only2- xs))) \
(setq only2/ (lambda (a b) (only2/ a b))) \
(setq / (lambda xs (reduce only2/ xs))) \
(setq only2// (lambda (a b) (only2// a b))) \
(setq // (lambda xs (reduce only2// xs))) \
(setq only2% (lambda (a b) (only2% a b))) \
(setq % (lambda xs (reduce only2% xs))) \
(setq only2** (lambda (a b) (only2** a b))) \
(setq ** (lambda xs (reduce only2** xs))) \
(setq atan2 (lambda (a b) (atan2 a b))) \
(setq string-length (lambda (x) (string-length x))) \
function _only2_add(a, b, tv) {
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
return _number(a+b)
}
}
# if either a or b was not a number, we're here
logg_err("_only2_add", "non-numeric operand", d)
return _nil()
}
function _only2_multiply(a, b, tv) {
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
return _number(a*b)
}
}
# if either a or b was not a number, we're here
logg_err("_only2_multiply", "non-numeric operand", d)
return _nil()
}
function _only2_subtract(a, b, tv) {
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
return _number(a-b)
}
}
# if either a or b was not a number, we're here
logg_err("_only2_subtract", "non-numeric operand", d)
return _nil()
}
function _only2_divide(a, b, tv) {
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
if(b==0) {
logg_err("_only2_divide", "divide by zero", d)
return _nil()
}
return _number(a/b)
}
}
# if either a or b was not a number, we're here
logg_err("_only2_divide", "non-numeric operand", d)
return _nil()
}
function _only2_quotient(a, b, tv) {
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
if(b==0) {
logg_err("_only2_quotient", "quotient by zero", d)
return _nil()
}
return _number(int(a/b))
}
}
# if either a or b was not a number, we're here
logg_err("_only2_quotient", "non-numeric operand", d)
return _nil()
}
function _only2_modulo(a, b, tv) {
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
if(b==0) {
logg_err("_only2_modulo", "modulo by zero", d)
return _nil()
}
return _number(a%b)
}
}
# if either a or b was not a number, we're here
logg_err("_only2_modulo", "non-numeric operand", d)
return _nil()
}
function _only2_power(a, b, tv) {
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
return _number(a^b)
}
}
# if either a or b was not a number, we're here
logg_err("_only2_power", "non-numeric operand", d)
return _nil()
}
function _atan2(a, b, tv) {
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
return _number(atan2(a,b))
}
}
# if either a or b was not a number, we're here
logg_err("_atan2", "non-numeric operand", d)
return _nil()
}
} else if(car == _symbol("only2+")) {
a = _eval3(_cadr(form), env, env, d+1)
b = _eval3(_caddr(form), env, env, d+1)
logg_dbg("_eval3 only2+", "adding " a " and " b, d)
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
return _number(a+b)
}
}
# if either a or b was not a number, we're here
logg_err("_eval3 only2+", "non-numeric operand", d)
return _nil()
} else if(car == _symbol("only2*")) {
a = _eval3(_cadr(form), env, env, d+1)
b = _eval3(_caddr(form), env, env, d+1)
logg_dbg("_eval3 only2*", "multiplying " a " and " b, d)
split(a, tv)
if(tv[1] == "#") {
a = tv[2]
split(b, tv)
if(tv[1] == "#") {
b = tv[2]
return _number(a*b)
}
}
# if either a or b was not a number, we're here
logg_err("_eval3 only2*", "non-numeric operand", d)
return _nil()
} else if(car == _symbol("gc"))
} else if(car == _symbol("only2+"))
return _only2_add(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1))
else if(car == _symbol("only2*"))
return _only2_multiply(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1))
else if(car == _symbol("only2-"))
return _only2_subtract(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1))
else if(car == _symbol("only2/"))
return _only2_divide(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1))
else if(car == _symbol("only2//"))
return _only2_quotient( \
_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1))
else if(car == _symbol("only2%"))
return _only2_modulo(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1))
else if(car == _symbol("only2**"))
return _only2_power(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1))
else if(car == _symbol("atan2"))
return _atan2(_eval3(_cadr(form), env, env, d+1),
_eval3(_caddr(form), env, env, d+1))
else if(car == _symbol("gc"))