The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
print "1..27\n";

use Lisp::Interpreter qw(lisp_read_eval_print);
use Lisp::Subr::All;

$testno=1;
sub ok  { print "ok ", $testno++, "\n" }
sub bad { print "not " }
*run = \&lisp_read_eval_print; # save some typing

bad unless run("'33") eq "33";
ok;

bad unless run("(+ 1)") eq "1";
ok;

bad unless run("(+ 1 1)") eq "2";
ok;

bad unless run("(+ 1 2 3 4)") eq "10";
ok;

bad unless run("(+ 1 (+ 2 (+ 3 (+ 4))))") eq "10";
ok;

bad unless run("(1+ 1)") eq "2";
ok;

bad unless run("(- 1)") == -1;
ok;

bad unless run("(- -1)") == 1;
ok;

bad unless run("(- 10 5)") == 5;
ok;

bad unless run("(- 10 4 3 2 1)") == 0;
ok;

bad unless run("(1- 10)") == 9;
ok;

bad unless run("(* 3)") == 3;
ok;

bad unless run("(* 3 3)") == 9;
ok;

bad unless run("(* 3 3 3)") == 27;
ok;

bad unless run("(/ 9 3)") == 3;
ok;

bad unless run("(% 9 3)") == 0;
ok;

bad unless run("(max 1 2 3)") == 3;
ok;
bad unless run("(max 2 3 1)") == 3;
ok;
bad unless run("(max 3 1 2)") == 3;
ok;
bad unless run("(min -10 -90 100)") == -90;
ok;

bad unless run("(+ (* (max 3 4 1) (- 10 (1+ 9))) (+ 3 4))") == 7;
ok;

bad unless run("(list (floatp 33.33) (floatp t))") eq "(t nil)";
ok;
bad unless run("(list (integerp 42) (integerp 33.3))") eq "(t nil)";
ok;
bad unless run("(list (numberp 33.33) (numberp t))") eq "(t nil)";
ok;
bad unless run("(list (zerop 0) (zerop 33))") eq "(t nil)";
ok;

#
# Test some of the Perl functions
# 

bad unless abs(run("(cos (sin 10))") - cos(sin(10))) < 0.0000001;
ok;

$badrand=0;
$randsum=0;
for (1 .. 100) {
    my $r = run("(int (rand 10))");
    $randsum += $r;
    $badrand++ if $r < 0 || $r > 10;
}
$badrand++ if $randsum < 300 || $randsum > 700; # real bad luck if this happens
bad if $badrand;
ok;