laconic 2.0.0

Interpreter for Laconic expressions and scripts, both as a library component and command-line executable
Documentation
[c
   ---------- Routine average

   Returns the average of the stack items.
   Non-numeric values will be ignored.
]
R(
	#average
	$#count k,
	$#total 0
	W
		k,
		;
			$#next k
			?
				=1 tv#next
				+:#total v#next 
				-:#count 1
	?
		=0 v#count
		0
		/v#total v#count
)

[c ---------- Unit tests]

[c ---------- Helper routine;
   Put on stack before call:
	 1. test name
	 2. expected value
	 3. actual value.
]
R(
	#assert_eq
	$#actual k
	$#expected k
	$#testName k

	?
		=v#expected v#actual
		;
			w+([sSuccess: ] v#testName ¶)
			1
		;
			w+([sFailed: ] v#testName [s: Expected: ] v#expected [s - Actual: ] v#actual ¶)
			0
)

R(
	#average_utest_only_numbers
	Wk,k
	K(1 2 3 4)
	X(#assert_eq c#rtn 2.5 X#average)
)

R(
	#average_utest_only_zeroes
	Wk,k
	K(0 0 0 0 0)
	X(#assert_eq c#rtn 0 X#average)
)

R(
	#average_utest_mixed
	Wk,k
	K(1 2 #A 4)
	X(#assert_eq c#rtn /7 3 X#average)
)

R(
	#average_utest_no_numbers
	Wk,k
	K(#A #B)
	X(#assert_eq c#rtn 0 X#average)
)

R(
	#average_utest_empty_stack
	Wk,k
	X(#assert_eq c#rtn 0 X#average)
)

R(
	#average_utest_empty_value
	Wk,k
	Z#ign 1
	K(19 5 3 € ~3)
	Z#ign 0
	X(#assert_eq c#rtn 6 X#average)
)

R(
	#average_utest_error_value
	Wk,k
	Z#ign 1
	K(19 5 3 U[sError on purpose] ~3)
	Z#ign 0
	X(#assert_eq c#rtn 6 X#average)
)

[c Execute all unit tests]
R(
	#average_unit_tests
	$#nrTests 7
	$#succeeded 0
	+:#succeeded X#average_utest_only_numbers
	+:#succeeded X#average_utest_only_zeroes
	+:#succeeded X#average_utest_mixed
	+:#succeeded X#average_utest_no_numbers
	+:#succeeded X#average_utest_empty_stack
	+:#succeeded X#average_utest_empty_value
	+:#succeeded X#average_utest_error_value

	w+,([sSucceeded tests: ] v#succeeded ¶)
	w+,([sFailed tests: ] -v#nrTests v#succeeded ¶)
	#
)