From fa99dd69902385f9efe93dff4c0cb9620bee95b8 Mon Sep 17 00:00:00 2001 From: Simon Brooke Date: Sat, 5 Jul 2025 09:52:03 +0100 Subject: [PATCH] Mainly, work on investigating the bignum arithmetic problem(s). --- src/io/read.c | 12 +++++++++- src/memory/consspaceobject.h | 24 +++++++++++++++++++ unit-tests/bignum-add.sh | 45 ++++++++++++++++++++++++++++++++++++ 3 files changed, 80 insertions(+), 1 deletion(-) diff --git a/src/io/read.c b/src/io/read.c index df0735b..87c568e 100644 --- a/src/io/read.c +++ b/src/io/read.c @@ -32,6 +32,16 @@ #include "arith/real.h" #include "memory/vectorspace.h" +// We can't, I think, use libreadline, because we read character by character, +// not line by line, and because we use wide characters. So we're going to have +// to reimplement it. So we're going to have to maintain history of the forms +// (or strings, but I currently think forms). So we're going to have to be able +// to detact special keys, particularly, at this stage, the uparrow and down- +// arrow keys +// #include +// #include + + /* * for the time being things which may be read are: * * strings @@ -325,7 +335,7 @@ struct cons_pointer read_number( struct stack_frame *frame, } break; case L',': - // silently ignore it. + // silently ignore commas. break; default: result = add_integers( multiply_integers( result, base ), diff --git a/src/memory/consspaceobject.h b/src/memory/consspaceobject.h index e4c0b95..32b0b78 100644 --- a/src/memory/consspaceobject.h +++ b/src/memory/consspaceobject.h @@ -121,6 +121,30 @@ */ #define LOOPTV 1347374924 +/** + * @brief Tag for a lazy cons cell. + * + * A lazy cons cell is like a cons cell, but lazy. + * + */ +#define LAZYCONSTAG "LZYC" + +/** + * @brief Tag for a lazy string cell. + * + * A lazy string cell is like a string cell, but lazy. + * + */ +#define LAZYSTRTAG "LZYS" + +/** + * @brief Tag for a lazy worker cell. + * + * A lazy + * + */ +#define LAZYWRKRTAG "WRKR" + /** * The special cons cell at address {0,0} whose car and cdr both point to * itself. diff --git a/unit-tests/bignum-add.sh b/unit-tests/bignum-add.sh index 7bbb41e..778015a 100755 --- a/unit-tests/bignum-add.sh +++ b/unit-tests/bignum-add.sh @@ -129,6 +129,51 @@ else fi +##################################################################### +# add two small bignums to produce a bigger bignum + +a=1152921504606846977 +c=`echo "$a + $a" | bc` +echo -n "adding $a to $a: " +expected='t' +output=`echo "(= (+ $a $b) $c)" | target/psse -v 2 2>psse.log` + +actual=`echo $output |\ + tail -1 |\ + sed 's/\,//g'` + +if [ "${expected}" = "${actual}" ] +then + echo "OK" +else + echo "Fail: expected '${expected}', got '${actual}'" + exit 1 +fi + +##################################################################### +# add five small bignums to produce a bigger bignum + +a=1152921504606846977 +c=`echo "$a * 5" | bc` +echo -n "adding $a, $a $a, $a, $a: " +expected='t' +output=`echo "(= (+ $a $a $a $a $a) $c)" | target/psse -v 2 2>psse.log` + +actual=`echo $output |\ + tail -1 |\ + sed 's/\,//g'` + +if [ "${expected}" = "${actual}" ] +then + echo "OK" +else + echo "Fail: expected '${expected}', got '${actual}'" + exit 1 +fi + + + + ##################################################################### # add two bignums to produce a bignum a=10000000000000000000