summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIOhannes m zmölnig <zmoelnig@umlautT.umlaeute.mur.at>2024-03-18 14:29:52 +0100
committerIOhannes m zmölnig <zmoelnig@umlautT.umlaeute.mur.at>2024-03-18 14:29:52 +0100
commit0b463bd347a2f0bf5a6980a03b4070d48a62860d (patch)
treefe1683c3adeff7eedf4885ae82c1994eae9c0796
parent780055c393aadacd178cee2222ed9cb06e79f7d7 (diff)
New upstream version 24.2
-rw-r--r--HISTORY.Snd2
-rw-r--r--NEWS9
-rw-r--r--case.scm4
-rwxr-xr-xconfigure20
-rw-r--r--configure.ac4
-rw-r--r--s7.c1673
-rw-r--r--s7.h2
-rw-r--r--s7test.scm1493
-rw-r--r--snd.h6
-rw-r--r--stuff.scm8
-rw-r--r--tools/auto-tester.scm160
-rw-r--r--tools/compare-calls.scm2
-rw-r--r--tools/t101.scm17
-rwxr-xr-xtools/tests78
-rw-r--r--tools/timp.scm272
-rw-r--r--tools/tlet.scm18
-rw-r--r--tools/tmap-hash.scm542
-rw-r--r--tools/tmisc.scm70
-rw-r--r--tools/tmv.scm307
-rw-r--r--tools/tread.scm200
-rw-r--r--tools/valcall.scm14
-rw-r--r--write.scm2
-rw-r--r--xm-enved.scm24
23 files changed, 2747 insertions, 2110 deletions
diff --git a/HISTORY.Snd b/HISTORY.Snd
index 308a3b3..7f8dd75 100644
--- a/HISTORY.Snd
+++ b/HISTORY.Snd
@@ -1,6 +1,6 @@
Snd change log
-
+ 12-Mar: Snd 24.2.
2-Feb: Snd 24.1.
1-Jan-24: Snd 24.0.
diff --git a/NEWS b/NEWS
index 406d422..0767ca6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,8 +1,7 @@
-Snd 24.1
+Snd 24.2
-More optimizations, minor bug fixes, and rewrites.
+mostly work on optimizations in s7
-checked: sbcl 2.4.1
-
-Thanks!: Norman Gray, Andreas Enge
+checked: sbcl 2.4.2
+Thanks!: James Hearon
diff --git a/case.scm b/case.scm
index 14702b5..7ca9fe8 100644
--- a/case.scm
+++ b/case.scm
@@ -365,7 +365,7 @@
(case* x
((a b) 'a-or-b)
((1 2/3 3.0) => (lambda (a) (* a 2)))
- ((#_pi) 1 123)
+ ((pi) 1 123)
(("string1" "string2"))
((#<symbol?>) 'symbol!)
(((+ x #<symbol?>)) 'got-list)
@@ -382,7 +382,7 @@
(else 'oops)))
(test (scase 3.0) 6.0)
-(test (scase pi) 123)
+(test (scase 'pi) 123)
(test (scase "string1") "string1")
(test (scase "string3") 'oops)
(test (scase 'a) 'a-or-b)
diff --git a/configure b/configure
index e4b917e..35247ad 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.71 for snd 24.1.
+# Generated by GNU Autoconf 2.71 for snd 24.2.
#
# Report bugs to <bil@ccrma.stanford.edu>.
#
@@ -611,8 +611,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='snd'
PACKAGE_TARNAME='ftp://ccrma-ftp.stanford.edu/pub/Lisp/snd-24.tar.gz'
-PACKAGE_VERSION='24.1'
-PACKAGE_STRING='snd 24.1'
+PACKAGE_VERSION='24.2'
+PACKAGE_STRING='snd 24.2'
PACKAGE_BUGREPORT='bil@ccrma.stanford.edu'
PACKAGE_URL=''
@@ -1346,7 +1346,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures snd 24.1 to adapt to many kinds of systems.
+\`configure' configures snd 24.2 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1417,7 +1417,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of snd 24.1:";;
+ short | recursive ) echo "Configuration of snd 24.2:";;
esac
cat <<\_ACEOF
@@ -1537,7 +1537,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-snd configure 24.1
+snd configure 24.2
generated by GNU Autoconf 2.71
Copyright (C) 2021 Free Software Foundation, Inc.
@@ -2025,7 +2025,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by snd $as_me 24.1, which was
+It was created by snd $as_me 24.2, which was
generated by GNU Autoconf 2.71. Invocation command line was
$ $0$ac_configure_args_raw
@@ -3967,7 +3967,7 @@ LOCAL_LANGUAGE="None"
GRAPHICS_TOOLKIT="None"
PACKAGE=Snd
-VERSION=24.1
+VERSION=24.2
#--------------------------------------------------------------------------------
# configuration options
@@ -7432,7 +7432,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by snd $as_me 24.1, which was
+This file was extended by snd $as_me 24.2, which was
generated by GNU Autoconf 2.71. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -7496,7 +7496,7 @@ ac_cs_config_escaped=`printf "%s\n" "$ac_cs_config" | sed "s/^ //; s/'/'\\\\\\\\
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config='$ac_cs_config_escaped'
ac_cs_version="\\
-snd config.status 24.1
+snd config.status 24.2
configured by $0, generated by GNU Autoconf 2.71,
with options \\"\$ac_cs_config\\"
diff --git a/configure.ac b/configure.ac
index 65bd983..8b7dbb6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -5,7 +5,7 @@
# gmp, mpfr, and mpc deliberately have none!
-AC_INIT(snd, 24.1, bil@ccrma.stanford.edu, ftp://ccrma-ftp.stanford.edu/pub/Lisp/snd-24.tar.gz)
+AC_INIT(snd, 24.2, bil@ccrma.stanford.edu, ftp://ccrma-ftp.stanford.edu/pub/Lisp/snd-24.tar.gz)
AC_CONFIG_SRCDIR(snd.c)
AC_CANONICAL_HOST # needed by case $host below
@@ -24,7 +24,7 @@ LOCAL_LANGUAGE="None"
GRAPHICS_TOOLKIT="None"
PACKAGE=Snd
-VERSION=24.1
+VERSION=24.2
#--------------------------------------------------------------------------------
# configuration options
diff --git a/s7.c b/s7.c
index ccc54e5..08d48e5 100644
--- a/s7.c
+++ b/s7.c
@@ -396,11 +396,9 @@
#include <complex>
#else
#include <complex.h>
- #ifndef __SUNPRO_C
- #if defined(__sun) && defined(__SVR4)
- #undef _Complex_I
- #define _Complex_I 1.0i
- #endif
+ #if defined(__sun) && defined(__SVR4)
+ #undef _Complex_I
+ #define _Complex_I 1.0i
#endif
#endif
@@ -1199,7 +1197,7 @@ struct s7_scheme {
s7_int read_line_buf_size;
s7_pointer w, x, y, z;
- s7_pointer temp1, temp2, temp3, temp4, temp5, temp7, temp8, temp9, temp10;
+ s7_pointer temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10;
s7_pointer t1_1, t2_1, t2_2, t3_1, t3_2, t3_3, t4_1, u1_1;
s7_pointer elist_1, elist_2, elist_3, elist_4, elist_5, elist_6, elist_7;
s7_pointer plist_1, plist_2, plist_2_2, plist_3, plist_4;
@@ -1378,7 +1376,7 @@ struct s7_scheme {
list_0, list_1, list_2, list_3, list_4, list_set_i, hash_table_ref_2, hash_table_2, list_ref_at_0, list_ref_at_1, list_ref_at_2,
format_f, format_no_column, format_just_control_string, format_as_objstr, values_uncopied, int_log2,
memq_2, memq_3, memq_4, memq_any, tree_set_memq_syms, simple_inlet, sublet_curlet, profile_out, simple_list_values,
- lint_let_ref, lint_let_set, geq_2, add_i_random, is_defined_in_rootlet;
+ simple_let_ref, simple_let_set, geq_2, add_i_random, is_defined_in_rootlet;
s7_pointer multiply_2, invert_1, invert_x, divide_2, divide_by_2, max_2, min_2, max_3, min_3,
num_eq_2, num_eq_xi, num_eq_ix, less_xi, less_xf, less_x0, less_2, greater_xi, greater_xf, greater_2,
@@ -1405,6 +1403,9 @@ struct s7_scheme {
#define NUM_SAFE_LISTS 32 /* 36 is the biggest normally (lint.scm), 49 in s7test, 57 in snd-test, > 16 doesn't happen much */
s7_pointer safe_lists[NUM_SAFE_LISTS];
int32_t current_safe_list;
+#if S7_DEBUGGING
+ s7_int safe_list_uses[NUM_SAFE_LISTS];
+#endif
s7_pointer autoload_table, s7_starlet, s7_starlet_symbol, let_temp_hook;
const char ***autoload_names;
@@ -1922,7 +1923,7 @@ static void init_types(void)
#define TYPE_MASK 0xff
#if S7_DEBUGGING
- static void print_gc_info(s7_scheme *sc, s7_pointer obj, int32_t line);
+ static void print_gc_info(s7_scheme *sc, s7_pointer obj, const char *func, int32_t line);
static s7_pointer check_ref_one(s7_pointer p, uint8_t expected_type, const char *func, int32_t line, const char *func1, const char *func2);
static s7_pointer check_ref_num(s7_pointer p, const char *func, int32_t line);
static s7_pointer check_ref_app(s7_pointer p, const char *func, int32_t line);
@@ -1935,7 +1936,7 @@ static void init_types(void)
static s7_pointer check_let_ref(s7_pointer p, uint64_t role, const char *func, int32_t line);
#define unchecked_type(p) ((p)->tf.type_field)
#if WITH_GCC
- #define type(p) ({uint8_t _t_; _t_ = (p)->tf.type_field; if ((!cur_sc->printing_gc_info) && ((_t_ == T_FREE) || (_t_ >= NUM_TYPES))) print_gc_info(cur_sc, p, __LINE__); _t_;})
+ #define type(p) ({uint8_t _t_; _t_ = (p)->tf.type_field; if ((!cur_sc->printing_gc_info) && ((_t_ == T_FREE) || (_t_ >= NUM_TYPES))) print_gc_info(cur_sc, p, __func__, __LINE__); _t_;})
#else
#define type(p) (p)->tf.type_field
#endif
@@ -2099,6 +2100,7 @@ static void init_types(void)
#define is_simple_sequence(P) (t_sequence_p[type(P)])
#define is_sequence(P) ((t_sequence_p[type(P)]) || (has_methods(P)))
#define is_mutable_sequence(P) (((t_sequence_p[type(P)]) || (has_methods(P))) && (!is_immutable(P)))
+#define is_sequence_or_iterator(P) ((t_sequence_p[type(P)]) || (is_iterator(P)))
#define is_mappable(P) (t_mappable_p[type(P)])
#define is_applicable(P) (t_applicable_p[type(P)])
/* this misses #() which is not applicable to anything, and "", and inapplicable c-objects like random-state */
@@ -2187,7 +2189,7 @@ static void init_types(void)
#define T_MULTIPLE_VALUE (1 << (8 + 7))
#define is_multiple_value(p) has_low_type_bit(T_Exs(p), T_MULTIPLE_VALUE) /* not T_Ext -- can be a slot */
#if S7_DEBUGGING
-#define set_multiple_value(p) do {if (!in_heap(p)) {fprintf(stderr, "%s[%d]: mv\n", __func__, __LINE__); abort();} set_low_type_bit(T_Pair(p), T_MULTIPLE_VALUE);} while (0)
+#define set_multiple_value(p) do {if (!in_heap(p)) {fprintf(stderr, "%s[%d] (from set_multiple_value): arg not in heap\n", __func__, __LINE__); abort();} set_low_type_bit(T_Pair(p), T_MULTIPLE_VALUE);} while (0)
#else
#define set_multiple_value(p) set_low_type_bit(T_Pair(p), T_MULTIPLE_VALUE)
#endif
@@ -2379,9 +2381,9 @@ static void init_types(void)
#define T_MUTABLE (1 << (16 + 10))
#define T_MID_MUTABLE (1 << 10)
-#define is_mutable_number(p) has_mid_type_bit(T_Num(p), T_MID_MUTABLE)
+#define is_mutable_number(p) has_mid_type_bit(p, T_MID_MUTABLE)
#define is_mutable_integer(p) has_mid_type_bit(T_Int(p), T_MID_MUTABLE)
-#define clear_mutable_number(p) clear_mid_type_bit(T_Num(p), T_MID_MUTABLE)
+#define clear_mutable_number(p) clear_mid_type_bit(p, T_MID_MUTABLE)
#define clear_mutable_integer(p) clear_mid_type_bit(T_Int(p), T_MID_MUTABLE)
/* used for mutable numbers, can occur with T_IMMUTABLE (outside view vs inside) */
@@ -2568,6 +2570,10 @@ static void init_types(void)
#define is_unlet(p) has_high_type_bit(T_Let(p), T_UNLET)
#define set_is_unlet(p) set_high_type_bit(T_Let(p), T_UNLET)
+#define T_SYMBOL_TABLE T_SYMCONS
+#define is_symbol_table(p) has_high_type_bit(T_Nvc(p), T_SYMBOL_TABLE)
+#define set_is_symbol_table(p) set_high_type_bit(T_Nvc(p), T_SYMBOL_TABLE)
+
#define T_FULL_HAS_LET_FILE (1LL << (48 + 1))
#define T_HAS_LET_FILE (1 << 1)
#define has_let_file(p) has_high_type_bit(T_Let(p), T_HAS_LET_FILE)
@@ -2986,11 +2992,9 @@ static void init_types(void)
#if WITH_GCC
#define fx_call(Sc, F) ({s7_pointer _P_; _P_ = F; fx_proc(_P_)(Sc, car(_P_));})
-#define fc_call(Sc, F) ({s7_pointer _P_; _P_ = F; fn_proc(_P_)(Sc, cdr(_P_));})
#define fn_call(Sc, F) ({s7_pointer _P_; _P_ = F; fn_proc(_P_)(Sc, cdr(_P_));})
#else
#define fx_call(Sc, F) fx_proc(F)(Sc, car(F))
-#define fc_call(Sc, F) fn_proc(F)(Sc, cdr(F))
#define fn_call(Sc, F) fn_proc(F)(Sc, cdr(F))
#endif
/* fx_call can affect the stack and sc->value */
@@ -3334,6 +3338,7 @@ static s7_pointer slot_expression(s7_pointer p) \
#define is_hash_table(p) (type(p) == T_HASH_TABLE)
#define is_mutable_hash_table(p) ((full_type(T_Ext(p)) & (TYPE_MASK | T_IMMUTABLE)) == T_HASH_TABLE)
#define hash_table_mask(p) (T_Hsh(p))->object.hasher.mask
+#define hash_table_size(p) ((T_Hsh(p))->object.hasher.mask + 1)
#define hash_table_block(p) (T_Hsh(p))->object.hasher.block
#define unchecked_hash_table_block(p) p->object.hasher.block
#define hash_table_set_block(p, b) (T_Hsh(p))->object.hasher.block = b
@@ -3343,11 +3348,11 @@ static s7_pointer slot_expression(s7_pointer p) \
#define hash_table_checker(p) (T_Hsh(p))->object.hasher.hash_func
#define hash_table_mapper(p) (T_Hsh(p))->object.hasher.loc
#define hash_table_procedures(p) T_Lst(hash_table_block(p)->ex.ex_ptr)
-#define hash_table_set_procedures(p, Lst) hash_table_block(p)->ex.ex_ptr = T_Lst(Lst) /* both the checker/mapper: car/cdr, and the two typers (opt/opt2) */
-#define hash_table_procedures_checker(p) car(hash_table_procedures(p))
-#define hash_table_procedures_mapper(p) cdr(hash_table_procedures(p))
-#define hash_table_set_procedures_checker(p, f) set_car(hash_table_procedures(p), f)
-#define hash_table_set_procedures_mapper(p, f) set_cdr(hash_table_procedures(p), f)
+#define hash_table_set_procedures(p, Lst) hash_table_block(p)->ex.ex_ptr = T_Lst(Lst) /* both the checker/mapper: car/cdr, and the two typers (opt1/opt2) */
+#define hash_table_procedures_checker(p) T_Prc(car(hash_table_procedures(p)))
+#define hash_table_procedures_mapper(p) T_Prc(cdr(hash_table_procedures(p)))
+#define hash_table_set_procedures_checker(p, f) set_car(hash_table_procedures(p), T_Prc(f))
+#define hash_table_set_procedures_mapper(p, f) set_cdr(hash_table_procedures(p), T_Prc(f))
#define hash_table_key_typer(p) T_Prc(opt1_any(hash_table_procedures(p)))
#define hash_table_key_typer_unchecked(p) hash_table_block(p)->ex.ex_ptr->object.cons.opt1
#define hash_table_set_key_typer(p, Fnc) set_opt1_any(hash_table_procedures(T_Hsh(p)), T_Prc(Fnc))
@@ -3433,7 +3438,7 @@ static s7_pointer slot_expression(s7_pointer p) \
#define port_read_sharp(p) port_port(p)->pf->read_sharp
#define port_close(p) port_port(p)->pf->close_port
-#define is_c_function(f) (type(f) >= T_C_FUNCTION)
+#define is_c_function(f) (type(f) >= T_C_FUNCTION) /* does not include T_C_FUNCTION_STAR */
#define is_c_function_star(f) (type(f) == T_C_FUNCTION_STAR)
#define is_any_c_function(f) (type(f) >= T_C_FUNCTION_STAR)
#define is_safe_c_function(f) ((is_c_function(f)) && (is_safe_procedure(f)))
@@ -3602,7 +3607,7 @@ static s7_pointer slot_expression(s7_pointer p) \
#define counter_set_slots(p, Val) (T_Ctr(p))->object.ctr.slots = T_Sln(Val)
#if S7_DEBUGGING
-#define init_temp(p, Val) do {if (p != sc->unused) fprintf(stderr, "%s[%d]: temp %s\n", __func__, __LINE__, display(p)); p = T_Ext(Val);} while (0)
+#define init_temp(p, Val) do {if (p != sc->unused) fprintf(stderr, "%s[%d]: init_temp %s\n", __func__, __LINE__, display(p)); p = T_Ext(Val);} while (0)
#else
#define init_temp(p, Val) p = Val
#endif
@@ -4250,7 +4255,7 @@ enum {OP_UNOPT, OP_GC_PROTECT, /* must be an even number of ops here, op_gc_prot
OP_SAFE_CLOSURE_STAR_NA_1, HOP_SAFE_CLOSURE_STAR_NA_1, OP_SAFE_CLOSURE_STAR_NA_2, HOP_SAFE_CLOSURE_STAR_NA_2,
OP_C_SS, HOP_C_SS, OP_C_S, HOP_C_S, OP_READ_S, HOP_READ_S, OP_C_P, HOP_C_P, OP_C_AP, HOP_C_AP,
- OP_C_A, HOP_C_A, OP_C_AA, HOP_C_AA, OP_C, HOP_C, OP_C_NA, HOP_C_NA,
+ OP_C_A, HOP_C_A, OP_C_AA, HOP_C_AA, OP_C, HOP_C, OP_C_NC, HOP_C_NC, OP_C_NA, HOP_C_NA,
OP_CL_S, HOP_CL_S, OP_CL_SS, HOP_CL_SS, OP_CL_A, HOP_CL_A, OP_CL_AA, HOP_CL_AA,
OP_CL_NA, HOP_CL_NA, OP_CL_FA, HOP_CL_FA, OP_CL_SAS, HOP_CL_SAS,
@@ -4356,18 +4361,16 @@ enum {OP_UNOPT, OP_GC_PROTECT, /* must be an even number of ops here, op_gc_prot
OP_DO_NO_VARS, OP_DO_NO_VARS_NO_OPT, OP_DO_NO_VARS_NO_OPT_1,
OP_DO_NO_BODY_NA_VARS, OP_DO_NO_BODY_NA_VARS_STEP, OP_DO_NO_BODY_NA_VARS_STEP_1,
- OP_SAFE_C_P_1, OP_SAFE_C_PP_1, OP_SAFE_C_PP_3_MV, OP_SAFE_C_PP_5, OP_SAFE_C_PP_6_MV,
+ OP_SAFE_C_P_1, OP_SAFE_C_PP_1, OP_SAFE_C_PP_3_MV, OP_SAFE_C_PP_5,
OP_SAFE_C_3P_1, OP_SAFE_C_3P_2, OP_SAFE_C_3P_3, OP_SAFE_C_3P_1_MV, OP_SAFE_C_3P_2_MV, OP_SAFE_C_3P_3_MV,
- OP_SAFE_C_SP_1, OP_SAFE_C_SP_MV, OP_SAFE_CONS_SP_1, OP_SAFE_ADD_SP_1, OP_SAFE_MULTIPLY_SP_1,
- OP_SAFE_C_PS_1, OP_SAFE_C_PC_1, OP_SAFE_C_PS_MV, OP_SAFE_C_PC_MV,
+ OP_SAFE_C_SP_1, OP_SAFE_CONS_SP_1, OP_SAFE_ADD_SP_1, OP_SAFE_MULTIPLY_SP_1, OP_SAFE_C_PS_1, OP_SAFE_C_PC_1,
OP_EVAL_MACRO_MV, OP_MACROEXPAND_1, OP_APPLY_LAMBDA,
- OP_ANY_C_NP_1, OP_ANY_C_NP_MV, OP_SAFE_C_SSP_1, OP_SAFE_C_SSP_MV,
- OP_C_P_1, OP_C_P_MV, OP_C_AP_1, OP_C_AP_MV, OP_ANY_C_NP_2, OP_SAFE_C_PA_1, OP_SAFE_C_PA_MV,
+ OP_ANY_C_NP_1, OP_ANY_C_NP_MV, OP_SAFE_C_SSP_1, OP_C_P_1, OP_C_AP_1, OP_ANY_C_NP_2, OP_SAFE_C_PA_1,
OP_SET_WITH_LET_1, OP_SET_WITH_LET_2,
OP_CLOSURE_AP_1, OP_CLOSURE_PA_1, OP_CLOSURE_PP_1, OP_CLOSURE_P_1,
OP_SAFE_CLOSURE_P_1, OP_SAFE_CLOSURE_P_A_1, OP_SAFE_CLOSURE_AP_1, OP_SAFE_CLOSURE_PA_1, OP_SAFE_CLOSURE_PP_1,
- OP_ANY_CLOSURE_3P_1, OP_ANY_CLOSURE_3P_2, OP_ANY_CLOSURE_3P_3, OP_ANY_CLOSURE_NP_1, OP_ANY_CLOSURE_NP_MV,
+ OP_ANY_CLOSURE_3P_1, OP_ANY_CLOSURE_3P_2, OP_ANY_CLOSURE_3P_3, OP_ANY_CLOSURE_NP_1,
OP_ANY_CLOSURE_4P_1, OP_ANY_CLOSURE_4P_2, OP_ANY_CLOSURE_4P_3, OP_ANY_CLOSURE_4P_4, OP_ANY_CLOSURE_NP_2,
OP_TC_AND_A_OR_A_LA, OP_TC_OR_A_AND_A_LA, OP_TC_AND_A_OR_A_LAA, OP_TC_OR_A_AND_A_LAA, OP_TC_AND_A_OR_A_L3A, OP_TC_OR_A_AND_A_L3A,
@@ -4470,7 +4473,7 @@ static const char* op_names[NUM_OPS] =
"safe_closure*_na_1", "h_safe_closure*_na_1", "safe_closure*_na_2", "h_safe_closure*_na_2",
"c_ss", "h_c_ss", "c_s", "h_c_s", "read_s", "h_read_s", "c_p", "h_c_p", "c_ap", "h_c_ap",
- "c_a", "h_c_a", "c_aa", "h_c_aa", "c", "h_c", "c_na", "h_c_na",
+ "c_a", "h_c_a", "c_aa", "h_c_aa", "c", "h_c", "c_nc", "h_c_nc", "c_na", "h_c_na",
"cl_s", "h_cl_s", "cl_ss", "h_cl_ss", "cl_a", "h_cl_a", "cl_aa", "h_cl_aa",
"cl_na", "h_cl_na", "cl_fa", "h_cl_fa", "cl_sas", "h_cl_sas",
@@ -4572,18 +4575,16 @@ static const char* op_names[NUM_OPS] =
"do_no_vars", "do_no_vars_no_opt", "do_no_vars_no_opt_1",
"do_no_body_na_vars", "do_no_body_na_vars_step", "do_no_body_na_vars_step_1",
- "safe_c_p_1", "safe_c_pp_1", "safe_c_pp_3_mv", "safe_c_pp_5", "safe_c_pp_6_mv",
+ "safe_c_p_1", "safe_c_pp_1", "safe_c_pp_3_mv", "safe_c_pp_5",
"safe_c_3p_1", "safe_c_3p_2", "safe_c_3p_3", "safe_c_3p_1_mv", "safe_c_3p_2_mv", "safe_c_3p_3_mv",
- "safe_c_sp_1", "safe_c_sp_mv", "safe_cons_sp_1", "safe_add_sp_1", "safe_multiply_sp_1",
- "safe_c_ps_1", "safe_c_pc_1", "safe_c_ps_mv", "safe_c_pc_mv",
+ "safe_c_sp_1", "safe_cons_sp_1", "safe_add_sp_1", "safe_multiply_sp_1", "safe_c_ps_1", "safe_c_pc_1",
"eval_macro_mv", "macroexpand_1", "apply_lambda",
- "any_c_np_1", "any_c_np_mv", "safe_c_ssp_1", "safe_c_ssp_mv",
- "c_p_1", "c_p_mv", "c_ap_1", "c_ap_mv", "any_c_np_2", "safe_c_pa_1", "safe_c_pa_mv",
+ "any_c_np_1", "any_c_np_mv", "safe_c_ssp_1", "c_p_1", "c_ap_1", "any_c_np_2", "safe_c_pa_1",
"set_with_let_1", "set_with_let_2",
"closure_ap_1", "closure_pa_1", "closure_pp_1", "closure_p_1",
"safe_closure_p_1", "safe_closure_p_a_1", "safe_closure_ap_1", "safe_closure_pa_1", "safe_closure_pp_1",
- "any_closure_3p_1", "any_closure_3p_2", "any_closure_3p_3", "any_closure_np_1", "any_closure_np_mv",
+ "any_closure_3p_1", "any_closure_3p_2", "any_closure_3p_3", "any_closure_np_1",
"any_closure_4p_1", "any_closure_4p_2", "any_closure_4p_3", "any_closure_4p_4", "any_closure_np_2",
"tc_and_a_or_a_la", "tc_or_a_and_a_la", "tc_and_a_or_a_laa", "tc_or_a_and_a_laa", "tc_and_a_or_a_l3a", "tc_or_a_and_a_l3a",
@@ -4876,7 +4877,8 @@ static char *describe_type_bits(s7_scheme *sc, s7_pointer obj)
((is_hash_table(obj)) ? " has-value-type" :
((is_pair(obj)) ? " int-optable" :
((is_let(obj)) ? " unlet" :
- " ?24?"))))) : "",
+ ((is_t_vector(obj)) ? " symbol-table" :
+ " ?24?")))))) : "",
/* bit 25+24 */
((full_typ & T_FULL_HAS_LET_FILE) != 0) ? ((is_let(obj)) ? " has-let-file" :
((is_t_vector(obj)) ? " typed-vector" :
@@ -5010,7 +5012,7 @@ static bool has_odd_bits(s7_pointer obj)
(!is_any_macro(obj)) && (!is_any_closure(obj)) && (!is_c_function(obj)) && (!is_syntax(obj)))
return(true);
if (((full_typ & T_FULL_SYMCONS) != 0) &&
- (!is_symbol(obj)) && (!is_any_procedure(obj)) && (!is_hash_table(obj)) && (!is_pair(obj)) && (!is_let(obj)))
+ (!is_symbol(obj)) && (!is_any_procedure(obj)) && (!is_hash_table(obj)) && (!is_pair(obj)) && (!is_let(obj)) && (!is_t_vector(obj)))
return(true);
if (((full_typ & T_FULL_BINDER) != 0) &&
(!is_pair(obj)) && (!is_hash_table(obj)) && (!is_normal_symbol(obj)) && (!is_c_function(obj)) && (!is_syntax(obj)))
@@ -5202,7 +5204,7 @@ static s7_pointer check_ref_one(s7_pointer p, uint8_t expected_type, const char
static void check_let_set_slots(s7_pointer p, s7_pointer slot, const char *func, int32_t line)
{
if ((!in_heap(p)) && (slot) && (in_heap(slot))) fprintf(stderr, "%s[%d]: let+slot mismatch\n", func, line);
- if ((p == cur_sc->rootlet) && (slot != slot_end))
+ if ((p == cur_sc->rootlet) && (slot != slot_end))
{
fprintf(stderr, "%s[%d]: setting rootlet slots!\n", func, line);
if (cur_sc->stop_at_error) abort();
@@ -5362,13 +5364,13 @@ static s7_pointer check_ref_prc(s7_pointer p, const char *func, int32_t line)
return(p);
}
-static void print_gc_info(s7_scheme *sc, s7_pointer obj, int32_t line)
+static void print_gc_info(s7_scheme *sc, s7_pointer obj, const char *func, int32_t line)
{
if (!obj)
fprintf(stderr, "[%d]: obj is %p\n", line, obj);
else
if (unchecked_type(obj) != T_FREE)
- fprintf(stderr, "[%d]: %p type is %d?\n", line, obj, unchecked_type(obj));
+ fprintf(stderr, "%s from %s[%d]: %p type is %d?\n", __func__, func, line, obj, unchecked_type(obj));
else
{
s7_int free_type = full_type(obj);
@@ -5381,8 +5383,8 @@ static void print_gc_info(s7_scheme *sc, s7_pointer obj, int32_t line)
full_type(obj) = free_type;
if (obj->explicit_free_line > 0)
snprintf(fline, 128, ", freed at %d, ", obj->explicit_free_line);
- fprintf(stderr, "%s%p is free (line %d, alloc type: %s %" ld64 " #x%" PRIx64 " (%s)), alloc: %s[%d], %sgc: %s[%d], gc: %d%s",
- bold_text, obj, line, s7_type_names[obj->alloc_type & 0xff], obj->alloc_type, obj->alloc_type,
+ fprintf(stderr, "%s%p is free (%s[%d], alloc type: %s %" ld64 " #x%" PRIx64 " (%s)), alloc: %s[%d], %sgc: %s[%d], gc: %d%s",
+ bold_text, obj, func, line, s7_type_names[obj->alloc_type & 0xff], obj->alloc_type, obj->alloc_type,
bits, obj->alloc_func, obj->alloc_line,
(obj->explicit_free_line > 0) ? fline : "", obj->gc_func, obj->gc_line, obj->uses, unbold_text);
fprintf(stderr, "\n");
@@ -5407,7 +5409,7 @@ static s7_pointer check_nref(s7_pointer p, const char *func, int32_t line)
if (unchecked_type(p) == T_FREE)
{
fprintf(stderr, "%s%s[%d]: attempt to use free cell%s\n", bold_text, func, line, unbold_text);
- print_gc_info(cur_sc, p, line);
+ print_gc_info(cur_sc, p, func, line);
if (cur_sc->stop_at_error) abort();
}
return(p);
@@ -6099,8 +6101,11 @@ static s7_pointer find_let(s7_scheme *sc, s7_pointer obj)
case T_CONTINUATION: case T_GOTO:
case T_C_MACRO: case T_C_FUNCTION_STAR: case T_C_FUNCTION: case T_C_RST_NO_REQ_FUNCTION:
return(sc->rootlet);
- /* TODO: what about cload into local?
+ /* what about cload into local? there's no way for a c-func to get its definition env? (s7_define sets global from local_slot if env==shadow_rootlet)
* (*libc* 'memcpy): memcpy, ((rootlet) 'memcpy): #<undefined>, (with-let (rootlet) memcpy): error (undefined), (with-let *libc* memcpy): memcpy
+ * but how to get *libc* from (funclet (*libc* 'memcpy))
+ * currently (*libc* 'sqrt) is #_sqrt (i.e. s7's) whereas (*libm* 'sqrt) is libm's (i.e. s7__sqrt in libm_s7.c) -- confusing
+ * perhaps add a funclet field to c_proc_t?
*/
}
return(sc->nil);
@@ -6410,7 +6415,8 @@ bool s7_is_unspecified(s7_scheme *sc, s7_pointer val) {return(is_unspecified(val
static s7_pointer g_is_undefined(s7_scheme *sc, s7_pointer args)
{
- #define H_is_undefined "(undefined? val) returns #t if val is #<undefined> or its reader equivalent"
+ #define H_is_undefined "(undefined? val) returns #t if val is #<undefined> or some other #... value that s7 does not recognize; (undefined? #asdf): #t.\
+This is not the same as (not (defined? val)) which refers to whether a symbol has a binding: (undefined? 'asdf): #f, but (not (defined? 'asdf)): #t"
#define Q_is_undefined sc->pl_bt
check_boolean_method(sc, is_undefined, sc->is_undefined_symbol, args);
}
@@ -6430,7 +6436,7 @@ s7_pointer s7_eof_object(s7_scheme *sc) {return(eof_object);}
static s7_pointer g_is_eof_object(s7_scheme *sc, s7_pointer args)
{
- #define H_is_eof_object "(eof-object? val) returns #t if val is the end-of-file object"
+ #define H_is_eof_object "(eof-object? val) returns #t if val is the end-of-file object, #<eof>. It is the same as (eq? val #<eof>)"
#define Q_is_eof_object sc->pl_bt
check_boolean_method(sc, is_eof, sc->is_eof_object_symbol, args);
}
@@ -6443,7 +6449,7 @@ static bool not_b_7p(s7_scheme *sc, s7_pointer p) {return(p == sc->F);}
static s7_pointer g_not(s7_scheme *sc, s7_pointer args)
{
- #define H_not "(not obj) returns #t if obj is #f, otherwise #t: (not ()) -> #f"
+ #define H_not "(not obj) returns #t if obj is #f, otherwise #f: (not ()) -> #f"
#define Q_not sc->pl_bt
return((car(args) == sc->F) ? sc->T : sc->F);
}
@@ -6495,7 +6501,7 @@ bool s7_is_immutable(s7_pointer p) {return(is_immutable(p));}
static s7_pointer g_is_immutable(s7_scheme *sc, s7_pointer args)
{
- #define H_is_immutable "(immutable? obj (env (curlet))) returns #t if obj (or obj in env) is immutable"
+ #define H_is_immutable "(immutable? obj (env (curlet))) returns #t if obj (or obj in the environment env) is immutable"
#define Q_is_immutable s7_make_signature(sc, 3, sc->is_boolean_symbol, sc->T, sc->is_let_symbol)
s7_pointer p = car(args), slot;
if (is_symbol(p))
@@ -6539,7 +6545,7 @@ s7_pointer s7_immutable(s7_pointer p)
static s7_pointer g_immutable(s7_scheme *sc, s7_pointer args)
{
- #define H_immutable "(immutable! obj (env (curlet))) declares that the object obj (or obj in env) can't be changed. obj is returned."
+ #define H_immutable "(immutable! obj (env (curlet))) declares that the object obj (or obj in the environment env) can't be changed. obj is returned."
#define Q_immutable s7_make_signature(sc, 3, sc->T, sc->T, sc->is_let_symbol)
s7_pointer p = car(args), slot;
if (is_symbol(p))
@@ -7233,10 +7239,10 @@ static void mark_stack_1(s7_pointer p, s7_int top)
tend = (s7_pointer *)(tp + top);
while (tp < tend)
{
- gc_mark(*tp++);
- gc_mark(*tp++);
- gc_mark(*tp++);
- tp++;
+ gc_mark(*tp++); /* sc->code */
+ gc_mark(*tp++); /* sc->curlet */
+ gc_mark(*tp++); /* sc->args */
+ tp++; /* sc->cur_op */
}
}
@@ -7339,7 +7345,7 @@ static void mark_hash_table(s7_pointer p)
}
if (hash_table_entries(p) > 0)
{
- s7_int len = hash_table_mask(p) + 1;
+ s7_int len = hash_table_size(p);
hash_entry_t **entries = hash_table_elements(p);
hash_entry_t **last = (hash_entry_t **)(entries + len);
@@ -7538,7 +7544,8 @@ static int64_t gc(s7_scheme *sc)
mark_owlet(sc);
gc_mark(sc->code);
- if (sc->args) gc_mark(sc->args);
+ if ((S7_DEBUGGING) && (!(sc->args))) {fprintf(stderr, "%d: sc->args is NULL\n", __LINE__); if (sc->stop_at_error) abort();}
+ /* if (sc->args) */ gc_mark(sc->args);
gc_mark(sc->curlet); /* not mark_let because op_any_closure_3p uses sc->curlet as a temp!! */
mark_current_code(sc); /* probably redundant if with_history */
gc_mark(sc->value);
@@ -7551,7 +7558,8 @@ static int64_t gc(s7_scheme *sc)
mark_pair(sc->stacktrace_defaults);
gc_mark(sc->autoload_table); /* () or a hash-table */
set_mark(sc->default_random_state); /* always a random_state object */
- if (sc->let_temp_hook) gc_mark(sc->let_temp_hook);
+ if ((S7_DEBUGGING) && (!(sc->let_temp_hook))) {fprintf(stderr, "%d: sc->let_temp_hook is NULL\n", __LINE__); if (sc->stop_at_error) abort();}
+ /* if (sc->let_temp_hook) */ gc_mark(sc->let_temp_hook);
gc_mark(sc->w);
gc_mark(sc->x);
@@ -7562,6 +7570,7 @@ static int64_t gc(s7_scheme *sc)
gc_mark(sc->temp3);
gc_mark(sc->temp4);
gc_mark(sc->temp5);
+ gc_mark(sc->temp6);
gc_mark(sc->temp7);
gc_mark(sc->temp8);
gc_mark(sc->temp9);
@@ -7626,7 +7635,6 @@ static int64_t gc(s7_scheme *sc)
mark_vector(sc->protected_setters);
set_mark(sc->protected_setter_symbols);
if ((is_symbol(sc->profile_prefix)) && (is_gensym(sc->profile_prefix))) set_mark(sc->profile_prefix);
- /* what about the integer_wrappers et al? are they protected by the tmps below? or by being always in elist/plist? */
/* protect recent allocations using the free_heap cells above the current free_heap_top (if any).
* cells above sc->free_heap_top might be malloc'd garbage (after heap reallocation), so we keep track of
@@ -7879,7 +7887,7 @@ static void try_to_call_gc(s7_scheme *sc)
static s7_pointer g_gc(s7_scheme *sc, s7_pointer args)
{
- #define H_gc "(gc (on #t)) runs the garbage collector. If 'on' is supplied, it turns the GC on or off. \
+ #define H_gc "(gc (on #t)) runs the garbage collector. If 'on' (a boolean) is supplied, it turns the GC on or off. \
Evaluation produces a surprising amount of garbage, so don't leave the GC off for very long!"
#define Q_gc s7_make_signature(sc, 2, sc->T, sc->is_boolean_symbol)
@@ -8237,7 +8245,7 @@ static void push_stack_1(s7_scheme *sc, opcode_t op, s7_pointer args, s7_pointer
if (sc->stop_at_error) abort();
}
if (sc->stack_end >= sc->stack_resize_trigger)
- fprintf(stderr, "%s%s[%d] from %s: stack resize skipped, stack at %u of %u%s\n",
+ fprintf(stderr, "%s%s[%d] from %s: stack resize skipped, stack at %u of %u%s\n",
bold_text, func, line, op_names[op], (uint32_t)((intptr_t)(sc->stack_end - sc->stack_start) / 4), sc->stack_size / 4, unbold_text);
if (sc->stack_end != end)
fprintf(stderr, "%s[%d]: stack changed in push_stack\n", func, line);
@@ -8486,7 +8494,7 @@ s7_pointer s7_gc_unprotect_via_stack(s7_scheme *sc, s7_pointer x)
/* -------------------------------- symbols -------------------------------- */
-static inline uint64_t raw_string_hash(const uint8_t *key, s7_int len)
+static inline uint64_t raw_string_hash(const uint8_t *key, s7_int len) /* used in symbols, hash-tables */
{
if (len <= 8)
{
@@ -8629,12 +8637,12 @@ static inline s7_pointer make_simple_vector(s7_scheme *sc, s7_int len);
static s7_pointer g_symbol_table(s7_scheme *sc, s7_pointer unused_args)
{
- #define H_symbol_table "(symbol-table) returns a vector containing the current symbol-table symbols"
+ #define H_symbol_table "(symbol-table) returns a vector containing the current contents (symbols) of s7's symbol-table"
#define Q_symbol_table s7_make_signature(sc, 1, sc->is_vector_symbol)
s7_pointer *els, *entries = vector_elements(sc->symbol_table);
int32_t syms = 0;
- s7_pointer lst;
+ s7_pointer vec;
/* this can't be optimized by returning the actual symbol-table (a vector of lists), because
* gensyms can cause the table's lists and symbols to change at any time. This wreaks havoc
* on traversals like for-each. So, symbol-table returns a snap-shot of the table contents
@@ -8651,13 +8659,14 @@ static s7_pointer g_symbol_table(s7_scheme *sc, s7_pointer unused_args)
set_elist_3(sc, wrap_string(sc, "symbol-table size, ~D, is greater than (*s7* 'max-vector-length), ~D", 68),
wrap_integer(sc, syms), wrap_integer(sc, sc->max_vector_length)));
sc->w = make_simple_vector(sc, syms);
+ set_is_symbol_table(sc->w);
els = vector_elements(sc->w);
for (int32_t i = 0, j = 0; i < SYMBOL_TABLE_SIZE; i++)
for (s7_pointer x = entries[i]; is_not_null(x); x = cdr(x))
els[j++] = car(x);
- lst = sc->w;
+ vec = sc->w;
sc->w = sc->unused;
- return(lst);
+ return(vec);
}
bool s7_for_each_symbol_name(s7_scheme *sc, bool (*symbol_func)(const char *symbol_name, void *data), void *data)
@@ -9441,9 +9450,9 @@ s7_pointer s7_make_slot(s7_scheme *sc, s7_pointer let, s7_pointer symbol, s7_poi
{
if ((!is_gensym(symbol)) &&
(initial_slot(symbol) == sc->undefined) &&
- (!in_heap(value)) && /* else initial_slot value can be GC'd if symbol set! (initial != global, initial unprotected) */
+ (!in_heap(value)) && /* else initial_slot value can be GC'd if symbol set! (initial != global, initial unprotected) */
((!sc->string_signature) || /* from init_signatures -- TODO: maybe need a boolean for this */
- (is_c_function(value)))) /* || (is_syntax(value)) -- we need 'else as a special case? */
+ (is_c_function(value)))) /* || (is_syntax(value)) -- we need 'else as a special case? */
/* the string_signature business means only the initial rootlet c_functions take part in unlet. It would be neat if any
* cload library's c_functions could be there as well, but then (unlet) needs to know which envs are in the chain.
* The current shadow_rootlet could be saved in each initial_slot, these could be marked in some way, then the chain
@@ -9560,7 +9569,7 @@ s7_pointer s7_openlet(s7_scheme *sc, s7_pointer e)
static s7_pointer g_openlet(s7_scheme *sc, s7_pointer args)
{
- #define H_openlet "(openlet e) tells the built-in generic functions that the let 'e might have an over-riding method."
+ #define H_openlet "(openlet e) tells the built-in functions that the let 'e might have an over-riding method."
#define Q_openlet sc->pcl_e
s7_pointer e = car(args), elet, func;
@@ -9695,7 +9704,7 @@ to the let target-let, and returns target-let. (varlet (curlet) 'a 1) adds 'a t
sc->T)
s7_pointer e = car(args);
- if (is_null(e))
+ if (is_null(e)) /* PERHAPS: this is a leftover from the days when () -> rootlet -- remove? */
e = sc->rootlet;
else
{
@@ -9773,7 +9782,7 @@ static s7_pointer g_cutlet(s7_scheme *sc, s7_pointer args)
s7_pointer e = car(args);
s7_int the_un_id;
if (is_null(e))
- e = sc->rootlet;
+ e = sc->rootlet; /* PERHAPS: this is a leftover from the days when () -> rootlet -- remove? */
else
{
check_method(sc, e, sc->cutlet_symbol, args);
@@ -9844,7 +9853,7 @@ static s7_pointer g_cutlet(s7_scheme *sc, s7_pointer args)
static s7_pointer sublet_1(s7_scheme *sc, s7_pointer e, s7_pointer bindings, s7_pointer caller)
{
s7_pointer new_e;
- if (e == sc->nil) e = sc->rootlet; /* backwards compatibility */
+ if (e == sc->nil) e = sc->rootlet; /* PERHAPS: this is a leftover from the days when () -> rootlet -- remove? */
new_e = make_let(sc, e);
set_all_methods(new_e, e);
@@ -9915,12 +9924,12 @@ s7_pointer s7_sublet(s7_scheme *sc, s7_pointer e, s7_pointer bindings) {return(s
static s7_pointer g_sublet(s7_scheme *sc, s7_pointer args)
{
- #define H_sublet "(sublet let ...) makes a new let within the environment 'let', initializing it with the bindings"
+ #define H_sublet "(sublet lt ...) makes a new let (environment) within the environment 'lt', initializing it with the bindings"
#define Q_sublet Q_varlet
s7_pointer e = car(args);
- if (is_null(e))
- e = sc->rootlet;
+ if (is_null(e)) /* is this a good idea anymore? () no longer stands for rootlet elsewhere(?) */
+ e = sc->rootlet; /* PERHAPS: this is a leftover from the days when () -> rootlet -- remove? */
else
if (e != sc->rootlet)
{
@@ -9957,8 +9966,8 @@ static s7_pointer sublet_chooser(s7_scheme *sc, s7_pointer f, int32_t num_args,
/* -------------------------------- inlet -------------------------------- */
s7_pointer s7_inlet(s7_scheme *sc, s7_pointer args)
{
- #define H_inlet "(inlet ...) adds its arguments, each a let, a cons: '(symbol . value), or a keyword/value pair, \
-to a new let, and returns the new let. (inlet :a 1 :b 2) or (inlet '(a . 1) '(b . 2))"
+ #define H_inlet "(inlet ...) adds its arguments, each a let, a cons: '(symbol . value), or a symbol/value pair, \
+to a new let, and returns the new let. (inlet :a 1 :b 2) or (inlet 'a 1 'b 2)"
#define Q_inlet s7_make_circular_signature(sc, 1, 2, sc->is_let_symbol, sc->T)
return(sublet_1(sc, sc->rootlet, args, sc->inlet_symbol));
}
@@ -10208,8 +10217,7 @@ static /* inline */ s7_pointer let_ref(s7_scheme *sc, s7_pointer let, s7_pointer
}
#if 0
/* let-ref is currently immutable */
- if (!is_global(sc->let_ref_symbol))
- check_method(sc, let, sc->let_ref_symbol, set_plist_2(sc, let, symbol));
+ if (!is_global(sc->let_ref_symbol)) check_method(sc, let, sc->let_ref_symbol, set_plist_2(sc, let, symbol));
/* a let-ref method is almost impossible to write without creating an infinite loop:
* any reference to the let will probably call let-ref somewhere, calling us again, and looping.
* This is not a problem in c-objects and funclets because c-object-ref and funclet-ref don't exist.
@@ -10258,28 +10266,34 @@ static s7_pointer slot_in_let(s7_scheme *sc, s7_pointer e, const s7_pointer sym)
return(sc->undefined);
}
-static s7_pointer lint_let_ref_p_pp(s7_scheme *sc, s7_pointer lt, s7_pointer sym)
+static s7_pointer let_ref_p_pp(s7_scheme *sc, s7_pointer lt, s7_pointer sym)
{
+ if (lt == sc->rootlet) /* op_implicit_let_ref_c can pass rootlet */
+ return((is_slot(global_slot(sym))) ? global_value(sym) : sc->undefined);
+ if (let_id(lt) == symbol_id(sym))
+ return(local_value(sym)); /* see add in tlet! */
for (s7_pointer x = lt; x; x = let_outlet(x))
for (s7_pointer y = let_slots(x); tis_slot(y); y = next_slot(y))
if (slot_symbol(y) == sym)
return(slot_value(y));
-
if ((lt != sc->nil) && (has_let_ref_fallback(lt)))
return(call_let_ref_fallback(sc, lt, sym));
-
return((is_slot(global_slot(sym))) ? global_value(sym) : sc->undefined);
}
-static inline s7_pointer g_lint_let_ref(s7_scheme *sc, s7_pointer args)
+static inline s7_pointer g_simple_let_ref(s7_scheme *sc, s7_pointer args)
{
s7_pointer lt = car(args), sym = cadr(args);
- if ((!is_let(lt)) || (lt == sc->rootlet))
+ if (!is_let(lt))
wrong_type_error_nr(sc, sc->let_ref_symbol, 1, lt, a_let_string);
+ if (lt == sc->rootlet)
+ return((is_slot(global_slot(sym))) ? global_value(sym) : sc->undefined);
+ if (let_id(lt) == symbol_id(sym))
+ return(local_value(sym));
for (s7_pointer y = let_slots(lt); tis_slot(y); y = next_slot(y))
if (slot_symbol(y) == sym)
return(slot_value(y));
- return(lint_let_ref_p_pp(sc, let_outlet(lt), sym));
+ return(let_ref_p_pp(sc, let_outlet(lt), sym));
}
static s7_pointer let_ref_chooser(s7_scheme *sc, s7_pointer f, int32_t unused_args, s7_pointer expr, bool ops)
@@ -10293,27 +10307,38 @@ static s7_pointer let_ref_chooser(s7_scheme *sc, s7_pointer f, int32_t unused_ar
(!is_possibly_constant(cadr(arg2))))
{
set_opt3_sym(cdr(expr), cadr(arg2));
- return(sc->lint_let_ref);
+ return(sc->simple_let_ref);
}}
return(f);
}
static bool op_implicit_let_ref_c(s7_scheme *sc)
{
- s7_pointer s = lookup_checked(sc, car(sc->code));
- if (!is_let(s)) {sc->last_function = s; return(false);}
- sc->value = let_ref(sc, T_Ext(s), opt3_con(sc->code));
+ s7_pointer let = lookup_checked(sc, car(sc->code));
+ if (!is_let(let)) {sc->last_function = let; return(false);}
+ sc->value = let_ref_p_pp(sc, let, opt3_con(sc->code));
return(true);
}
static bool op_implicit_let_ref_a(s7_scheme *sc)
{
- s7_pointer s = lookup_checked(sc, car(sc->code));
- if (!is_let(s)) {sc->last_function = s; return(false);}
- sc->value = let_ref(sc, s, fx_call(sc, cdr(sc->code)));
+ s7_pointer sym, let = lookup_checked(sc, car(sc->code));
+ if (!is_let(let)) {sc->last_function = let; return(false);}
+ sym = fx_call(sc, cdr(sc->code));
+ if (is_symbol(sym))
+ sc->value = let_ref_p_pp(sc, let, (is_keyword(sym)) ? keyword_symbol(sym) : sym);
+ else sc->value = let_ref(sc, let, sym);
return(true);
}
+static s7_pointer fx_implicit_let_ref_c(s7_scheme *sc, s7_pointer arg)
+{
+ s7_pointer let = lookup_checked(sc, car(arg)); /* the let */
+ if (!is_let(let))
+ return(s7_apply_function(sc, let, list_1(sc, opt3_con(arg))));
+ return(let_ref_p_pp(sc, let, opt3_con(arg)));
+}
+
/* -------------------------------- let-set! -------------------------------- */
static s7_pointer let_set_1(s7_scheme *sc, s7_pointer let, s7_pointer symbol, s7_pointer value)
@@ -10337,7 +10362,8 @@ static s7_pointer let_set_1(s7_scheme *sc, s7_pointer let, s7_pointer symbol, s7
if (is_syntax(slot_value(slot)))
wrong_type_error_nr(sc, sc->let_set_symbol, 2, symbol, wrap_string(sc, "a non-syntactic symbol", 22));
if (is_immutable(slot))
- immutable_object_error_nr(sc, set_elist_4(sc, wrap_string(sc, "~S is immutable in (let-set! (rootlet) '~S ~S)", 46), symbol, symbol, value)); /* also (set! (with-let...)...) */
+ immutable_object_error_nr(sc, set_elist_4(sc, wrap_string(sc, "~S is immutable in (let-set! (rootlet) '~S ~S)", 46),
+ symbol, symbol, value)); /* also (set! (with-let...)...) */
symbol_increment_ctr(symbol);
slot_set_value(slot, (slot_has_setter(slot)) ? call_setter(sc, slot, value) : value);
return(slot_value(slot));
@@ -10403,7 +10429,7 @@ static s7_pointer let_set_p_ppp_2(s7_scheme *sc, s7_pointer p1, s7_pointer p2, s
return(let_set_1(sc, p1, p2, p3));
}
-static s7_pointer g_lint_let_set(s7_scheme *sc, s7_pointer args)
+static s7_pointer g_simple_let_set(s7_scheme *sc, s7_pointer args)
{
s7_pointer y, lt = car(args), sym = cadr(args), val = caddr(args);
@@ -10438,7 +10464,7 @@ static s7_pointer let_set_chooser(s7_scheme *sc, s7_pointer f, int32_t unused_ar
(is_quoted_pair(arg2)) &&
(!is_possibly_constant(cadr(arg2))) &&
(!is_possibly_constant(arg3)))
- return(sc->lint_let_set);
+ return(sc->simple_let_set);
}
return(f);
}
@@ -10978,7 +11004,7 @@ static s7_pointer make_macro(s7_scheme *sc, opcode_t op, bool named)
{
s7_pointer mac, body, mac_name = NULL;
uint64_t typ;
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s[%d]: %s\n", __func__, __LINE__, display_80(sc->code));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: %s\n", __func__, __LINE__, display_80(sc->code));
switch (op)
{
case OP_DEFINE_MACRO: case OP_MACRO: typ = T_MACRO; break;
@@ -11378,7 +11404,7 @@ void s7_define(s7_scheme *sc, s7_pointer let, s7_pointer symbol, s7_pointer valu
else
{
s7_make_slot(sc, let, symbol, value); /* I think this means C code can override "constant" defs */
- /* if let is sc->nil or rootlet, s7_make_slot makes a semipermanent_slot */
+ /* if let is rootlet, s7_make_slot makes a semipermanent_slot */
if ((let == sc->shadow_rootlet) &&
(!is_slot(global_slot(symbol))))
{
@@ -12338,7 +12364,7 @@ static s7_pointer g_call_with_exit(s7_scheme *sc, s7_pointer args) /* (call-wi
#define Q_call_with_exit s7_make_signature(sc, 2, sc->values_symbol, sc->is_procedure_symbol)
s7_pointer p = car(args), x;
- if (is_any_closure(p))
+ if (is_any_closure(p)) /* lambda or lambda* */
{
x = make_goto(sc, ((is_pair(closure_args(p))) && (is_symbol(car(closure_args(p))))) ? car(closure_args(p)) : sc->F);
push_stack(sc, OP_DEACTIVATE_GOTO, x, p); /* this means call-with-exit is not tail-recursive */
@@ -12351,6 +12377,9 @@ static s7_pointer g_call_with_exit(s7_scheme *sc, s7_pointer args) /* (call-wi
if (!s7_is_aritable(sc, p, 1))
error_nr(sc, sc->wrong_type_arg_symbol,
set_elist_2(sc, wrap_string(sc, "call-with-exit argument should be a function of one argument: ~S", 64), p));
+ if (is_continuation(p)) /* (call/cc call-with-exit) ! */
+ error_nr(sc, sc->wrong_type_arg_symbol,
+ set_elist_2(sc, wrap_string(sc, "call-with-exit argument should be a normal function (not a continuation: ~S)", 76), p));
x = make_goto(sc, sc->F);
call_exit_active(x) = false;
return((is_c_function(p)) ? c_function_call(p)(sc, set_plist_1(sc, x)) : s7_apply_function_star(sc, p, set_plist_1(sc, x)));
@@ -28035,7 +28064,8 @@ static s7_pointer g_string_1(s7_scheme *sc, s7_pointer args, s7_pointer sym)
int32_t i, len;
s7_pointer x, newstr;
char *str;
- if (is_null(args)) return(nil_string);
+ /* if (is_null(args)) return(nil_string); */
+ if ((S7_DEBUGGING) && (is_null(args))) fprintf(stderr, "g_string_1 got null?\n");
/* get length for new string and check arg types */
for (len = 0, x = args; is_not_null(x); len++, x = cdr(x))
@@ -30703,9 +30733,9 @@ static s7_pointer load_shared_object(s7_scheme *sc, const char *fname, s7_pointe
if (!library)
s7_warn(sc, 512, "load %s failed: %s\n", (pname) ? pwd_name : fname, dlerror());
else
- if (let) /* look for 'init_func in let */
+ if (let) /* look for 'init_func in let -- let has been checked by caller that it actually is a let */
{
- s7_pointer init = let_ref(sc, let, make_symbol(sc, "init_func", 9));
+ s7_pointer init = let_ref_p_pp(sc, let, make_symbol(sc, "init_func", 9));
/* init is a symbol (surely not a gensym?), so it should not need to be protected */
if (!is_symbol(init))
s7_warn(sc, 512, "can't load %s: no init function\n", fname);
@@ -30723,7 +30753,7 @@ static s7_pointer load_shared_object(s7_scheme *sc, const char *fname, s7_pointe
{
typedef void (*dl_func)(s7_scheme *sc);
typedef s7_pointer (*dl_func_with_args)(s7_scheme *sc, s7_pointer args);
- s7_pointer init_args = let_ref(sc, let, make_symbol(sc, "init_args", 9));
+ s7_pointer init_args = let_ref_p_pp(sc, let, make_symbol(sc, "init_args", 9));
s7_pointer p;
gc_protect_via_stack(sc, init_args);
if (is_pair(init_args))
@@ -30808,8 +30838,8 @@ s7_pointer s7_load_with_environment(s7_scheme *sc, const char *filename, s7_poin
declare_jump_info();
TRACK(sc);
if (e == sc->s7_starlet) return(NULL);
- if (e == sc->nil) e = sc->rootlet;
-
+ if (e == sc->nil) e = sc->rootlet; /* PERHAPS: this is a leftover from the days when () -> rootlet -- remove? */
+ if (!is_let(e)) s7_warn(sc, 128, "third argument (the let) to s7_load_with_environment is not a let");
#if WITH_C_LOADER
port = load_shared_object(sc, filename, e);
if (port) return(port);
@@ -30848,7 +30878,7 @@ s7_pointer s7_load_c_string_with_environment(s7_scheme *sc, const char *content,
declare_jump_info();
TRACK(sc);
- if (e == sc->nil) e = sc->rootlet;
+ if (e == sc->nil) e = sc->rootlet; /* PERHAPS: this is a leftover from the days when () -> rootlet -- remove? */
if (content[bytes] != 0)
error_nr(sc, make_symbol(sc, "bad-data", 8), set_elist_1(sc, wrap_string(sc, "s7_load_c_string content is not terminated", 42)));
port = open_input_string(sc, content, bytes);
@@ -31048,7 +31078,7 @@ s7_pointer s7_autoload(s7_scheme *sc, s7_pointer symbol, s7_pointer file_or_func
{
/* add '(symbol . file) to s7's autoload table */
if (is_null(sc->autoload_table))
- sc->autoload_table = s7_make_hash_table(sc, sc->default_hash_table_length); /* add_hash_table here, perhaps sc->hash_tables->loc-- */
+ sc->autoload_table = s7_make_hash_table(sc, 32); /* add_hash_table here, perhaps sc->hash_tables->loc-- */
if (sc->safety >= MORE_SAFETY_WARNINGS)
{
const s7_pointer p = s7_hash_table_ref(sc, sc->autoload_table, symbol);
@@ -31755,7 +31785,7 @@ static s7_pointer hash_table_iterate(s7_scheme *sc, s7_pointer iterator)
return(hash_entry_to_cons(sc, lst, iterator_current(iterator)));
}
table = iterator_sequence(iterator); /* using iterator_length and hash_table_entries here was slightly slower */
- len = hash_table_mask(table) + 1;
+ len = hash_table_size(table);
elements = hash_table_elements(table);
for (s7_int loc = iterator_position(iterator) + 1; loc < len; loc++)
@@ -32339,7 +32369,7 @@ static bool collect_shared_info(s7_scheme *sc, shared_info_t *ci, s7_pointer top
case T_HASH_TABLE:
if (hash_table_entries(top) > 0)
{
- s7_int len = hash_table_mask(top) + 1;
+ s7_int len = hash_table_size(top);
hash_entry_t **entries = hash_table_elements(top);
bool keys_safe = hash_keys_not_cyclic(sc, top);
for (s7_int i = 0; i < len; i++)
@@ -32530,7 +32560,7 @@ static shared_info_t *load_shared_info(s7_scheme *sc, s7_pointer top, bool stop_
else
if (is_hash_table(top))
{
- s7_int len = hash_table_mask(top) + 1;
+ s7_int len = hash_table_size(top);
hash_entry_t **entries = hash_table_elements(top);
bool keys_safe = hash_keys_not_cyclic(sc, top);
if (hash_table_entries(top) == 0) return(NULL);
@@ -33579,12 +33609,33 @@ static void simple_list_readable_display(s7_scheme *sc, s7_pointer lst, s7_int t
}
}
+#if S7_DEBUGGING
+static char *base = NULL, *min_char = NULL;
+#endif
+
static void pair_to_port(s7_scheme *sc, s7_pointer lst, s7_pointer port, use_write_t use_write, shared_info_t *ci)
{
s7_pointer x;
s7_int i, len;
bool immutable = false;
s7_int true_len = list_length_with_immutable_check(sc, lst, &immutable);
+
+#if S7_DEBUGGING
+ char xx;
+ if (!base) base = &xx;
+ else
+ if (&xx > base) base = &xx;
+ else
+ if ((!min_char) || (&xx < min_char))
+ {
+ min_char = &xx;
+ if ((base - min_char) > 1000000)
+ {
+ fprintf(stderr, "pair_to_port infinite recursion?\n");
+ abort();
+ }}
+#endif
+
if (true_len < 0) /* a dotted list -- handle cars, then final cdr */
len = (-true_len + 1);
else len = (true_len == 0) ? circular_list_entries(lst) : true_len; /* circular list (nil is handled by unique_to_port) */
@@ -33626,7 +33677,7 @@ static void pair_to_port(s7_scheme *sc, s7_pointer lst, s7_pointer port, use_wri
else temp_ci = ci;
if (need_new_ci) sc->object_out_locked = true;
object_to_port_with_circle_check(sc, cadr(lst), port, P_WRITE, temp_ci);
- if (need_new_ci)
+ if (need_new_ci)
{
sc->object_out_locked = old_locked;
free_shared_info(new_ci);
@@ -33857,6 +33908,7 @@ static const char *hash_table_typer_name(s7_scheme *sc, s7_pointer typer)
s7_pointer sym;
if (is_c_function(typer)) return(c_function_name(typer));
if (is_boolean(typer)) return("#t");
+ if (typer == sc->unused) return("#<unused>"); /* mapper can be sc->unused briefly */
sym = find_closure(sc, typer, closure_let(typer));
if (is_null(sym)) return(NULL);
return(symbol_name(sym));
@@ -33889,7 +33941,7 @@ static void hash_table_procedures_to_port(s7_scheme *sc, s7_pointer hash, s7_poi
if (is_pair(hash_table_procedures(hash)))
{
s7_int nlen = 0;
- const char *str = (const char *)integer_to_string(sc, hash_table_mask(hash) + 1, &nlen);
+ const char *str = (const char *)integer_to_string(sc, hash_table_size(hash), &nlen);
const char *checker = hash_table_typer_name(sc, hash_table_procedures_checker(hash));
const char *mapper = hash_table_typer_name(sc, hash_table_procedures_mapper(hash));
if (is_weak_hash_table(hash))
@@ -33933,7 +33985,7 @@ static void hash_table_procedures_to_port(s7_scheme *sc, s7_pointer hash, s7_poi
else
{
s7_int nlen = 0;
- const char *str = integer_to_string(sc, hash_table_mask(hash) + 1, &nlen);
+ const char *str = integer_to_string(sc, hash_table_size(hash), &nlen);
if (is_weak_hash_table(hash))
port_write_string(port)(sc, "(make-weak-hash-table ", 22, port);
else port_write_string(port)(sc, "(make-hash-table ", 17, port);
@@ -34358,7 +34410,7 @@ static void let_to_port(s7_scheme *sc, s7_pointer obj, s7_pointer port, use_writ
}
else
{
- s7_pointer name = let_ref(sc, obj, sc->class_name_symbol);
+ s7_pointer name = let_ref_p_pp(sc, obj, sc->class_name_symbol);
if (is_symbol(name))
symbol_to_port(sc, name, port, P_DISPLAY, NULL);
else let_to_port(sc, let_outlet(obj), port, use_write, ci);
@@ -34624,9 +34676,9 @@ static void write_closure_readably_1(s7_scheme *sc, s7_pointer obj, s7_pointer a
if ((is_pair(arglist)) &&
(allows_other_keys(arglist)))
{
- sc->temp9 = (is_null(cdr(arglist))) ?
- set_plist_2(sc, car(arglist), sc->allow_other_keys_keyword) :
- pair_append(sc, arglist, list_1(sc, sc->allow_other_keys_keyword));
+ sc->temp9 = (is_null(cdr(arglist))) ? set_plist_2(sc, car(arglist), sc->allow_other_keys_keyword) :
+ ((is_null(cddr(arglist))) ? set_plist_3(sc, car(arglist), cadr(arglist), sc->allow_other_keys_keyword) :
+ pair_append(sc, arglist, list_1(sc, sc->allow_other_keys_keyword)));
object_to_port(sc, sc->temp9, port, P_WRITE, NULL);
sc->temp9 = sc->unused;
}
@@ -37644,10 +37696,13 @@ static bool is_proper_list_4(s7_scheme *unused_sc, s7_pointer p) {return(proper_
/* -------------------------------- make-list -------------------------------- */
static s7_pointer make_big_list(s7_scheme *sc, s7_int len, s7_pointer init)
{
+ s7_pointer res; /* expanding and using free_heap pointers as a block here is 10% faster */
check_free_heap_size(sc, len + 1); /* using cons_unchecked below, +1 in case we are on the trigger at the end */
- sc->value = sc->nil; /* expanding and using free_heap pointers as a block here is 10% faster */
- for (s7_int i = 0; i < len; i++) sc->value = cons_unchecked(sc, init, sc->value);
- return(sc->value);
+ sc->temp6 = sc->nil; /* sc->temp6 used only here currently */
+ for (s7_int i = 0; i < len; i++) sc->temp6 = cons_unchecked(sc, init, sc->temp6);
+ res = sc->temp6;
+ sc->temp6 = sc->unused;
+ return(res);
}
static inline s7_pointer make_list(s7_scheme *sc, s7_int len, s7_pointer init)
@@ -37767,6 +37822,14 @@ static bool op_implicit_pair_ref_a(s7_scheme *sc)
return(true);
}
+static s7_pointer fx_implicit_pair_ref_a(s7_scheme *sc, s7_pointer arg)
+{
+ s7_pointer s = lookup_checked(sc, car(arg));
+ if (!is_pair(s))
+ return(s7_apply_function(sc, s, list_1(sc, fx_call(sc, cdr(arg)))));
+ return(list_ref_1(sc, s, fx_call(sc, cdr(arg))));
+}
+
static s7_pointer implicit_pair_index_checked(s7_scheme *sc, s7_pointer obj, s7_pointer in_obj, s7_pointer indices)
{
if (!is_applicable(in_obj))
@@ -39446,6 +39509,9 @@ static s7_pointer safe_list_1(s7_scheme *sc)
{
sc->current_safe_list = 1;
set_list_in_use(sc->safe_lists[1]);
+#if S7_DEBUGGING
+ sc->safe_list_uses[1]++;
+#endif
return(sc->safe_lists[1]);
}
return(cons(sc, sc->nil, sc->nil));
@@ -39457,6 +39523,9 @@ static s7_pointer safe_list_2(s7_scheme *sc)
{
sc->current_safe_list = 2;
set_list_in_use(sc->safe_lists[2]);
+#if S7_DEBUGGING
+ sc->safe_list_uses[2]++;
+#endif
return(sc->safe_lists[2]);
}
return(cons_unchecked(sc, sc->nil, list_1(sc, sc->nil)));
@@ -39472,9 +39541,11 @@ static s7_pointer make_safe_list(s7_scheme *sc, s7_int num_args)
if (!list_is_in_use(sc->safe_lists[num_args]))
{
set_list_in_use(sc->safe_lists[num_args]);
+#if S7_DEBUGGING
+ sc->safe_list_uses[num_args]++;
+#endif
return(sc->safe_lists[num_args]);
}}
- /* if ((S7_DEBUGGING) && (num_args >= 16)) fprintf(stderr, "sl: %" ld64 "\n", num_args); */
return(make_big_list(sc, num_args, sc->nil));
}
@@ -39485,6 +39556,9 @@ static inline s7_pointer safe_list_if_possible(s7_scheme *sc, s7_int num_args)
{
sc->current_safe_list = num_args;
set_list_in_use(sc->safe_lists[num_args]);
+#if S7_DEBUGGING
+ sc->safe_list_uses[num_args]++;
+#endif
return(sc->safe_lists[num_args]);
}
return(make_safe_list(sc, num_args));
@@ -43494,7 +43568,7 @@ static void free_hash_table(s7_scheme *sc, s7_pointer table)
if (hash_table_entries(table) > 0)
{
hash_entry_t **entries = hash_table_elements(table);
- s7_int len = hash_table_mask(table) + 1;
+ s7_int len = hash_table_size(table);
for (s7_int i = 0; i < len; i++)
{
hash_entry_t *n;
@@ -43768,12 +43842,10 @@ static hash_entry_t *hash_symbol(s7_scheme *sc, s7_pointer table, s7_pointer key
/* ---------------- hash numbers ---------------- */
-static s7_int hash_float_location(s7_double x) {return(((is_NaN(x)) || (is_inf(x)) || (fabs(x) > DOUBLE_TO_INT64_LIMIT)) ? 0 : (s7_int)floor(fabs(x)));}
- /* isnormal here in place of is_NaN and is_inf is slower */
-
-static s7_int hash_map_int(s7_scheme *sc, s7_pointer table, s7_pointer key) {return(s7_int_abs(integer(key)));}
-static s7_int hash_map_real(s7_scheme *sc, s7_pointer table, s7_pointer key) {return(hash_float_location(real(key)));}
-static s7_int hash_map_complex(s7_scheme *sc, s7_pointer table, s7_pointer key) {return(hash_float_location(real_part(key)));}
+static s7_int hash_map_int(s7_scheme *sc, s7_pointer table, s7_pointer key)
+{
+ return(s7_int_abs(integer(key)));
+}
static s7_int hash_map_ratio(s7_scheme *sc, s7_pointer table, s7_pointer key)
{
@@ -43782,7 +43854,29 @@ static s7_int hash_map_ratio(s7_scheme *sc, s7_pointer table, s7_pointer key)
* floor ratio is 1: (- (* 2 1720656898084610641) 3441313796169221281) -> 1
* or (gmp:) 1.999999999999999999418826611445214136431E0, so the floorl(fabsl) version is wrong
*/
- return(s7_int_abs(numerator(key) / denominator(key)));
+ return(s7_int_abs(numerator(key) / denominator(key))); /* needs to be compatible with default-hash-table-float-epsilon which is unfortunate */
+}
+
+static s7_int hash_float_location(s7_double x)
+{
+ s7_double dx;
+ if ((is_NaN(x)) || (is_inf(x))) return(0);
+ dx = fabs(x);
+ if (dx > DOUBLE_TO_INT64_LIMIT) return(0);
+ return((s7_int)floor(dx));
+}
+ /* isnormal here in place of is_NaN and is_inf is slower.
+ * using x*100 to expand small float bin range runs afoul of the hash-table-float-epsilon bin calcs
+ */
+
+static s7_int hash_map_real(s7_scheme *sc, s7_pointer table, s7_pointer key)
+{
+ return(hash_float_location(real(key)));
+}
+
+static s7_int hash_map_complex(s7_scheme *sc, s7_pointer table, s7_pointer key)
+{
+ return(hash_float_location(real_part(key))/* + hash_float_location(imag_part(key)) */); /* imag-part confuses epsilon distance calcs */
}
#if WITH_GMP
@@ -44082,13 +44176,15 @@ static hash_entry_t *hash_string(s7_scheme *sc, s7_pointer table, s7_pointer key
if (is_string(key))
{
hash_entry_t *x;
- s7_int key_len = string_length(key), hash_mask = hash_table_mask(table);
+ s7_int key_len = string_length(key);
+ uint64_t hash_mask = (uint64_t)hash_table_mask(table);
uint64_t hash;
const char *key_str = string_value(key);
if (string_hash(key) == 0)
string_hash(key) = raw_string_hash((const uint8_t *)string_value(key), string_length(key));
- hash = string_hash(key);
+ hash = string_hash(key); /* keep uint64_t (not s7_int from hash_map_string) TODO: can this work?? */
+
if (key_len <= 8)
{
for (x = hash_table_element(table, hash & hash_mask); x; x = hash_entry_next(x))
@@ -44135,7 +44231,7 @@ static s7_int hash_map_eq(s7_scheme *sc, s7_pointer table, s7_pointer key) {retu
static hash_entry_t *hash_eq(s7_scheme *sc, s7_pointer table, s7_pointer key)
{
- /* explicit eq? as hash equality func or (for example) symbols as keys */
+ /* explicit eq? as hash equality func for (for example) symbols as keys */
s7_int hash_mask = hash_table_mask(table);
s7_int loc = pointer_map(key) & hash_mask; /* hash_map_eq */
for (hash_entry_t *x = hash_table_element(table, loc); x; x = hash_entry_next(x))
@@ -44176,9 +44272,35 @@ static s7_int hash_map_hash_table(s7_scheme *sc, s7_pointer table, s7_pointer ke
{
/* hash-tables are equal if key/values match independent of table size and entry order.
* if not using equivalent?, hash_table_checker|mapper must also be the same.
+ * since order doesn't matter, but equal tables need to map to the same bin, we can't use key's
+ * entries except when key has 1 or 2 entries (or 3 to be tedious).
* Keys are supposed to be constant while keys, so a hash-table shouldn't be a key of itself.
*/
- return(hash_table_entries(key));
+ s7_int len = hash_table_entries(key);
+ if ((len == 0) || (len > 2) || (hash_table_size(key) > 32)) return(len);
+
+ {
+ s7_pointer key1 = NULL, val1;
+ hash_entry_t **els = hash_table_elements(key);
+ s7_int size = hash_table_size(key);
+ for (s7_int i = 0; i < size; i++)
+ for (hash_entry_t *x = els[i]; x; x = hash_entry_next(x))
+ {
+ if (len == 1)
+ return(((is_sequence_or_iterator(hash_entry_key(x))) ? 0 : hash_loc(sc, key, hash_entry_key(x))) +
+ ((is_sequence_or_iterator(hash_entry_value(x))) ? 0 : hash_loc(sc, key, hash_entry_value(x))));
+ if (!key1)
+ {
+ key1 = hash_entry_key(x);
+ val1 = hash_entry_value(x);
+ }
+ else
+ return(((is_sequence_or_iterator(key1)) ? 0 : hash_loc(sc, key, key1)) +
+ ((is_sequence_or_iterator(val1)) ? 0 : hash_loc(sc, key, val1)) +
+ ((is_sequence_or_iterator(hash_entry_key(x))) ? 0 : hash_loc(sc, key, hash_entry_key(x))) +
+ ((is_sequence_or_iterator(hash_entry_value(x))) ? 0 : hash_loc(sc, key, hash_entry_value(x))));
+ }}
+ return(0); /* placate the compiler */
}
static s7_int hash_map_int_vector(s7_scheme *sc, s7_pointer table, s7_pointer key)
@@ -44211,10 +44333,10 @@ static s7_int hash_map_float_vector(s7_scheme *sc, s7_pointer table, s7_pointer
static s7_int hash_map_vector(s7_scheme *sc, s7_pointer table, s7_pointer key)
{
if ((vector_length(key) == 0) ||
- (is_sequence(vector_element(key, 0))))
+ (is_sequence_or_iterator(vector_element(key, 0))))
return(vector_length(key));
if ((vector_length(key) == 1) ||
- (is_sequence(vector_element(key, 1))))
+ (is_sequence_or_iterator(vector_element(key, 1))))
return(hash_loc(sc, table, vector_element(key, 0)));
return(vector_length(key) + hash_loc(sc, table, vector_element(key, 0)) + hash_loc(sc, table, vector_element(key, 1))); /* see above */
}
@@ -44228,7 +44350,7 @@ static s7_int hash_map_closure(s7_scheme *sc, s7_pointer table, s7_pointer key)
set_elist_1(sc, wrap_string(sc, "hash-table map function called recursively", 42)));
/* check_stack_size(sc); -- perhaps clear typers as well here or save/restore hash-table-procedures */
gc_protect_via_stack(sc, f);
- hash_table_set_procedures_mapper(table, sc->unused);
+ hash_table_set_procedures_mapper(table, sc->F);
sc->value = s7_call(sc, f, set_plist_1(sc, key));
unstack_gc_protect(sc);
hash_table_set_procedures_mapper(table, f);
@@ -44240,42 +44362,29 @@ static s7_int hash_map_closure(s7_scheme *sc, s7_pointer table, s7_pointer key)
static s7_int hash_map_let(s7_scheme *sc, s7_pointer table, s7_pointer key)
{
- /* lets are equal if same symbol/value pairs, independent of order, taking into account shadowing
- * (length (inlet 'a 1 'a 2)) = 2
- * but this counts as just one entry from equal?'s point of view, so if more than one entry, we have a problem.
- * (equal? (inlet 'a 1) (inlet 'a 3 'a 2 'a 1)) = #t
- * also currently equal? follows outlet, but that is ridiculous here, so in this case hash equal?
- * is not the same as equal? Surely anyone using lets as keys wants eq?
- */
- s7_pointer slot;
+ /* lets are equal if same symbol/value pairs, independent of order, taking into account shadowing. equal? follows outlet, but that is ridiculous here. */
+ s7_pointer slot, slot1 = NULL, slot2 = NULL;
s7_int slots;
- if ((key == sc->rootlet) ||
- (!tis_slot(let_slots(key))))
- return(0);
- slot = let_slots(key);
- if (!tis_slot(next_slot(slot)))
- {
- if (is_sequence(slot_value(slot))) /* avoid loop if cycles */
- return(pointer_map(slot_symbol(slot)));
- return(pointer_map(slot_symbol(slot)) + hash_loc(sc, table, slot_value(slot)));
- }
- slots = 0;
- for (; tis_slot(slot); slot = next_slot(slot))
+ if ((key == sc->rootlet) || (!tis_slot(let_slots(key)))) return(0);
+
+ for (slot = let_slots(key), slots = 0; tis_slot(slot); slot = next_slot(slot))
if (!is_matched_symbol(slot_symbol(slot)))
{
+ if (!slot1) slot1 = slot; else slot2 = slot;
set_match_symbol(slot_symbol(slot));
slots++;
}
for (slot = let_slots(key); tis_slot(slot); slot = next_slot(slot))
clear_match_symbol(slot_symbol(slot));
- if (slots != 1)
- return(slots);
- slot = let_slots(key);
- if (is_sequence(slot_value(slot))) /* avoid loop if cycles */
- return(pointer_map(slot_symbol(slot)));
- return(pointer_map(slot_symbol(slot)) + hash_loc(sc, table, slot_value(slot)));
+ if (slots == 1)
+ return(pointer_map(slot_symbol(slot1)) + ((is_sequence_or_iterator(slot_value(slot1))) ? 0 : hash_loc(sc, table, slot_value(slot1))));
+
+ if (slots == 2)
+ return(pointer_map(slot_symbol(slot1)) + ((is_sequence_or_iterator(slot_value(slot1))) ? 0 : hash_loc(sc, table, slot_value(slot1))) +
+ pointer_map(slot_symbol(slot2)) + ((is_sequence_or_iterator(slot_value(slot2))) ? 0 : hash_loc(sc, table, slot_value(slot2))));
+ return(slots);
}
static hash_entry_t *hash_equal_eq(s7_scheme *sc, s7_pointer table, s7_pointer key)
@@ -44351,10 +44460,11 @@ static hash_entry_t *hash_equal_complex(s7_scheme *sc, s7_pointer table, s7_poin
s7_int loc;
s7_double keyrl = real_part(key);
s7_double keyim = imag_part(key);
+
#if WITH_GMP
if ((is_NaN(keyrl)) || (is_NaN(keyim))) return(sc->unentry);
#endif
- loc = hash_float_location(keyrl) & hash_table_mask(table);
+ loc = hash_map_complex(sc, table, key) & hash_table_mask(table);
for (hash_entry_t *x = hash_table_element(table, loc); x; x = hash_entry_next(x))
{
if ((is_t_complex(hash_entry_key(x))) &&
@@ -44379,6 +44489,9 @@ static hash_entry_t *hash_equal_any(s7_scheme *sc, s7_pointer table, s7_pointer
s7_int hash = hash_loc(sc, table, key);
s7_int loc = hash & hash_table_mask(table);
for (hash_entry_t *x = hash_table_element(table, loc); x; x = hash_entry_next(x))
+ if (key == hash_entry_key(x)) /* avoid the equal funcs if possible -- this saves in both hash timing tests */
+ return(x);
+ for (hash_entry_t *x = hash_table_element(table, loc); x; x = hash_entry_next(x))
if ((hash_entry_raw_hash(x) == hash) &&
(equal(sc, key, hash_entry_key(x), NULL)))
return(x);
@@ -44393,6 +44506,23 @@ static s7_int hash_map_c_function(s7_scheme *sc, s7_pointer table, s7_pointer ke
return(integer(f(sc, with_list_t1(key))));
}
+static s7_int hash_map_c_pointer(s7_scheme *sc, s7_pointer table, s7_pointer key)
+{
+ return(pointer_map(c_pointer(key)));
+}
+
+static s7_int hash_map_undefined(s7_scheme *sc, s7_pointer table, s7_pointer key)
+{
+ return(raw_string_hash((const uint8_t *)(undefined_name(key) + 1), undefined_name_length(key) - 1) + undefined_name_length(key));
+ /* undefined_name always starts with "#", so we omit it above */
+}
+
+static s7_int hash_map_iterator(s7_scheme *sc, s7_pointer table, s7_pointer key)
+{
+ /* cycles can happen here if the iterator_sequence contains the iterator and hash_loc checks that element */
+ return(type(iterator_sequence(key)) + hash_loc(sc, table, iterator_sequence(key)));
+}
+
static hash_entry_t *hash_equal(s7_scheme *sc, s7_pointer table, s7_pointer key);
static hash_entry_t *hash_c_function(s7_scheme *sc, s7_pointer table, s7_pointer key)
@@ -44416,38 +44546,42 @@ static hash_entry_t *hash_c_function(s7_scheme *sc, s7_pointer table, s7_pointer
return(hash_equal(sc, table, key));
}
-static int32_t len_upto_8(s7_pointer p)
+static int32_t len_upto_100(s7_pointer p)
{
- int32_t i = 0; /* unrolling this loop saves 10-15% */
- for (s7_pointer x = p; (is_pair(x)) && (i < 8); i++, x = cdr(x));
+ int32_t i = 0;
+ for (s7_pointer x = p; (is_pair(x)) && (i < 100); i++, x = cdr(x));
return(i);
}
static s7_int hash_map_pair(s7_scheme *sc, s7_pointer table, s7_pointer key)
{
/* len+loc(car) is not horrible, but it means (for example) every list '(set! ...) is hashed to the same location,
- * so at least we need to take cadr into account if possible. Better would combine the list_length
+ * so at least we need to take cadr into account if possible. Better would combine the list_length (or tree-leaves == tree_len(sc, p))
* with stats like symbols/pairs/constants at top level, then use those to spread it out over all the locs.
+ * key can be cyclic, so tree_len would need to check for cycles.
*/
s7_pointer p1 = cdr(key);
s7_int loc = 0;
- if (!is_sequence(car(key)))
+ if (!is_sequence_or_iterator(car(key)))
loc = hash_loc(sc, table, car(key)) + 1;
else
if ((is_pair(car(key))) &&
- (!is_sequence(caar(key))))
+ (!is_sequence_or_iterator(caar(key))))
loc = hash_loc(sc, table, caar(key)) + 1;
if (is_pair(p1))
{
- if (!is_sequence(car(p1)))
+ if (!is_sequence_or_iterator(car(p1)))
loc += hash_loc(sc, table, car(p1)) + 1;
else
if ((is_pair(car(p1))) &&
- (!is_sequence(caar(p1))))
+ (!is_sequence_or_iterator(caar(p1))))
loc += hash_loc(sc, table, caar(p1)) + 1;
}
- return((loc << 3) | (len_upto_8(key)));
+ else
+ if (!is_sequence_or_iterator(p1)) /* include () */
+ loc += hash_loc(sc, table, p1);
+ return((loc << 3) + len_upto_100(key));
}
static hash_entry_t *hash_closure(s7_scheme *sc, s7_pointer table, s7_pointer key)
@@ -44888,6 +45022,11 @@ static void init_hash_maps(void)
default_hash_map[T_FLOAT_VECTOR] = hash_map_float_vector;
default_hash_map[T_LET] = hash_map_let;
default_hash_map[T_PAIR] = hash_map_pair;
+ default_hash_map[T_C_POINTER] = hash_map_c_pointer;
+ default_hash_map[T_UNDEFINED] = hash_map_undefined;
+ default_hash_map[T_ITERATOR] = hash_map_iterator;
+ for (int32_t i = T_OUTPUT_PORT; i < NUM_TYPES; i++)
+ default_hash_map[i] = hash_map_eq;
default_hash_map[T_INTEGER] = hash_map_int;
default_hash_map[T_RATIO] = hash_map_ratio;
@@ -44908,7 +45047,8 @@ static void init_hash_maps(void)
char_ci_eq_hash_map[T_CHARACTER] = hash_map_ci_char;
#endif
- for (int32_t i = 0; i < NUM_TYPES; i++) equivalent_hash_map[i] = default_hash_map[i];
+ for (int32_t i = 0; i < NUM_TYPES; i++)
+ equivalent_hash_map[i] = default_hash_map[i];
equal_hash_checks[T_SYNTAX] = hash_equal_syntax;
equal_hash_checks[T_SYMBOL] = hash_equal_eq;
@@ -44925,14 +45065,21 @@ static void init_hash_maps(void)
default_hash_checks[T_CHARACTER] = hash_char;
}
+#if S7_DEBUGGING & (0)
+static s7_pointer hash_table_to_let(s7_scheme *sc, s7_pointer obj);
+#endif
+
static void resize_hash_table(s7_scheme *sc, s7_pointer table)
{
s7_int entries = hash_table_entries(table);
hash_entry_t **old_els = hash_table_elements(table);
s7_pointer dproc = hash_table_procedures(table); /* new block_t so we need to pass this across */
- s7_int old_size = hash_table_mask(table) + 1;
+ s7_int old_size = hash_table_size(table);
s7_int new_size = old_size * 4;
s7_int hash_mask = new_size - 1;
+#if S7_DEBUGGING & (0)
+ s7_pointer old_data = s7_gc_protect_via_stack(sc, slot_value(symbol_to_local_slot(sc, make_symbol(sc, "stats:0|1|2|n|max", 17), hash_table_to_let(sc, table))));
+#endif
block_t *np = (block_t *)callocate(sc, new_size * sizeof(hash_entry_t *));
hash_entry_t **new_els = (hash_entry_t **)(block_data(np));
@@ -44952,6 +45099,11 @@ static void resize_hash_table(s7_scheme *sc, s7_pointer table)
hash_table_mask(table) = hash_mask; /* was new_size - 1 14-Jun-21 */
hash_table_set_procedures(table, dproc);
hash_table_entries(table) = entries;
+#if S7_DEBUGGING & (0)
+ fprintf(stderr, "%s: %s -> ", __func__, display(old_data));
+ unstack_gc_protect(sc);
+ fprintf(stderr, "%s\n", display(slot_value(symbol_to_local_slot(sc, make_symbol(sc, "stats:0|1|2|n|max", 17), hash_table_to_let(sc, table)))));
+#endif
}
@@ -44999,6 +45151,14 @@ static bool op_implicit_hash_table_ref_a(s7_scheme *sc)
return(true);
}
+static s7_pointer fx_implicit_hash_table_ref_a(s7_scheme *sc, s7_pointer arg)
+{
+ s7_pointer s = lookup_checked(sc, car(arg));
+ if (!is_hash_table(s))
+ return(s7_apply_function(sc, s, list_1(sc, fx_call(sc, cdr(arg)))));
+ return(s7_hash_table_ref(sc, s, fx_call(sc, cdr(arg))));
+}
+
static bool op_implicit_hash_table_ref_aa(s7_scheme *sc)
{
s7_pointer in_obj, out_key;
@@ -45059,7 +45219,7 @@ static s7_pointer remove_from_hash_table(s7_scheme *sc, s7_pointer table, hash_e
static void cull_weak_hash_table(s7_scheme *sc, s7_pointer table)
{
- s7_int len = hash_table_mask(table) + 1;
+ s7_int len = hash_table_size(table);
hash_entry_t **entries = hash_table_elements(table);
for (s7_int i = 0; i < len; i++)
{
@@ -45371,7 +45531,7 @@ static s7_pointer hash_table_chooser(s7_scheme *sc, s7_pointer f, int32_t args,
static void check_old_hash(s7_scheme *sc, s7_pointer old_hash, s7_pointer new_hash, s7_int start, s7_int end)
{
s7_int count = 0;
- s7_int old_len = hash_table_mask(old_hash) + 1;
+ s7_int old_len = hash_table_size(old_hash);
hash_entry_t **old_lists = hash_table_elements(old_hash);
for (s7_int i = 0; i < old_len; i++)
for (hash_entry_t *x = old_lists[i]; x; x = hash_entry_next(x))
@@ -45391,7 +45551,7 @@ static s7_pointer hash_table_copy(s7_scheme *sc, s7_pointer old_hash, s7_pointer
if (is_typed_hash_table(new_hash))
check_old_hash(sc, old_hash, new_hash, start, end);
- old_len = hash_table_mask(old_hash) + 1;
+ old_len = hash_table_size(old_hash);
new_mask = hash_table_mask(new_hash);
old_lists = hash_table_elements(old_hash);
new_lists = hash_table_elements(new_hash);
@@ -45468,7 +45628,7 @@ static s7_pointer hash_table_fill(s7_scheme *sc, s7_pointer args)
if (hash_table_entries(table) > 0)
{
hash_entry_t **entries = hash_table_elements(table);
- s7_int len = hash_table_mask(table) + 1; /* minimum len is 2 (see s7_make_hash_table) */
+ s7_int len = hash_table_size(table); /* minimum len is 2 (see s7_make_hash_table) */
if (val == sc->F) /* hash-table-ref returns #f if it can't find a key, so val == #f here means empty the table */
{
hash_entry_t **hp = entries;
@@ -45520,7 +45680,7 @@ static s7_pointer hash_table_fill(s7_scheme *sc, s7_pointer args)
static s7_pointer hash_table_reverse(s7_scheme *sc, s7_pointer old_hash)
{
- s7_int len = hash_table_mask(old_hash) + 1;
+ s7_int len = hash_table_size(old_hash);
hash_entry_t **old_lists = hash_table_elements(old_hash);
s7_pointer new_hash = s7_make_hash_table(sc, len);
gc_protect_via_stack(sc, new_hash);
@@ -45699,7 +45859,12 @@ static s7_pointer let_to_function(s7_scheme *sc, s7_pointer e)
static s7_pointer g_function(s7_scheme *sc, s7_pointer args)
{
- #define H_function "(*function* e) returns the current function in e"
+ #define H_function "(*function* env field) returns the current function. (*function*) is like __func__ in C. \
+If 'env is specified, *function* looks for the current function in the environment 'e. If 'field (a symbol) is given \
+a function-specific value is returned. The fields are 'name (the name of the current function), 'signature, 'arity,\
+ 'documentation, 'value (the function itself), 'line and 'file (the function's definition location), 'funclet, 'source, \
+and 'arglist. (define (func x y) (*function* (curlet) 'arglist)) (func 1 2): '(x y)"
+
#define Q_function s7_make_signature(sc, 3, sc->T, sc->is_let_symbol, sc->is_symbol_symbol)
s7_pointer e, sym = NULL, fname, fval;
@@ -46714,6 +46879,16 @@ static bool op_implicit_c_object_ref_a(s7_scheme *sc)
return(true);
}
+static s7_pointer fx_implicit_c_object_ref_a(s7_scheme *sc, s7_pointer arg)
+{
+ s7_pointer c = lookup_checked(sc, car(arg));
+ if (!is_c_object(c))
+ return(s7_apply_function(sc, c, list_1(sc, fx_call(sc, cdr(arg)))));
+ set_car(sc->t2_2, fx_call(sc, cdr(arg)));
+ set_car(sc->t2_1, c); /* fx_call above might use sc->t2* */
+ return((*(c_object_ref(sc, c)))(sc, sc->t2_1));
+}
+
/* -------- dilambda -------- */
@@ -46920,7 +47095,7 @@ s7_pointer s7_arity(s7_scheme *sc, s7_pointer x)
static s7_pointer g_arity(s7_scheme *sc, s7_pointer args)
{
- #define H_arity "(arity obj) the min and max acceptable args for obj if it is applicable, otherwise #f."
+ #define H_arity "(arity obj) the min and max number of args that obj can be applied to. Returns #f if the object is not applicable."
#define Q_arity s7_make_signature(sc, 2, s7_make_signature(sc, 2, sc->is_pair_symbol, sc->not_symbol), sc->T)
/* check_method(sc, p, sc->arity_symbol, args); */
return(s7_arity(sc, car(args)));
@@ -47773,7 +47948,7 @@ static bool hash_table_equal_1(s7_scheme *sc, s7_pointer x, s7_pointer y, shared
return(false);
}
- len = hash_table_mask(x) + 1;
+ len = hash_table_size(x);
lists = hash_table_elements(x);
if (!nci) nci = clear_shared_info(sc->circle_info);
eqf = (equivalent) ? is_equivalent_1 : is_equal_1;
@@ -47846,7 +48021,7 @@ static bool let_equal_1(s7_scheme *sc, s7_pointer x, s7_pointer y, shared_info_t
shared_info_t *nci = ci;
int32_t x_len, y_len;
- if ((!is_let(y)) || (x == sc->rootlet) || (y == sc->rootlet))
+ if ((!is_let(y)) || (x == sc->rootlet) || (y == sc->rootlet)) /* (equal? (rootlet) (rootlet)) is checked in let_equal below */
return(false);
if ((ci) && (equal_ref(sc, x, y, ci))) return(true);
@@ -47862,7 +48037,7 @@ static bool let_equal_1(s7_scheme *sc, s7_pointer x, s7_pointer y, shared_info_t
for (ey = y; ey; ey = let_outlet(ey))
for (py = let_slots(ey); tis_slot(py); py = next_slot(py))
- if (!symbol_is_in_list(sc, slot_symbol(py))) /* symbol in y, not in x */
+ if (!symbol_is_in_list(sc, slot_symbol(py))) /* symbol in y, not in x */
return(false);
for (y_len = 0, ey = y; ey; ey = let_outlet(ey))
@@ -48799,7 +48974,7 @@ static s7_pointer nil_length(s7_scheme *sc, s7_pointer lst) {return(int_zero);}
static s7_pointer v_length(s7_scheme *sc, s7_pointer v) {return(make_integer(sc, vector_length(v)));}
static s7_pointer str_length(s7_scheme *sc, s7_pointer v) {return(make_integer(sc, string_length(v)));}
static s7_pointer bv_length(s7_scheme *sc, s7_pointer v) {return(make_integer(sc, byte_vector_length(v)));}
-static s7_pointer h_length(s7_scheme *sc, s7_pointer lst) {return(make_integer(sc, hash_table_mask(lst) + 1));}
+static s7_pointer h_length(s7_scheme *sc, s7_pointer lst) {return(make_integer(sc, hash_table_size(lst)));}
static s7_pointer iter_length(s7_scheme *sc, s7_pointer lst) {return(s7_length(sc, iterator_sequence(lst)));}
static s7_pointer c_obj_length(s7_scheme *sc, s7_pointer lst)
@@ -48955,7 +49130,7 @@ static s7_pointer hash_table_setter(s7_scheme *sc, s7_pointer e, s7_int loc, s7_
static s7_pointer copy_hash_table(s7_scheme *sc, s7_pointer source)
{
- s7_pointer new_hash = s7_make_hash_table(sc, hash_table_mask(source) + 1);
+ s7_pointer new_hash = s7_make_hash_table(sc, hash_table_size(source));
gc_protect_via_stack(sc, new_hash);
hash_table_checker(new_hash) = hash_table_checker(source);
if (hash_chosen(source)) hash_set_chosen(new_hash);
@@ -50702,6 +50877,31 @@ static s7_pointer vector_to_let(s7_scheme *sc, s7_pointer obj)
}
if (is_typed_t_vector(obj))
s7_varlet(sc, let, sc->signature_symbol, g_signature(sc, set_plist_1(sc, obj)));
+
+#if S7_DEBUGGING
+ if ((is_t_vector(obj)) && (is_symbol_table(obj))) /* (object->let (symbol-table)) */
+ {
+ s7_int max_len = 0, zeros = 0, ones = 0, twos = 0, biggies = 0;
+ for (s7_int i = 0; i < SYMBOL_TABLE_SIZE; i++)
+ {
+ s7_int j;
+ s7_pointer p;
+ for (p = vector_element(sc->symbol_table, i), j = 0; is_pair(p); p = cdr(p), j++);
+ if (j == 0) zeros++; else
+ if (j == 1) ones++; else
+ if (j == 2) twos++; else
+ biggies++;
+ if (j > max_len) max_len = j;
+ }
+ s7_varlet(sc, let, make_symbol(sc, "stats:0|1|2|n|max", 17),
+ cons(sc, make_integer(sc, zeros),
+ cons(sc, make_integer(sc, ones),
+ cons(sc, make_integer(sc, twos),
+ cons(sc, make_integer(sc, biggies),
+ cons(sc, make_integer(sc, max_len), sc->nil))))));
+ }
+#endif
+
unstack_gc_protect(sc);
return(let);
}
@@ -50779,6 +50979,31 @@ static s7_pointer hash_table_to_let(s7_scheme *sc, s7_pointer obj)
sc->hash_table_signature);
}
else hash_table_checker_to_let(sc, let, obj);
+
+#if S7_DEBUGGING
+ if (hash_table_entries(obj) > 0)
+ {
+ s7_int max_len = 0, zeros = 0, ones = 0, twos = 0, biggies = 0, hash_len = hash_table_size(obj);
+ for (s7_int i = 0; i < hash_len; i++)
+ {
+ hash_entry_t *p;
+ s7_int j;
+ for (p = hash_table_element(obj, i), j = 0; p; p = hash_entry_next(p), j++);
+ if (j == 0) zeros++; else
+ if (j == 1) ones++; else
+ if (j == 2) twos++; else
+ biggies++;
+ if (j > max_len) max_len = j;
+ }
+ s7_varlet(sc, let, make_symbol(sc, "stats:0|1|2|n|max", 17),
+ cons(sc, make_integer(sc, zeros),
+ cons(sc, make_integer(sc, ones),
+ cons(sc, make_integer(sc, twos),
+ cons(sc, make_integer(sc, biggies),
+ cons(sc, make_integer(sc, max_len), sc->nil))))));
+ }
+#endif
+
s7_gc_unprotect_at(sc, gc_loc);
return(let);
}
@@ -51813,7 +52038,7 @@ s7_pointer s7_call_with_catch(s7_scheme *sc, s7_pointer tag, s7_pointer body, s7
if (sc->stack_end == sc->stack_start) /* no stack! */
push_stack_direct(sc, OP_EVAL_DONE);
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s[%d]\n", __func__, __LINE__);
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]\n", __func__, __LINE__);
new_cell(sc, p, T_CATCH);
catch_tag(p) = tag;
catch_goto_loc(p) = stack_top(sc);
@@ -53145,7 +53370,7 @@ static s7_pointer apply_method_closure(s7_scheme *sc, s7_pointer func, s7_pointe
return(sc->value);
}
-static inline s7_pointer apply_c_function(s7_scheme *sc, s7_pointer func, s7_pointer args);
+static s7_pointer apply_c_function_unopt(s7_scheme *sc, s7_pointer func, s7_pointer args);
static s7_pointer implicit_index_checked(s7_scheme *sc, s7_pointer obj, s7_pointer in_obj, s7_pointer indices)
{
@@ -53233,7 +53458,7 @@ static s7_pointer implicit_index(s7_scheme *sc, s7_pointer obj, s7_pointer indic
return(sc->value);
case T_C_FUNCTION:
- return(apply_c_function(sc, obj, indices));
+ return(apply_c_function_unopt(sc, obj, indices));
case T_C_RST_NO_REQ_FUNCTION:
return(c_function_call(obj)(sc, indices));
@@ -53661,7 +53886,7 @@ s7_pointer s7_type_of(s7_scheme *sc, s7_pointer arg) {return(sc->type_to_typers[
static s7_pointer g_type_of(s7_scheme *sc, s7_pointer args)
{
- #define H_type_of "(type-of obj) returns a symbol describing obj's type"
+ #define H_type_of "(type-of obj) returns a symbol describing obj's type: (type-of 1): 'integer?"
#define Q_type_of s7_make_signature(sc, 2, s7_make_signature(sc, 2, sc->is_symbol_symbol, sc->not_symbol), sc->T)
return(sc->type_to_typers[type(car(args))]);
}
@@ -53865,7 +54090,7 @@ static s7_pointer fx_v(s7_scheme *sc, s7_pointer arg) {return(v_lookup(sc, T_Sym
static s7_pointer fx_T(s7_scheme *sc, s7_pointer arg) {return(T_lookup(sc, T_Sym(arg), arg));}
static s7_pointer fx_U(s7_scheme *sc, s7_pointer arg) {return(U_lookup(sc, T_Sym(arg), arg));}
static s7_pointer fx_V(s7_scheme *sc, s7_pointer arg) {return(V_lookup(sc, T_Sym(arg), arg));}
-static s7_pointer fx_c_nc(s7_scheme *sc, s7_pointer arg) {return(fc_call(sc, arg));}
+static s7_pointer fx_c_nc(s7_scheme *sc, s7_pointer arg) {return(fn_call(sc, arg));}
static s7_pointer fx_c_0c(s7_scheme *sc, s7_pointer arg) {return(fn_proc(arg)(sc, sc->nil));}
static s7_pointer fx_cons_cc(s7_scheme *sc, s7_pointer arg) {return(cons(sc, cadr(arg), caddr(arg)));}
static s7_pointer fx_curlet(s7_scheme *sc, s7_pointer arg) {return(s7_curlet(sc));}
@@ -54379,7 +54604,7 @@ static s7_pointer fx_num_eq_length_i(s7_scheme *sc, s7_pointer arg)
case T_PAIR: return(make_boolean(sc, s7_list_length(sc, val) == ilen));
case T_NIL: return(make_boolean(sc, ilen == 0));
case T_STRING: return(make_boolean(sc, string_length(val) == ilen));
- case T_HASH_TABLE: return(make_boolean(sc, (hash_table_mask(val) + 1) == ilen));
+ case T_HASH_TABLE: return(make_boolean(sc, (hash_table_size(val)) == ilen));
case T_C_OBJECT: return(make_boolean(sc, c_object_length_to_int(sc, val) == ilen));
case T_LET: return(make_boolean(sc, let_length(sc, val) == ilen));
@@ -54415,7 +54640,7 @@ static s7_pointer fx_less_length_i(s7_scheme *sc, s7_pointer arg)
case T_PAIR: return(make_boolean(sc, s7_list_length(sc, val) < ilen));
case T_NIL: return(make_boolean(sc, ilen > 0));
case T_STRING: return(make_boolean(sc, string_length(val) < ilen));
- case T_HASH_TABLE: return(make_boolean(sc, (hash_table_mask(val) + 1) < ilen)); /* was <=? -- changed 15-Dec-15, then again 6-Jan-17: mask is len-1 */
+ case T_HASH_TABLE: return(make_boolean(sc, (hash_table_size(val)) < ilen)); /* was <=? -- changed 15-Dec-15, then again 6-Jan-17: mask is len-1 */
case T_C_OBJECT: return(make_boolean(sc, c_object_length_to_int(sc, val) < ilen));
case T_LET: return(make_boolean(sc, let_length(sc, val) < ilen)); /* this works because let_length handles the length method itself! */
@@ -54910,7 +55135,7 @@ static s7_pointer fx_hash_table_increment(s7_scheme *sc, s7_pointer arg)
}
-static s7_pointer fx_lint_let_ref_s(s7_scheme *sc, s7_pointer arg)
+static s7_pointer fx_simple_let_ref_s(s7_scheme *sc, s7_pointer arg)
{
s7_pointer sym;
s7_pointer lt = s_lookup(sc, opt2_sym(arg), arg); /* (var-ref local-var) -> local-var, opt_sym2(arg) == cadr(arg) */
@@ -54923,7 +55148,7 @@ static s7_pointer fx_lint_let_ref_s(s7_scheme *sc, s7_pointer arg)
for (s7_pointer y = let_slots(lt); tis_slot(y); y = next_slot(y))
if (slot_symbol(y) == sym)
return(slot_value(y));
- return(lint_let_ref_p_pp(sc, let_outlet(lt), sym));
+ return(let_ref_p_pp(sc, let_outlet(lt), sym));
}
static s7_pointer fx_memq_sq_2(s7_scheme *sc, s7_pointer arg)
@@ -55046,7 +55271,7 @@ fx_c_ssc_any(fx_c_tuc, t_lookup, u_lookup)
static s7_pointer fx_c_opncq(s7_scheme *sc, s7_pointer arg)
{
- return(fn_proc(arg)(sc, with_list_t1(fc_call(sc, cadr(arg)))));
+ return(fn_proc(arg)(sc, with_list_t1(fn_call(sc, cadr(arg)))));
}
#define fx_c_opsq_any(Name, Lookup) \
@@ -57705,11 +57930,11 @@ static s7_function fx_choose(s7_scheme *sc, s7_pointer holder, s7_pointer cur_en
}
if (optimize_op(body) == HOP_SAFE_C_opSq_C)
{
- if ((fn_proc(body) == g_lint_let_ref) &&
+ if ((fn_proc(body) == g_simple_let_ref) &&
(cadadr(body) == car(closure_args(opt1_lambda(arg)))))
{
set_opt2_sym(cdr(arg), cadaddr(body));
- return(fx_lint_let_ref_s); /* (var-ref local-var) -> (let-ref (cdr v=local_var) 'ref) */
+ return(fx_simple_let_ref_s); /* (var-ref local-var) -> (let-ref (cdr v=local_var) 'ref) */
}}}
return((fx_proc(closure_body(opt1_lambda(arg))) == fx_sqr_t) ? fx_safe_closure_s_sqr : fx_safe_closure_s_a);
}
@@ -57748,7 +57973,8 @@ static s7_function fx_choose(s7_scheme *sc, s7_pointer holder, s7_pointer cur_en
/* fall through */
default:
- /* if ((!fx_function[optimize_op(arg)]) && (is_h_optimized(arg))) fprintf(stderr, "fx_choose %s %s\n", op_names[optimize_op(arg)], display(arg)); */
+ /* if ((S7_DEBUGGING) && (!fx_function[optimize_op(arg)]) && (is_h_optimized(arg))) fprintf(stderr, "fx_choose %s %s\n", op_names[optimize_op(arg)], display(arg)); */
+ /* this includes unsafe c funcs (hop_c_a) and p-arg safe funcs (hop_safe_c_p) -- name needs "safe" and no "p" */
return(fx_function[optimize_op(arg)]);
}} /* is_optimized */
@@ -58350,7 +58576,7 @@ static bool fx_tree_in(s7_scheme *sc, s7_pointer tree, s7_pointer var1, s7_point
if (fx_proc(tree) == fx_is_eq_car_sq) return(with_fx(tree, fx_is_eq_car_tq));
if ((fx_proc(tree) == fx_c_opsq_c) || (fx_proc(tree) == fx_c_optq_c))
{
- if (fn_proc(p) != g_lint_let_ref) /* don't step on opt3_sym */
+ if (fn_proc(p) != g_simple_let_ref) /* don't step on opt3_sym */
{
if ((is_global_and_has_func(car(p), s7_p_pp_function)) &&
(is_global_and_has_func(caadr(p), s7_p_p_function)))
@@ -63484,9 +63710,9 @@ static s7_pointer opt_p_pi_ss_fvref_direct(opt_info *o) {return(float_vector_ref
static s7_pointer opt_p_pi_ss_ivref_direct(opt_info *o) {return(int_vector_ref_p_pi_direct(o->sc, slot_value(o->v[1].p), integer(slot_value(o->v[2].p))));}
static s7_pointer opt_p_pi_ss_fvref_direct_wrapped(opt_info *o) {return(float_vector_ref_p_pi_direct_wrapped(o->sc, slot_value(o->v[1].p), integer(slot_value(o->v[2].p))));}
static s7_pointer opt_p_pi_ss_ivref_direct_wrapped(opt_info *o) {return(int_vector_ref_p_pi_direct_wrapped(o->sc, slot_value(o->v[1].p), integer(slot_value(o->v[2].p))));}
-static s7_pointer opt_p_pi_ss_lref(opt_info *o) {return(list_ref_p_pi_unchecked(o->sc, slot_value(o->v[1].p), integer(slot_value(o->v[2].p))));}
+static s7_pointer opt_p_pi_ss_pref(opt_info *o) {return(list_ref_p_pi_unchecked(o->sc, slot_value(o->v[1].p), integer(slot_value(o->v[2].p))));}
static s7_pointer opt_p_pi_sc(opt_info *o) {return(o->v[3].p_pi_f(o->sc, slot_value(o->v[1].p), o->v[2].i));}
-static s7_pointer opt_p_pi_sc_lref(opt_info *o) {return(list_ref_p_pi_unchecked(o->sc, slot_value(o->v[1].p), o->v[2].i));}
+static s7_pointer opt_p_pi_sc_pref(opt_info *o) {return(list_ref_p_pi_unchecked(o->sc, slot_value(o->v[1].p), o->v[2].i));}
static s7_pointer opt_p_pi_sf(opt_info *o) {return(o->v[3].p_pi_f(o->sc, slot_value(o->v[1].p), o->v[5].fi(o->v[4].o1)));}
static s7_pointer opt_p_pi_sf_sref(opt_info *o) {return(string_ref_p_pi_unchecked(o->sc, slot_value(o->v[1].p), o->v[5].fi(o->v[4].o1)));}
static s7_pointer opt_p_pi_sf_sref_direct(opt_info *o) {return(string_ref_p_pi_direct(o->sc, slot_value(o->v[1].p), o->v[5].fi(o->v[4].o1)));}
@@ -63547,7 +63773,7 @@ static void fixup_p_pi_ss(opt_info *opc)
((opc->v[3].p_pi_f == float_vector_ref_p_pi_direct) ? opt_p_pi_ss_fvref_direct :
((opc->v[3].p_pi_f == int_vector_ref_p_pi_direct) ? opt_p_pi_ss_ivref_direct :
((opc->v[3].p_pi_f == t_vector_ref_p_pi_direct) ? opt_p_pi_ss_vref_direct :
- ((opc->v[3].p_pi_f == list_ref_p_pi_unchecked) ? opt_p_pi_ss_lref : opt_p_pi_ss))))));
+ ((opc->v[3].p_pi_f == list_ref_p_pi_unchecked) ? opt_p_pi_ss_pref : opt_p_pi_ss))))));
}
static bool p_pi_ok(s7_scheme *sc, opt_info *opc, s7_pointer s_func, s7_pointer sig, s7_pointer car_x)
@@ -63598,7 +63824,7 @@ static bool p_pi_ok(s7_scheme *sc, opt_info *opc, s7_pointer s_func, s7_pointer
if (is_t_integer(caddr(car_x)))
{
opc->v[2].i = integer(caddr(car_x));
- opc->v[0].fp = (opc->v[3].p_pi_f == list_ref_p_pi_unchecked) ? opt_p_pi_sc_lref : opt_p_pi_sc;
+ opc->v[0].fp = (opc->v[3].p_pi_f == list_ref_p_pi_unchecked) ? opt_p_pi_sc_pref : opt_p_pi_sc;
return_true(sc, car_x);
}
o1 = sc->opts[sc->pc];
@@ -63654,6 +63880,22 @@ static s7_pointer opt_p_pp_fs_cons(opt_info *o) {return(cons(o->sc, o->v[5].fp(o
static s7_pointer opt_p_pp_fs_add(opt_info *o) {return(add_p_pp(o->sc, o->v[5].fp(o->v[4].o1), slot_value(o->v[1].p)));}
static s7_pointer opt_p_pp_fs_sub(opt_info *o) {return(subtract_p_pp(o->sc, o->v[5].fp(o->v[4].o1), slot_value(o->v[1].p)));}
+static s7_pointer opt_p_pp_ss_lref(opt_info *o)
+{
+ s7_pointer sym = slot_value(o->v[2].p);
+ if (is_symbol(sym))
+ return(let_ref_p_pp(o->sc, slot_value(o->v[1].p), (is_keyword(sym)) ? keyword_symbol(sym) : sym));
+ return(let_ref(o->sc, slot_value(o->v[1].p), sym));
+}
+
+static s7_pointer opt_p_pp_sf_lref(opt_info *o)
+{
+ s7_pointer sym = o->v[5].fp(o->v[4].o1);
+ if (is_symbol(sym))
+ return(let_ref_p_pp(o->sc, slot_value(o->v[1].p), (is_keyword(sym)) ? keyword_symbol(sym) : sym));
+ return(let_ref(o->sc, slot_value(o->v[1].p), sym));
+}
+
static s7_pointer opt_p_pp_ff(opt_info *o)
{
s7_scheme *sc = o->sc;
@@ -63714,21 +63956,22 @@ static bool p_pp_ok(s7_scheme *sc, opt_info *opc, s7_pointer s_func, s7_pointer
opc->v[3].p_pp_f = func;
if (is_symbol(cadr(car_x)))
{
+ s7_pointer obj;
slot = opt_simple_symbol(sc, cadr(car_x));
if (!slot)
{
sc->pc = pstart;
return_false(sc, car_x);
}
- if ((is_any_vector(slot_value(slot))) &&
- (vector_rank(slot_value(slot)) > 1))
+ obj = slot_value(slot);
+ if ((is_any_vector(obj)) && (vector_rank(obj) > 1))
{
sc->pc = pstart;
return_false(sc, car_x);
}
opc->v[1].p = slot;
- if ((func == hash_table_ref_p_pp) && (is_hash_table(slot_value(slot))))
+ if ((func == hash_table_ref_p_pp) && (is_hash_table(obj)))
opc->v[3].p_pp_f = s7_hash_table_ref;
if (is_symbol(caddr(car_x)))
@@ -63736,7 +63979,9 @@ static bool p_pp_ok(s7_scheme *sc, opt_info *opc, s7_pointer s_func, s7_pointer
opc->v[2].p = opt_simple_symbol(sc, caddr(car_x));
if (opc->v[2].p)
{
- opc->v[0].fp = (func == set_car_p_pp) ? opt_set_car_pp_ss : ((opc->v[3].p_pp_f == s7_hash_table_ref) ? opt_p_pp_ss_href : opt_p_pp_ss);
+ opc->v[0].fp = (func == set_car_p_pp) ? opt_set_car_pp_ss :
+ (((is_hash_table(obj)) && (func == hash_table_ref_p_pp)) ? opt_p_pp_ss_href :
+ (((is_let(obj)) && (func == let_ref)) ? opt_p_pp_ss_lref : opt_p_pp_ss));
return_true(sc, car_x);
}
sc->pc = pstart;
@@ -63753,7 +63998,8 @@ static bool p_pp_ok(s7_scheme *sc, opt_info *opc, s7_pointer s_func, s7_pointer
{
opc->v[0].fp = (func == add_p_pp) ? opt_p_pp_sf_add : ((func == subtract_p_pp) ? opt_p_pp_sf_sub : ((func == multiply_p_pp) ? opt_p_pp_sf_mul :
((func == set_car_p_pp) ? opt_p_pp_sf_set_car : ((func == set_cdr_p_pp) ? opt_p_pp_sf_set_cdr :
- ((opc->v[3].p_pp_f == s7_hash_table_ref) ? opt_p_pp_sf_href : opt_p_pp_sf)))));
+ (((is_hash_table(obj)) && (opc->v[3].p_pp_f == s7_hash_table_ref)) ? opt_p_pp_sf_href :
+ (((is_let(obj)) && (opc->v[3].p_pp_f == let_ref)) ? opt_p_pp_sf_lref : opt_p_pp_sf))))));
opc->v[4].o1 = sc->opts[pstart];
opc->v[5].fp = sc->opts[pstart]->v[0].fp;
if (opc->v[5].fp == opt_p_pi_ss_ivref_direct) opc->v[5].fp = opt_p_pi_ss_ivref_direct_wrapped;
@@ -64006,7 +64252,7 @@ static bool p_pip_ssf_combinable(s7_scheme *sc, opt_info *opc, int32_t start)
if ((o1->v[0].fp == opt_p_pi_ss) || (o1->v[0].fp == opt_p_pi_ss_sref) || (o1->v[0].fp == opt_p_pi_ss_vref) ||
(o1->v[0].fp == opt_p_pi_ss_sref_direct) || (o1->v[0].fp == opt_p_pi_ss_vref_direct) ||
(o1->v[0].fp == opt_p_pi_ss_fvref_direct) || (o1->v[0].fp == opt_p_pi_ss_ivref_direct) ||
- (o1->v[0].fp == opt_p_pi_ss_lref))
+ (o1->v[0].fp == opt_p_pi_ss_pref))
{
opc->v[5].p_pip_f = opc->v[3].p_pip_f;
opc->v[6].p_pi_f = o1->v[3].p_pi_f;
@@ -64718,7 +64964,7 @@ static bool p_implicit_ok(s7_scheme *sc, s7_pointer s_slot, s7_pointer car_x, in
opt_info *opc;
int32_t start;
- if ((!is_sequence(obj)) || (len < 2))
+ if ((!is_simple_sequence(obj)) || (len < 2)) /* was is_sequence? */
return_false(sc, car_x);
opc = alloc_opt_info(sc);
@@ -64769,7 +65015,9 @@ static bool p_implicit_ok(s7_scheme *sc, s7_pointer s_slot, s7_pointer car_x, in
fixup_p_pi_ss(opc);
return_true(sc, car_x);
}
- opc->v[0].fp = opt_p_pp_ss;
+ opc->v[0].fp = ((is_hash_table(obj)) && (opc->v[3].p_pp_f == s7_hash_table_ref)) ? opt_p_pp_ss_href :
+ (((is_let(obj)) && (opc->v[3].p_pp_f == let_ref)) ? opt_p_pp_ss_lref : opt_p_pp_ss);
+ /* if (opc->v[0].fp != opt_p_pp_ss) abort(); */
return_true(sc, car_x);
}}
else
@@ -64793,8 +65041,9 @@ static bool p_implicit_ok(s7_scheme *sc, s7_pointer s_slot, s7_pointer car_x, in
return_true(sc, car_x);
}
if (cell_optimize(sc, cdr(car_x)))
- {
- opc->v[0].fp = opt_p_pp_sf;
+ { /* need both type check and func check! (hash-table-ref or 123) */
+ opc->v[0].fp = ((is_hash_table(obj)) && (opc->v[3].p_pp_f == s7_hash_table_ref)) ? opt_p_pp_sf_href :
+ (((is_let(obj)) && (opc->v[3].p_pp_f == let_ref)) ? opt_p_pp_sf_lref : opt_p_pp_sf);
opc->v[4].o1 = sc->opts[start];
opc->v[5].fp = sc->opts[start]->v[0].fp;
return_true(sc, car_x);
@@ -64855,7 +65104,7 @@ static bool p_implicit_ok(s7_scheme *sc, s7_pointer s_slot, s7_pointer car_x, in
* what the implicit call will do, and in the opt_* context, everything must be "safe" (i.e. no defines or
* hidden multiple-values, etc).
*/
- if ((!is_any_vector(obj)) || (vector_rank(obj) != (len - 1))) return_false(sc, car_x);
+ if ((!is_any_vector(obj)) || (vector_rank(obj) != (len - 1))) return_false(sc, car_x); /* (* i (P2 1 1)) in timp.scm where P2 is a list */
opc->v[0].fp = opt_p_call_any;
switch (type(obj)) /* string can't happen here (no multidimensional strings), for pair/hash/let see above */
{
@@ -64914,9 +65163,9 @@ static s7_pointer opt_set_p_i_f(opt_info *o)
return(x);
}
/* here and below (opt_set_p_d_f), the mutable versions are not safe, and are very tricky to make safe. First if a variable is set twice,
- * in the body, as in (do (...) (... (set! buffix (+ 1 buffix)) (if (>= buffix fftsize) (set! buffix 0)))) from pvoc.scm,
- * if the first set! is opt_set_p_i_fm (buffix is assumed mutable), the second sets it to built-in immutable zero, so the next time around loop,
- * the set_integer is direct so now built-in 0 == 128 (yet still prints itself as "0"). Also if a mutable variable is stored,
+ * in the body, as in (do (...) (... (set! buffix (+ 1 buffix)) (if (>= buffix fftsize) (set! buffix 0)))) from pvoc.scm,
+ * if the first set! is opt_set_p_i_fm (buffix is assumed mutable), the second sets it to built-in immutable zero, so the next time around loop,
+ * the set_integer is direct so now built-in 0 == 128 (yet still prints itself as "0"). Also if a mutable variable is stored,
* (define (f2) (let ((v (vector 0 0 0)) (y 1.0)) (do ((i 0 (+ i 1))) ((= i 3) v) (set! y (+ y 1.0)) (vector-set! v i y))))
* (f2) -> #(4.0 4.0 4.0). Maybe safe if body has just one statement?
*/
@@ -67576,14 +67825,43 @@ static bool cell_optimize_1(s7_scheme *sc, s7_pointer expr)
s_func = slot_value(s_slot);
}
else
- if (is_c_function(head))
+ if (is_c_function(head)) /* (#_abs -1) I think */
s_func = head;
else
- {
+ { /* ((let-ref L 'mult) 1 2) or 'a etc */
+ /* fprintf(stderr, "%d: car_x: %s, head: %s\n", __LINE__, display(car_x), display(head)); */
if ((head == sc->quote_function) &&
((is_pair(cdr(car_x))) && (is_null(cddr(car_x)))))
return(opt_cell_quote(sc, car_x));
- return_false(sc, car_x);
+
+ /* if head is ([let-ref] L 'multiply), it should be accessible now, so we could do the lookup, set up s_func and go on */
+ if (is_pair(head))
+ {
+ s7_pointer let, slot, sym;
+ if ((car(head) == sc->let_ref_symbol) && (s7_list_length(sc, head) == 3))
+ {
+ let = cadr(head);
+ sym = caddr(head);
+ }
+ else
+ if (s7_list_length(sc, head) == 2)
+ {
+ let = car(head);
+ sym = cadr(head);
+ }
+ else return_false(sc, car_x);
+ if ((is_symbol(let)) && ((is_symbol_and_keyword(sym)) || (is_quoted_symbol(sym))))
+ {
+ slot = s7_slot(sc, let);
+ if (!is_slot(slot)) return_false(sc, car_x);
+ let = slot_value(slot);
+ if ((!is_let(let)) || (has_let_ref_fallback(let))) return_false(sc, car_x);
+ sym = (is_pair(sym)) ? cadr(sym) : keyword_symbol(sym);
+ s_func = let_ref_p_pp(sc, let, sym);
+ }
+ else return_false(sc, car_x);
+ }
+ else return_false(sc, car_x);
}
if (is_c_function(s_func))
{
@@ -69172,16 +69450,230 @@ static Inline void inline_op_map_gather(s7_scheme *sc) /* called thrice in eval,
/* -------------------------------- multiple-values -------------------------------- */
+
#define stack_top4_op(Sc) ((opcode_t)T_Op(Sc->stack_end[-5])) /* top4 == top - 4 */
#define stack_top4_args(Sc) (Sc->stack_end[-6])
/* #define stack_top4_let(Sc) (Sc->stack_end[-7]) */
/* #define stack_top4_code(Sc) (Sc->stack_end[-8]) */
+static void apply_c_rst_no_req_function(s7_scheme *sc);
+
+static s7_pointer op_safe_c_p_mv(s7_scheme *sc, s7_pointer args)
+{
+ s7_pointer p;
+ bool use_safe = false;
+ sc->value = args;
+ pop_stack_no_op(sc);
+ p = cddr(sc->value);
+ if (is_null(p))
+ sc->args = set_plist_2(sc, car(sc->value), cadr(sc->value));
+ else
+ if (is_null(cdr(p)))
+ sc->args = set_plist_3(sc, car(sc->value), cadr(sc->value), car(p));
+ else
+ {
+ s7_pointer lst;
+ s7_int len = proper_list_length(p) + 2;
+ sc->args = safe_list_if_possible(sc, len);
+ use_safe = (!in_heap(sc->args));
+ lst = sc->args;
+ for (s7_pointer p = sc->value; is_pair(p); p = cdr(p), lst = cdr(lst)) set_car(lst, car(p));
+ }
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ if (use_safe) clear_list_in_use(sc->args);
+ return(sc->value);
+}
+
+static s7_pointer op_safe_c_pc_mv(s7_scheme *sc, s7_pointer args)
+{
+ /* sc->value = mv vals from e.g. safe_c_pc_1 below, fn_proc = splice_in_values via values chooser synonym sc->values_uncopied */
+ /* sc->args is the trailing constant arg (the "c" in "pc") */
+ s7_pointer p;
+ bool use_safe = false;
+ sc->value = args;
+ pop_stack_no_op(sc);
+ p = cddr(sc->value);
+ if (is_null(p))
+ sc->args = set_plist_3(sc, car(sc->value), cadr(sc->value), sc->args);
+ else
+ {
+ if (is_null(cdr(p)))
+ sc->args = set_plist_4(sc, car(sc->value), cadr(sc->value), car(p), sc->args);
+ else /* sc->args = pair_append(sc, sc->value, list_1(sc, sc->args)); */ /* not plist! sc->value is not reusable */
+ {
+ s7_pointer lst, val = sc->args;
+ s7_int len = proper_list_length(p);
+ sc->args = safe_list_if_possible(sc, len + 3);
+ use_safe = (!in_heap(sc->args));
+ lst = sc->args;
+ for (s7_pointer p = sc->value; is_pair(p); p = cdr(p), lst = cdr(lst)) set_car(lst, car(p));
+ set_car(lst, val);
+ }}
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ if (use_safe) clear_list_in_use(sc->args);
+ return(sc->value);
+}
+
+static s7_pointer op_safe_c_ps_mv(s7_scheme *sc, s7_pointer args) /* (define (hi a) (+ (values 1 2) a)) from safe_c_ps_1 */
+{
+ /* old form: sc->args = pair_append(sc, sc->value, list_1(sc, lookup(sc, caddr(sc->code)))); */ /* don't assume sc->value can be used as sc->args here! */
+ s7_pointer p, val;
+ bool use_safe = false;
+ sc->value = args;
+ pop_stack_no_op(sc);
+ p = cddr(sc->value);
+ val = lookup(sc, caddr(sc->code));
+ if (is_null(p))
+ sc->args = set_plist_3(sc, car(sc->value), cadr(sc->value), val);
+ else
+ {
+ if (is_null(cdr(p)))
+ sc->args = set_plist_4(sc, car(sc->value), cadr(sc->value), car(p), val);
+ else /* sc->args = pair_append(sc, sc->value, list_1(sc, val)); */
+ {
+ s7_pointer lst;
+ s7_int len = proper_list_length(p);
+ sc->args = safe_list_if_possible(sc, len + 3); /* sc->args is not clobbered by fx_call (below) */
+ use_safe = (!in_heap(sc->args));
+ lst = sc->args;
+ for (s7_pointer p = sc->value; is_pair(p); p = cdr(p), lst = cdr(lst)) set_car(lst, car(p));
+ set_car(lst, val);
+ }}
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ if (use_safe) clear_list_in_use(sc->args);
+ return(sc->value);
+}
+
+static s7_pointer op_safe_c_pa_mv(s7_scheme *sc, s7_pointer args)
+{ /* (let () (define (func) (do ((x 0.0 (+ x 0.1)) (i 0 (+ i 1))) ((>= x 0.1) (#_with-baffle (inlet (values 1 2) (symbol? x)))))) (func)) */
+ s7_pointer p;
+ bool use_safe = false;
+ sc->value = args;
+ pop_stack_no_op(sc);
+ p = cddr(sc->value);
+ if (is_null(p))
+ {
+ s7_pointer val1 = car(sc->value), val2 = cadr(sc->value);
+ s7_pointer val3 = fx_call(sc, cddr(sc->code)); /* is plist3 ever clobbered by fx_call? plist_1|2 are set */
+ sc->args = set_plist_3(sc, val1, val2, val3);
+ }
+ else
+ {
+ if (is_null(cdr(p)))
+ {
+ s7_pointer val1 = car(sc->value), val2 = cadr(sc->value), val3 = car(p);
+ s7_pointer val4 = fx_call(sc, cddr(sc->code));
+ sc->args = set_plist_4(sc, val1, val2, val3, val4);
+ }
+ else
+ {
+ s7_pointer lst;
+ s7_int len = proper_list_length(p);
+ sc->args = safe_list_if_possible(sc, len + 3); /* sc->args is not clobbered by fx_call (below) */
+ use_safe = (!in_heap(sc->args));
+ lst = sc->args;
+ for (s7_pointer p = sc->value; is_pair(p); p = cdr(p), lst = cdr(lst)) set_car(lst, car(p));
+ set_car(lst, fx_call(sc, cddr(sc->code)));
+ }}
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ if (use_safe) clear_list_in_use(sc->args);
+ return(sc->value);
+}
+
+static s7_pointer op_safe_c_sp_mv(s7_scheme *sc, s7_pointer args)
+{ /* (let () (define (ho a) (+ a 2)) (define (hi) (+ (ho 1) (values 3 4))) (hi)) safe_add_sp_1 */
+ s7_pointer p;
+ sc->value = args;
+ clear_multiple_value(args); /* see op_safe_c_sp_mv in s7test */
+ pop_stack_no_op(sc);
+ p = cddr(sc->value);
+ if (is_null(p))
+ sc->args = set_plist_3(sc, sc->args, car(sc->value), cadr(sc->value));
+ else
+ if (is_null(cdr(p)))
+ sc->args = set_plist_4(sc, sc->args, car(sc->value), cadr(sc->value), car(p));
+ else sc->args = cons(sc, sc->args, sc->value); /* not ulist */
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ return(sc->value);
+}
+
+static s7_pointer op_safe_c_ssp_mv(s7_scheme *sc, s7_pointer args) /*sc->code: (+ pi pi (values 1 2)) sc->value: '(1 2) */
+{
+ sc->value = args;
+ pop_stack_no_op(sc);
+ if (is_null(cddr(sc->value)))
+ sc->args = set_plist_4(sc, lookup(sc, cadr(sc->code)), lookup(sc, caddr(sc->code)), car(sc->value), cadr(sc->value));
+ else sc->args = cons_unchecked(sc, lookup(sc, cadr(sc->code)), cons(sc, lookup(sc, caddr(sc->code)), sc->value)); /* not ulist here */
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ return(sc->value);
+}
+
+static s7_pointer op_c_p_mv(s7_scheme *sc, s7_pointer args) /* (values (values 1 2)) or (apply (values + '(2))) */
+{
+ sc->value = args;
+ pop_stack_no_op(sc);
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ sc->args = copy_proper_list(sc, sc->value);
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ return(sc->value);
+}
+
+static s7_pointer op_c_ap_mv(s7_scheme *sc, s7_pointer args) /* (values 2 (values 3 4)) or (apply + (values 5 '(1 2))) */
+{
+ sc->value = args;
+ pop_stack_no_op(sc);
+ clear_multiple_value(sc->value); /* sc->value not copied? */
+ sc->args = cons(sc, sc->args, sc->value);
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ return(sc->value);
+}
+
+static s7_pointer op_safe_c_pp_6_mv(s7_scheme *sc, s7_pointer args) /* both args mv */
+{
+ s7_pointer p;
+ sc->value = args;
+ pop_stack_no_op(sc);
+ for (p = cdr(sc->args); is_pair(cdr(p)); p = cdr(p)); /* we used to copy here: sc->args = pair_append(sc, sc->args, sc->value); */
+ set_cdr(p, sc->value);
+ /* fn_proc(sc->code) here is g_add_2, but we have any number of args from a values call
+ * the original (unoptimized) function is c_function_base(opt1_cfunc(sc->code))
+ * (let () (define (hi) (+ (values 1 2) (values 3 4))) (hi)) -> 10
+ */
+ sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
+ return(sc->value);
+}
+
static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
{
s7_pointer x;
if (SHOW_EVAL_OPS)
- safe_print(fprintf(stderr, "%s[%d]: splice %s %s\n", __func__, __LINE__,
+ safe_print(fprintf(stderr, " %s[%d]: splice %s %s\n", __func__, __LINE__,
(sc->stack_end > sc->stack_start) ? op_names[stack_top_op(sc)] : "no stack!", display_80(args)));
if ((S7_DEBUGGING) && ((is_null(args)) || (is_null(cdr(args))))) fprintf(stderr, "%s: %s\n", __func__, display(args));
@@ -69194,6 +69686,7 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
* setting stacked args to cdr of reversed-args and returning car because the list (args)
* can be some variable's value in a macro expansion via ,@ and reversing it in place
* (all this to avoid consing), clobbers the variable's value.
+ * (let ((g-1 (lambda (x a b c) (x (+ a 1) (- b 1) (values c 2))))) (g-1 (lambda (b c d e) (+ b c d e)) 2 3 5)) eval_args2
*/
sc->w = args;
for (x = args; is_not_null(cdr(x)); x = cdr(x))
@@ -69202,6 +69695,7 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
return(car(x));
case OP_EVAL_ARGS5:
+ /* (let ((g-1 (lambda (x a b c) (x (+ a 1) (- b 1) 2 (values c 2))))) (g-1 (macro (x y z w) (list-values '+ x y z w)) 2 3 5)) */
/* code = previous arg saved, args = ante-previous args reversed, we'll take value->code->args and reverse in args5 */
if (is_null(args))
return(sc->unspecified);
@@ -69216,7 +69710,7 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
/* handle implicit set! */
case OP_EVAL_SET1_NO_MV: /* (set! (fnc) <val>) where evaluation of <val> returned multiple values */
case OP_EVAL_SET2_NO_MV: /* (set! (fnc <ind...>) <val>), <val> = mv */
- case OP_EVAL_SET3_NO_MV: /* same as above */
+ case OP_EVAL_SET3_NO_MV: /* (define f (dilambda (lambda () 1) (lambda (x) x))) (define (f2) (values 1 2 3)) (set! (f) (f2)) */
syntax_error_nr(sc, "too many arguments to set!: ~S", 30, set_ulist_1(sc, sc->values_symbol, args));
case OP_EVAL_SET2: /* here <ind> = args is mv */
set_stack_top_op(sc, OP_EVAL_SET2_MV);
@@ -69225,19 +69719,18 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
set_stack_top_op(sc, OP_EVAL_SET3_MV);
return(args); /* ?? */
- /* in the next set, the main evaluator branches blithely assume no multiple-values, and if it happens anyway, we go to a different branch here */
- case OP_ANY_CLOSURE_NP_2:
- set_stack_top_op(sc, OP_ANY_CLOSURE_NP_MV);
- goto FP_MV;
+ case OP_ANY_CLOSURE_NP_1: case OP_ANY_CLOSURE_NP_2:
+ sc->code = pop_op_stack(sc);
+ error_nr(sc, sc->wrong_number_of_args_symbol,
+ set_elist_3(sc, too_many_arguments_string, closure_name(sc, sc->code), set_ulist_1(sc, sc->value_symbol, args)));
case OP_ANY_C_NP_2:
set_stack_top_op(sc, OP_ANY_C_NP_MV);
goto FP_MV;
- case OP_ANY_C_NP_1: case OP_ANY_CLOSURE_NP_1:
- set_stack_top_op(sc, stack_top_op(sc) + 1); /* replace with mv version */
-
- case OP_ANY_C_NP_MV: case OP_ANY_CLOSURE_NP_MV:
+ case OP_ANY_C_NP_1: /* ((eval-string (object->string mac5 :readable)) 1 5 3 4) */
+ set_stack_top_op(sc, OP_ANY_C_NP_MV); /* ?? */
+ case OP_ANY_C_NP_MV:
FP_MV:
if ((is_immutable(args)) || /* (let () (define (func) (with-output-to-string (lambda () (apply-values (write '(1 2)))))) (func) (func)) */
(needs_copied_args(args)))
@@ -69248,34 +69741,28 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
set_multiple_value(args);
return(args);
- case OP_SAFE_C_SSP_1:
- set_stack_top_op(sc, OP_SAFE_C_SSP_MV);
- return(args);
-
+ /* in the next set, the main evaluator branches blithely assume no multiple-values, and if it happens anyway, we go to a different branch here */
case OP_SAFE_C_SP_1: case OP_SAFE_CONS_SP_1: case OP_SAFE_ADD_SP_1: case OP_SAFE_MULTIPLY_SP_1:
- set_stack_top_op(sc, OP_SAFE_C_SP_MV);
- clear_multiple_value(args); /* see op_safe_c_sp_mv in s7test */
- return(args);
-
- case OP_SAFE_C_PS_1:
- set_stack_top_op(sc, OP_SAFE_C_PS_MV);
- return(args);
-
- case OP_SAFE_C_PC_1:
- set_stack_top_op(sc, OP_SAFE_C_PC_MV);
- return(args);
-
- case OP_SAFE_C_PA_1:
- set_stack_top_op(sc, OP_SAFE_C_PA_MV);
- return(args);
-
- case OP_C_P_1: case OP_SAFE_C_P_1:
- set_stack_top_op(sc, OP_C_P_MV);
+ /* (let () (define (ho a) (+ a 2)) (define (hi) (+ (ho 1) (values 3 4))) (hi)) from safe_c_pp->h_c_aa? */
+ return(op_safe_c_sp_mv(sc, args));
+
+ case OP_SAFE_C_PS_1: return(op_safe_c_ps_mv(sc, args)); /* (define (f) (let ((d #\d)) (string (values #\a #\b #\c) d))) (f) */
+ case OP_SAFE_C_PC_1: return(op_safe_c_pc_mv(sc, args)); /* (define (f) (string (values #\a #\b #\c) #\d)) (f) */
+ case OP_SAFE_C_PA_1: return(op_safe_c_pa_mv(sc, args));
+ case OP_SAFE_C_SSP_1: return(op_safe_c_ssp_mv(sc, args));
+ case OP_SAFE_C_P_1: return(op_safe_c_p_mv(sc, args)); /* (string (values #\a #\b #\c)) */
+ case OP_C_P_1: return(op_c_p_mv(sc, args)); /* (let () (define (ho a) (values a 1)) (define (hi) (- (ho 2))) (hi)) */
+ case OP_C_AP_1: return(op_c_ap_mv(sc, args));
+ case OP_SAFE_C_PP_5: return(op_safe_c_pp_6_mv(sc, args)); /* (let () (define (hi) (+ (values 1 2) (values 3 4))) (hi)) (also safe_c_pp_1) */
+
+ case OP_SAFE_C_PP_1: /* (define (f) (list (values 1 2) (values 3 4))) (f): args='(1 2), top_args=#<unused> */
+ set_stack_top_op(sc, OP_SAFE_C_PP_3_MV);
return(args);
- case OP_C_AP_1:
- set_stack_top_op(sc, OP_C_AP_MV);
- return(args);
+ case OP_SAFE_C_3P_1: case OP_SAFE_C_3P_2: case OP_SAFE_C_3P_3: /* (let ((g-1 (lambda (x a b c) (x (+ a 1) (- b 1) (values c 2))))) (g-1 + 2 3 5)) */
+ set_stack_top_op(sc, stack_top_op(sc) + 3); /* change op to parallel mv case */
+ case OP_SAFE_C_3P_1_MV: case OP_SAFE_C_3P_2_MV: case OP_SAFE_C_3P_3_MV: /* (list-values '+ 1 (apply-values (list 2 3))) */
+ return(cons(sc, sc->unused, copy_proper_list(sc, args)));
case OP_SAFE_CLOSURE_P_1: case OP_CLOSURE_P_1: case OP_SAFE_CLOSURE_P_A_1:
case OP_SAFE_CLOSURE_AP_1: case OP_CLOSURE_AP_1:
@@ -69283,26 +69770,14 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
case OP_SAFE_CLOSURE_PA_1: case OP_CLOSURE_PA_1: /* arity is 2, we have 2 args, this has to be an error (see optimize_closure_sym) */
case OP_ANY_CLOSURE_3P_1: case OP_ANY_CLOSURE_3P_2: case OP_ANY_CLOSURE_3P_3:
case OP_ANY_CLOSURE_4P_1: case OP_ANY_CLOSURE_4P_2: case OP_ANY_CLOSURE_4P_3: case OP_ANY_CLOSURE_4P_4:
+ /* (let () (define (func) (do ((x 0.0 (+ x 0.1)) (i 0 (+ i 1))) ((>= x 0.1) (#_with-baffle (inlet (values 1 2) (symbol? x)))))) (func)) */
if (is_multiple_value(sc->value)) clear_multiple_value(sc->value);
error_nr(sc, sc->wrong_number_of_args_symbol, set_elist_3(sc, too_many_arguments_string, stack_top_code(sc), sc->value));
- case OP_SAFE_C_PP_1:
- set_stack_top_op(sc, OP_SAFE_C_PP_3_MV);
- return(args);
-
- case OP_SAFE_C_PP_5:
- set_stack_top_op(sc, OP_SAFE_C_PP_6_MV);
- return(args);
-
- case OP_SAFE_C_3P_1: case OP_SAFE_C_3P_2: case OP_SAFE_C_3P_3:
- set_stack_top_op(sc, stack_top_op(sc) + 3); /* change op to parallel mv case */
- case OP_SAFE_C_3P_1_MV: case OP_SAFE_C_3P_2_MV: case OP_SAFE_C_3P_3_MV:
- return(cons(sc, sc->unused, copy_proper_list(sc, args)));
-
/* look for errors here rather than glomming up the set! and let code */
case OP_SET_SAFE: /* symbol is sc->code after pop */
case OP_SET1:
- case OP_SET_FROM_LET_TEMP: /* (set! var (values 1 2 3)) */
+ case OP_SET_FROM_LET_TEMP: /* (let-temporarily ((var (values 1 2 3))) var) */
case OP_SET_FROM_SETTER: /* stack_top_code(sc) is slot if (set! x (set! (setter 'x) g)) s7test.scm */
syntax_error_with_caller_nr(sc, "set!: can't set ~A to ~S", 24,
(is_slot(stack_top_code(sc))) ? slot_symbol(stack_top_code(sc)) : stack_top_code(sc),
@@ -69320,10 +69795,11 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
* (set! (a3 1) (values 2 3)): too many arguments to set!
* but (set! (a3 1 2) 3) is ok, also (set! (a3 (values 1 2)) 3)
*/
- syntax_error_nr(sc, "too many arguments to set! ~S", 29, set_ulist_1(sc, sc->values_symbol, args)); /* perhaps wrong_number_of_args error? */
+ syntax_error_nr(sc, "too many arguments to set! ~S", 29, set_ulist_1(sc, sc->values_symbol, args));
case OP_LET1: /* (let ((var (values 1 2 3))) ...) */
{
+ /* (let () (define (hi) (let ((x (values 1 2))) (if x (list x)))) (define (ho) (hi)) (catch #t (lambda () (ho)) (lambda args #f)) (ho)) */
s7_pointer let_code, vars, sym, p = stack_top_args(sc);
for (let_code = p; is_pair(cdr(let_code)); let_code = cdr(let_code));
for (vars = caar(let_code); is_pair(cdr(p)); p = cdr(p), vars = cdr(vars));
@@ -69335,6 +69811,7 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
}
case OP_LET_ONE_NEW_1: case OP_LET_ONE_P_NEW_1:
+ /* (let () (define (hi) (let ((x (values 1 2))) (display x) (if x (list x)))) (define (ho) (hi)) (catch #t (lambda () (ho)) (lambda args #f)) (ho)) */
syntax_error_with_caller2_nr(sc, "~A: can't bind ~A to ~S", 23, sc->let_symbol,
opt2_sym(stack_top_code(sc)), set_ulist_1(sc, sc->values_symbol, args));
@@ -69372,9 +69849,11 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
case OP_WHEN_PP: case OP_UNLESS_PP: case OP_WITH_LET1:
case OP_CASE_G_G: case OP_CASE_G_S: case OP_CASE_E_G: case OP_CASE_E_S: case OP_CASE_I_S:
case OP_COND1: case OP_COND1_SIMPLE:
+ /* (if (values 1 2) 3) */
return(car(args));
case OP_IF_PN: /* (if|when (not (values...)) ...) as opposed to (if|unless (values...)...) which follows CL and drops trailing values */
+ /* doesn't this error check happen elsewhere? */
syntax_error_nr(sc, "too many arguments to not: ~S", 29, set_ulist_1(sc, sc->values_symbol, args));
case OP_DYNAMIC_UNWIND: case OP_DYNAMIC_UNWIND_PROFILE:
@@ -69390,8 +69869,12 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
return(splice_in_values(sc, args));
}
+ case OP_DEACTIVATE_GOTO: /* (+ (call-with-exit (lambda (ret) (values 1 2 3)))) */
+ call_exit_active(stack_top_args(sc)) = false; /* stack_top_args(sc) is the goto */
+ /* fall through */
+ case OP_CATCH: case OP_CATCH_1: case OP_CATCH_2: case OP_CATCH_ALL: /* (+ (catch #t (lambda () (values 3 4)) (lambda args args))) */
case OP_BARRIER:
- pop_stack(sc);
+ pop_stack_no_op(sc);
return(splice_in_values(sc, args));
case OP_GC_PROTECT:
@@ -69408,20 +69891,12 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
*/
return(args);
- case OP_DEACTIVATE_GOTO: /* (+ (call-with-exit (lambda (ret) (values 1 2 3)))) */
- call_exit_active(stack_top_args(sc)) = false; /* stack_top_args(sc) is the goto */
-
- case OP_CATCH: case OP_CATCH_1: case OP_CATCH_2: case OP_CATCH_ALL: /* (+ (catch #t (lambda () (values 3 4)) (lambda args args))) */
- pop_stack(sc);
- return(splice_in_values(sc, args));
-
case OP_EVAL_MACRO_MV: /* perhaps reader-cond expansion at eval-time (not at run-time) via ((let () reader-cond) ...)? */
{
opcode_t s_op = stack_top4_op(sc);
- if (S7_DEBUGGING)
- if (SHOW_EVAL_OPS)
- fprintf(stderr, " eval_macro_mv splice %s with %s, code: %s, args: %s, value: %s\n",
- display_80(args), op_names[s_op], display_80(sc->code), display_80(sc->args), display_80(sc->value));
+ if ((S7_DEBUGGING) && (SHOW_EVAL_OPS))
+ fprintf(stderr, " eval_macro_mv splice %s with %s, code: %s, args: %s, value: %s\n",
+ display_80(args), op_names[s_op], display_80(sc->code), display_80(sc->args), display_80(sc->value));
if ((s_op == OP_DO_STEP) || (s_op == OP_DEACTIVATE_GOTO) || (s_op == OP_LET1))
return(args); /* tricky reader-cond as macro in do body returning values... or call-with-exit */
@@ -69441,7 +69916,7 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
display_80(sc->value), display_80(stack_top4_args(sc)), display_80(car(x)));
return(car(x));
}
- /* fall through */
+ /* else fall through */
/* safe_c_p_1 also happens and currently drops trailing arg: ((let () reader-cond) (#t (values 1 2) (iv)))
* op_eval_macro (not op_expansion) is called and can be included below (except it segfaults in s7test...), but trailing arg
* is still dropped because optimizer sees (reader-cond ...) -- one arg!
@@ -69453,6 +69928,7 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
/* we get here if a reader-macro (define-expansion) returns multiple values.
* these need to be read in order into the current reader lists (we'll assume OP_READ_LIST is next in the stack.
* and that it will be expecting the next arg entry in sc->value; but it could be OP_LOAD_RETURN_IF_EOF if the expansion is at top level).
+ * (+ (reader-cond (#t 1 (values 2 3) 4)))
*/
if (SHOW_EVAL_OPS)
fprintf(stderr, " %s[%d]: %s stack top: %" ld64 ", op: %s, args: %s\n", __func__, __LINE__,
@@ -69466,10 +69942,10 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
}
for (x = args; is_not_null(cdr(x)); x = cdr(x))
stack_top4_args(sc) = cons(sc, car(x), stack_top4_args(sc));
- pop_stack(sc); /* need GC protection in loop above, so do this afterwards */
+ pop_stack_no_op(sc); /* need GC protection in loop above, so do this afterwards */
return(car(x)); /* sc->value from OP_READ_LIST point of view */
- case OP_EVAL_DONE:
+ case OP_EVAL_DONE: /* ((lambda (w) 1) (char-ready? (open-input-function (lambda (x) (values 1 2 3 4 5 6 7))))) */
if (stack_top4_op(sc) == OP_NO_VALUES)
error_nr(sc, sc->error_symbol,
set_elist_1(sc, wrap_string(sc, "function-port should not return multiple-values", 47)));
@@ -69479,6 +69955,8 @@ static s7_pointer splice_in_values(s7_scheme *sc, s7_pointer args)
return(args);
default:
+ /* (let () (define (f1) (do ((i 0 (+ i 1))) ((= i 1)) (values (append "" (block)) 1))) (f1)) safe_dotimes_step_o */
+ /* ((values memq (values #\a '(#\A 97 #\a)))) eval_args */
if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: splice punts: %s\n", __func__, __LINE__, op_names[stack_top_op(sc)]);
break;
}
@@ -69622,16 +70100,15 @@ static s7_pointer g_apply_values(s7_scheme *sc, s7_pointer args)
{
#define H_apply_values "(apply-values var) applies values to var. This is an internal function."
#define Q_apply_values s7_make_signature(sc, 2, sc->T, sc->is_list_symbol)
- s7_pointer x;
- /* apply-values takes 1 arg: ,@a -> (apply-values a) */
- if (is_null(args))
- return(sc->no_value);
+ s7_pointer x; /* apply-values takes 1 arg: ,@a -> (apply-values a) */
+ if (is_null(args)) return(sc->no_value);
x = car(args);
- if (is_null(x))
- return(sc->no_value);
- if (!s7_is_proper_list(sc, x))
- apply_list_error_nr(sc, args);
- return(s7_values(sc, x)); /* g_values == s7_values */
+ if (is_null(x)) return(sc->no_value);
+ if (!s7_is_proper_list(sc, x)) apply_list_error_nr(sc, x);
+ if (is_null(cdr(x))) return(car(x)); /* needs to follow previous because it might not be a pair: (apply-values 2) */
+ set_needs_copied_args(x);
+ return(splice_in_values(sc, x));
+ /* return(s7_values(sc, x)); *//* g_values == s7_values */
}
/* (apply values ...) replaces (unquote_splicing ...)
@@ -69981,6 +70458,7 @@ static void init_choosers(s7_scheme *sc)
set_function_chooser(sc->string_copy_symbol, string_copy_chooser);
set_function_chooser(sc->eval_string_symbol, string_substring_chooser);
set_function_chooser(sc->symbol_symbol, string_substring_chooser);
+ set_function_chooser(sc->string_to_byte_vector_symbol, string_substring_chooser);
/* if the function assumes a null-terminated string, substring needs to return a copy (which assume this?) */
#if (!WITH_PURE_S7)
set_function_chooser(sc->string_length_symbol, string_substring_chooser);
@@ -69995,9 +70473,8 @@ static void init_choosers(s7_scheme *sc)
set_function_chooser(sc->file_exists_symbol, string_substring_chooser);
#endif
- /* also: directory->list substring string->byte-vector with-input-from-file with-input-from-string
- * system load getenv file-mtime gensym with-output-to-file open-output-file directory? open-input-file
- * call-with-output-file delete-file call-with-input-file call-with-input-string open-input-string
+ /* also: directory->list substring with-input-from-file with-input-from-string with-output-to-file open-output-file open-input-file
+ * system load getenv file-mtime gensym directory? call-with-output-file delete-file call-with-input-file call-with-input-string open-input-string
*/
/* symbol->string */
@@ -70126,11 +70603,11 @@ static void init_choosers(s7_scheme *sc)
/* let-ref */
f = set_function_chooser(sc->let_ref_symbol, let_ref_chooser);
- sc->lint_let_ref = make_function_with_class(sc, f, "let-ref", g_lint_let_ref, 2, 0, false);
+ sc->simple_let_ref = make_function_with_class(sc, f, "let-ref", g_simple_let_ref, 2, 0, false);
/* let-set */
f = set_function_chooser(sc->let_set_symbol, let_set_chooser);
- sc->lint_let_set = make_function_with_class(sc, f, "let-set!", g_lint_let_set, 3, 0, false);
+ sc->simple_let_set = make_function_with_class(sc, f, "let-set!", g_simple_let_set, 3, 0, false);
/* values */
f = set_function_chooser(sc->values_symbol, values_chooser);
@@ -70257,7 +70734,7 @@ static s7_pointer check_autoload_and_error_hook(s7_scheme *sc, s7_pointer sym)
* has an autoload? I think I'll just assume rootlet, even though that is not very elegant. Actually in the
* libgsl case, we're trying to export a name from *libgsl* -- should that be done with define rather than autoload?
*/
- result = let_ref(sc, e, sym); /* add '(sym . result) to current_let (was sc->nil, s7_load can set sc->curlet to sc->nil) */
+ result = let_ref_p_pp(sc, e, sym); /* add '(sym . result) to current_let (was sc->nil, s7_load can set sc->curlet to sc->nil) */
if (result != sc->undefined)
s7_define(sc, sc->nil /* current_let */, sym, result);
}}}
@@ -70290,7 +70767,7 @@ static s7_pointer check_autoload_and_error_hook(s7_scheme *sc, s7_pointer sym)
result = s7_symbol_value(sc, sym); /* calls lookup, does not trigger unbound_variable search */
if ((result == sc->undefined) && (e) && (is_let(e))) /* added 31-Mar-23 to match sc->autoload_names case above */
{
- result = let_ref(sc, e, sym);
+ result = let_ref_p_pp(sc, e, sym);
if (result != sc->undefined)
s7_define(sc, sc->nil /* current_let */, sym, result); /* as above, was sc->nil -- s7_load above can set sc->curlet to sc->nil */
}}
@@ -70719,9 +71196,10 @@ static opt_t optimize_c_function_one_arg(s7_scheme *sc, s7_pointer expr, s7_poin
s7_pointer arg1 = cadr(expr);
bool func_is_safe = is_safe_procedure(func);
if (hop == 0) hop = hop_if_constant(sc, car(expr));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: %s %d %d\n", __func__, __LINE__, display_80(expr), func_is_safe, pairs);
if (pairs == 0)
{
- if (func_is_safe) /* safe c function */
+ if (func_is_safe) /* safe c function */
{
set_safe_optimize_op(expr, hop + ((symbols == 0) ? OP_SAFE_C_NC : OP_SAFE_C_S));
choose_c_function(sc, expr, func, 1);
@@ -71033,6 +71511,8 @@ static opt_t optimize_func_one_arg(s7_scheme *sc, s7_pointer expr, s7_pointer fu
int32_t hop, int32_t pairs, int32_t symbols, int32_t quotes, int32_t bad_pairs, s7_pointer e)
{
s7_pointer arg1;
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: expr: %s, func: %s, hop: %d, pairs: %d, symbols: %d, quotes: %d, bad_pairs: %d, e: %s\n",
+ __func__, __LINE__, display_80(expr), display(func), hop, pairs, symbols, quotes, bad_pairs, display_80(e));
/* very often, expr is already optimized, quoted stuff is counted under "bad_pairs"! as well as quotes */
if (quotes > 0)
{
@@ -71046,7 +71526,7 @@ static opt_t optimize_func_one_arg(s7_scheme *sc, s7_pointer expr, s7_pointer fu
arg1 = cadr(expr);
/* need in_with_let -> search only rootlet not lookup */
if ((symbols == 1) &&
- (!arg_findable(sc, arg1, e)))
+ ((!arg_findable(sc, arg1, e)) || (sc->in_with_let))) /* (set! (with-let ...) ...) can involve an unbound variable otherwise bound */
{
/* wrap the bad arg in a check symbol lookup */
if (s7_is_aritable(sc, func, 1))
@@ -71056,14 +71536,18 @@ static opt_t optimize_func_one_arg(s7_scheme *sc, s7_pointer expr, s7_pointer fu
}
return(OPT_F);
}
- if ((is_c_function(func)) && (c_function_is_aritable(func, 1)))
- return(optimize_c_function_one_arg(sc, expr, func, hop, pairs, symbols, quotes, bad_pairs, e));
-
- if (is_closure(func))
- return(optimize_closure_one_arg(sc, expr, func, hop, symbols, e));
- if (is_closure_star(func))
+ switch (type(func))
{
+ case T_C_FUNCTION: /* these two happen much more than everything else put together, but splitting them out to avoid the switch doesn't gain much */
+ if (!c_function_is_aritable(func, 1)) return(OPT_F);
+ case T_C_RST_NO_REQ_FUNCTION:
+ return(optimize_c_function_one_arg(sc, expr, func, hop, pairs, symbols, quotes, bad_pairs, e));
+
+ case T_CLOSURE:
+ return(optimize_closure_one_arg(sc, expr, func, hop, symbols, e));
+
+ case T_CLOSURE_STAR:
if (is_null(closure_args(func)))
return(OPT_F);
if (fx_count(sc, expr) == 1)
@@ -71087,63 +71571,63 @@ static opt_t optimize_func_one_arg(s7_scheme *sc, s7_pointer expr, s7_pointer fu
else set_optimize_op(expr, hop + ((safe_case) ? OP_SAFE_CLOSURE_STAR_NA_1 : OP_CLOSURE_STAR_NA));
}
return(OPT_F);
- }
-
- if ((is_c_function_star(func)) &&
- (fx_count(sc, expr) == 1) &&
- (c_function_max_args(func) >= 1) &&
- (!is_symbol_and_keyword(arg1))) /* the only arg should not be a keyword (needs error checks later) */
- {
- if ((hop == 0) && ((is_immutable(func)) || ((!sc->in_with_let) && (symbol_id(car(expr)) == 0)))) hop = 1;
- set_safe_optimize_op(expr, hop + OP_SAFE_C_STAR_A);
- fx_annotate_arg(sc, cdr(expr), e);
- set_opt3_arglen(cdr(expr), 1);
- set_c_function(expr, func);
- return(OPT_T);
- }
- if (((is_any_vector(func)) || (is_pair(func))) &&
- (is_fxable(sc, arg1)))
- {
- set_unsafe_optimize_op(expr, (is_pair(func) ? OP_IMPLICIT_PAIR_REF_A : OP_IMPLICIT_VECTOR_REF_A));
- fx_annotate_arg(sc, cdr(expr), e);
- set_opt3_arglen(cdr(expr), 1);
- return(OPT_T);
- }
+ case T_C_FUNCTION_STAR:
+ if ((fx_count(sc, expr) == 1) &&
+ (c_function_max_args(func) >= 1) &&
+ (!is_symbol_and_keyword(arg1))) /* the only arg should not be a keyword (needs error checks later) */
+ {
+ if ((hop == 0) && ((is_immutable(func)) || ((!sc->in_with_let) && (symbol_id(car(expr)) == 0)))) hop = 1;
+ set_safe_optimize_op(expr, hop + OP_SAFE_C_STAR_A);
+ fx_annotate_arg(sc, cdr(expr), e);
+ set_opt3_arglen(cdr(expr), 1);
+ set_c_function(expr, func);
+ return(OPT_T);
+ }
+ break;
- if ((func == sc->s7_starlet) && /* (*s7* ...) */
- (((quotes == 1) && (is_symbol(cadr(arg1)))) ||
- (is_symbol_and_keyword(arg1))))
- {
- s7_pointer sym = (quotes == 1) ? cadr(arg1) : arg1;
- if (is_keyword(sym)) sym = keyword_symbol(sym); /* might even be ':print-length */
- set_safe_optimize_op(expr, OP_IMPLICIT_S7_STARLET_REF_S);
- set_opt3_int(expr, s7_starlet_symbol(sym));
- return(OPT_T);
- }
+ case T_PAIR: case T_VECTOR: case T_INT_VECTOR: case T_BYTE_VECTOR: case T_FLOAT_VECTOR:
+ if (is_fxable(sc, arg1))
+ {
+ set_unsafe_optimize_op(expr, (is_pair(func) ? OP_IMPLICIT_PAIR_REF_A : OP_IMPLICIT_VECTOR_REF_A));
+ fx_annotate_arg(sc, cdr(expr), e);
+ set_opt3_arglen(cdr(expr), 1);
+ return(OPT_T);
+ }
+ break;
- if (is_let(func))
- {
- if (is_quoted_pair(arg1))
+ case T_LET:
+ if (((quotes == 1) && (is_symbol(cadr(arg1)))) || /* (e 'a) or (e ':a) */
+ (is_symbol_and_keyword(arg1))) /* (e :a) */
{
- set_opt3_con(expr, cadr(arg1));
+ s7_pointer sym = (quotes == 1) ? cadr(arg1) : arg1;
+ if (is_keyword(sym)) sym = keyword_symbol(sym);
+ if (func == sc->s7_starlet) /* (*s7* ...), sc->s7_starlet is a let */
+ {
+ set_safe_optimize_op(expr, OP_IMPLICIT_S7_STARLET_REF_S);
+ set_opt3_int(expr, s7_starlet_symbol(sym));
+ return(OPT_T);
+ }
+ set_opt3_con(expr, sym);
set_unsafe_optimize_op(expr, OP_IMPLICIT_LET_REF_C);
return(OPT_T);
}
+ /* fall through */
+
+ case T_HASH_TABLE: case T_C_OBJECT:
if (is_fxable(sc, arg1))
{
- set_unsafe_optimize_op(expr, OP_IMPLICIT_LET_REF_A);
- set_opt3_any(expr, arg1);
+ set_unsafe_optimize_op(expr, (type(func) == T_LET) ? OP_IMPLICIT_LET_REF_A :
+ ((type(func) == T_HASH_TABLE) ? OP_IMPLICIT_HASH_TABLE_REF_A : OP_IMPLICIT_C_OBJECT_REF_A));
fx_annotate_arg(sc, cdr(expr), e);
set_opt3_arglen(cdr(expr), 1);
return(OPT_T);
- }}
+ }
+ break;
- /* unknown_* for other cases is set later(? -- we're getting eval-args...) */
- /* op_safe_c_p for (< (values 1 2 3)) op_s_s for (op arg)
- * but is it better to wait for unknown* ? These are not hit often at this point (except in s7test).
- * do they end up in op_s_a or whatever after unknown*?
- */
+ default:
+ break;
+ }
return((is_optimized(expr)) ? OPT_T : OPT_F);
}
@@ -71181,11 +71665,9 @@ static void opt_sp_1(s7_scheme *sc, s7_function g, s7_pointer expr)
static opt_t set_any_c_np(s7_scheme *sc, s7_pointer func, s7_pointer expr, s7_pointer e, int32_t num_args, opcode_t op)
{
- /* we get safe/semisafe funcs here of 2 args and up! very few more than 5 */
+ /* we get semisafe funcs here of 2 args and up, very few more than 5 */
/* would safe_c_pp work for cl? or should unknown_* deal with op_cl_*? why aren't unknown* used in op_safe_c and op_c?
- * 2 | 3 args store on stack rather than consing? then use sc->t2|3 to pass to fn_proc (unless unsafe)
* or use op_stack? error clears this? op-any-c-fp: op_any_c_2p|3p|fp? -- mimic clo_3p|4p?
- * all: 3 1 0 any_c_np (* 0.5 (- n 1) y)??
*/
for (s7_pointer p = cdr(expr); is_pair(p); p = cdr(p))
{
@@ -71234,6 +71716,8 @@ static opt_t optimize_func_two_args(s7_scheme *sc, s7_pointer expr, s7_pointer f
int32_t pairs, int32_t symbols, int32_t quotes, int32_t bad_pairs, s7_pointer e)
{
s7_pointer arg1 = cadr(expr), arg2 = caddr(expr);
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: expr: %s, func: %s, hop: %d, pairs: %d, symbols: %d, quotes: %d, bad_pairs: %d, e: %s\n",
+ __func__, __LINE__, display_80(expr), display(func), hop, pairs, symbols, quotes, bad_pairs, display_80(e));
if (quotes > 0)
{
if (direct_memq(sc->quote_symbol, e))
@@ -71318,7 +71802,8 @@ static opt_t optimize_func_two_args(s7_scheme *sc, s7_pointer expr, s7_pointer f
}}
else
{
- set_optimize_op(expr, hop + ((is_semisafe(func)) ? OP_CL_AA : OP_C_AA));
+ set_optimize_op(expr, hop + ((is_semisafe(func)) ? OP_CL_AA :
+ (((symbols == 0) && (pairs == 0) && (car(expr) == sc->values_symbol)) ? OP_C_NC : OP_C_AA)));
fx_annotate_args(sc, cdr(expr), e);
set_opt3_arglen(cdr(expr), 2);
choose_c_function(sc, expr, func, 2);
@@ -71702,7 +72187,7 @@ static opt_t optimize_func_two_args(s7_scheme *sc, s7_pointer expr, s7_pointer f
}
return(OPT_F);
}}
- return(set_any_c_np(sc, func, expr, e, 2, hop + OP_ANY_C_NP)); /* OP_C_PP doesn't exist */
+ return(set_any_c_np(sc, func, expr, e, 2, hop + OP_ANY_C_NP)); /* OP_C_PP doesn't exist, presumably OP_SAFE_C_PP was caught above? */
}
if (is_closure(func))
@@ -72104,7 +72589,7 @@ static opt_t optimize_func_three_args(s7_scheme *sc, s7_pointer expr, s7_pointer
if ((is_normal_symbol(arg1)) && (is_normal_symbol(arg2)))
{
set_opt3_pair(expr, arg3);
- set_unsafe_optimize_op(expr, hop + OP_SAFE_C_SSP);
+ set_unsafe_optimize_op(expr, hop + OP_SAFE_C_SSP); /* vector-set! in tbig apparently */
choose_c_function(sc, expr, func, 3);
return(OPT_F);
}
@@ -72118,7 +72603,10 @@ static opt_t optimize_func_three_args(s7_scheme *sc, s7_pointer expr, s7_pointer
set_opt3_arglen(cdr(expr), 3);
if (is_semisafe(func))
set_optimize_op(expr, hop + (((is_normal_symbol(arg1)) && (is_normal_symbol(arg3))) ? OP_CL_SAS : OP_CL_NA));
- else set_optimize_op(expr, hop + OP_C_NA);
+ else
+ if ((fx_proc(cdr(expr)) == fx_c) && (fx_proc(cddr(expr)) == fx_c) && (fx_proc(cdddr(expr)) == fx_c))
+ set_optimize_op(expr, hop + OP_C_NC);
+ else set_optimize_op(expr, hop + OP_C_NA);
choose_c_function(sc, expr, func, 3);
set_unsafe(expr);
return(OPT_F);
@@ -72412,9 +72900,9 @@ static opt_t optimize_func_many_args(s7_scheme *sc, s7_pointer expr, s7_pointer
/* c_func is not safe */
if (fx_count(sc, expr) == args) /* trigger_size doesn't matter for unsafe funcs */
{
- set_unsafe_optimize_op(expr, hop + ((is_semisafe(func)) ? OP_CL_NA : OP_C_NA));
fx_annotate_args(sc, cdr(expr), e);
set_opt3_arglen(cdr(expr), args);
+ set_unsafe_optimize_op(expr, hop + ((is_semisafe(func)) ? OP_CL_NA : OP_C_NA));
choose_c_function(sc, expr, func, args);
return(OPT_F);
}
@@ -72447,7 +72935,8 @@ static opt_t optimize_func_many_args(s7_scheme *sc, s7_pointer expr, s7_pointer
{
if (safe_case)
set_optimize_op(expr, hop + OP_SAFE_CLOSURE_NS);
- else set_optimize_op(expr, hop + ((args == 4) ? ((is_null(cdr(closure_body(func)))) ? OP_CLOSURE_4S_O : OP_CLOSURE_4S) : ((args == 5) ? OP_CLOSURE_5S : OP_CLOSURE_NS)));
+ else set_optimize_op(expr, hop + ((args == 4) ? ((is_null(cdr(closure_body(func)))) ? OP_CLOSURE_4S_O : OP_CLOSURE_4S) :
+ ((args == 5) ? OP_CLOSURE_5S : OP_CLOSURE_NS)));
}
return(OPT_F);
}
@@ -72523,6 +73012,7 @@ static opt_t optimize_syntax(s7_scheme *sc, s7_pointer expr, s7_pointer func, in
opcode_t op = syntax_opcode(func);
s7_pointer body = cdr(expr), vars;
bool body_export_ok = true;
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: %s\n", __func__, __LINE__, display_80(expr));
sc->w = e;
switch (op)
@@ -72734,12 +73224,18 @@ static opt_t optimize_syntax(s7_scheme *sc, s7_pointer expr, s7_pointer func, in
if ((is_pair(cadr(expr))) &&
(!is_checked(cadr(expr))))
{
+ bool old_in_with_let = sc->in_with_let;
set_checked(cadr(expr));
+ if (caadr(expr) == sc->with_let_symbol) sc->in_with_let = true;
for (s7_pointer lp = cdadr(expr); is_pair(lp); lp = cdr(lp))
if ((is_pair(car(lp))) &&
(!is_checked(car(lp))) &&
(optimize_expression(sc, car(lp), hop, e, body_export_ok) == OPT_OOPS))
- return(OPT_OOPS);
+ {
+ sc->in_with_let = old_in_with_let;
+ return(OPT_OOPS);
+ }
+ sc->in_with_let = old_in_with_let;
}
if ((is_pair(caddr(expr))) &&
(!is_checked(caddr(expr))) &&
@@ -73763,13 +74259,13 @@ static body_t form_is_safe(s7_scheme *sc, s7_pointer func, s7_pointer x, bool at
}
else c_safe = false;
- result = ((is_sequence(f)) ||
+ result = ((is_simple_sequence(f)) || /* was is_sequence? */
((is_closure(f)) && (is_very_safe_closure(f))) ||
((c_safe) && ((is_immutable_slot(f_slot)) || (is_global(expr))))) ? VERY_SAFE_BODY : SAFE_BODY;
if ((c_safe) ||
((is_any_closure(f)) && (is_safe_closure(f))) ||
- (is_sequence(f)))
+ (is_simple_sequence(f))) /* was is_sequence? */
{
bool follow = false;
s7_pointer sp = x, p = cdr(x);
@@ -74290,6 +74786,7 @@ static bool check_tc_when(s7_scheme *sc, const s7_pointer name, int32_t vars, s7
(caar(p) == name))
{
s7_pointer laa = car(p);
+ set_opt3_pair(body, p);
if ((is_pair(cdr(laa))) && (is_fxable(sc, cadr(laa))))
{
if (is_null(cddr(laa)))
@@ -75025,7 +75522,7 @@ static void mark_fx_treeable(s7_scheme *sc, s7_pointer body)
static void optimize_lambda(s7_scheme *sc, bool unstarred_lambda, s7_pointer func, s7_pointer args, s7_pointer body)
{ /* func is either sc->unused or a symbol */
s7_int len = s7_list_length(sc, body);
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s[%d]: %s\n", __func__, __LINE__, display_80(body));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: %s\n", __func__, __LINE__, display_80(body));
if (len < 0) /* (define (hi) 1 . 2) */
error_nr(sc, sc->syntax_error_symbol,
set_elist_3(sc, wrap_string(sc, "~A: function body messed up, ~A", 31),
@@ -75802,7 +76299,7 @@ static s7_pointer check_named_let(s7_scheme *sc, int32_t vars)
pair_set_syntax_op(sc->code, (vars == 1) ? OP_NAMED_LET_A : ((vars == 2) ? OP_NAMED_LET_AA : OP_NAMED_LET_NA));
}
optimize_lambda(sc, true, car(code), sc->args, cddr(code)); /* car(code) is the name */
- clear_list_in_use(sc->args);
+ if (!in_heap(sc->args)) clear_list_in_use(sc->args);
sc->args = sc->nil;
}
return(code);
@@ -78096,7 +78593,7 @@ static void check_define(s7_scheme *sc)
s7_warn(sc, 256, "%s: syntactic keywords tend to behave badly if redefined: %s\n", display(func), display_80(sc->code));
set_local(func);
}
- if ((is_global(func)) && (is_slot(global_slot(func))) &&
+ if ((is_global(func)) && (is_slot(global_slot(func))) &&
(is_immutable(global_slot(func))) && (is_slot(initial_slot(func)))) /* (define (abs x) 1) after (immutable! abs) */
immutable_object_error_nr(sc, set_elist_3(sc, wrap_string(sc, "can't ~A ~S: it is immutable", 28), caller, func));
if (starred)
@@ -78647,7 +79144,7 @@ static void op_finish_expansion(s7_scheme *sc)
/* after the expander has finished, if a list was returned, we need to add some annotations.
* if the expander returned (values), the list-in-progress vanishes! (This mimics map and *#readers*).
*/
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s[%d]: op: %s, value: %s\n", __func__, __LINE__, op_names[stack_top_op(sc)], display_80(sc->value));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: op: %s, value: %s\n", __func__, __LINE__, op_names[stack_top_op(sc)], display_80(sc->value));
if (sc->value == sc->no_value)
{
if (stack_top_op(sc) != OP_LOAD_RETURN_IF_EOF) /* latter op if empty expansion at top-level */
@@ -78925,10 +79422,17 @@ static bool op_cond1(s7_scheme *sc)
sc->cur_op = optimize_op(sc->code);
return(true);
}
+#if 0
/* sc->code is () */
- if (is_multiple_value(sc->value)) /* (+ 1 (cond ((values 2 3)))) */
- sc->value = splice_in_values(sc, multiple_value(sc->value));
+ if (is_multiple_value(sc->value)) /* this can't happen since splicer returns car now */
+ {
+ if (S7_DEBUGGING) fprintf(stderr, "cond1 mv case %s\n", display(sc->value));
+ sc->value = splice_in_values(sc, multiple_value(sc->value));
+ }
/* no result clause, so return test, (cond (#t)) -> #t, (cond ((+ 1 2))) -> 3 */
+#else
+ if ((S7_DEBUGGING) && (is_multiple_value(sc->value))) fprintf(stderr, "cond1 mv case %s\n", display(sc->value));
+#endif
pop_stack(sc);
return(true);
}
@@ -78960,8 +79464,15 @@ static bool op_cond1_simple(s7_scheme *sc)
sc->code = T_Lst(cdar(sc->code));
if (is_null(sc->code))
{
+#if 0
if (is_multiple_value(sc->value))
- sc->value = splice_in_values(sc, multiple_value(sc->value));
+ {
+ if (S7_DEBUGGING) fprintf(stderr, "cond1_simple mv case %s\n", display(sc->value));
+ sc->value = splice_in_values(sc, multiple_value(sc->value));
+ }
+#else
+ if ((S7_DEBUGGING) && (is_multiple_value(sc->value))) fprintf(stderr, "cond1_simple mv case %s\n", display(sc->value));
+#endif
pop_stack(sc);
return(true);
}
@@ -79120,9 +79631,15 @@ static bool op_cond_feed(s7_scheme *sc)
static void op_cond_feed_1(s7_scheme *sc)
{
+ if ((S7_DEBUGGING) && (is_multiple_value(sc->value))) fprintf(stderr, "%s %s unexpected mv\n", __func__, display(sc->value));
+#if 0
if (is_multiple_value(sc->value))
- sc->code = cons(sc, opt2_lambda(sc->code), multiple_value(sc->value));
+ {
+ if (S7_DEBUGGING) fprintf(stderr, "%s %s\n", __func__, display(sc->value));
+ sc->code = cons(sc, opt2_lambda(sc->code), multiple_value(sc->value));
+ }
else
+#endif
{
set_curlet(sc, inline_make_let_with_slot(sc, sc->curlet, caadr(opt2_lambda(sc->code)), sc->value));
sc->code = caddr(opt2_lambda(sc->code));
@@ -79131,7 +79648,7 @@ static void op_cond_feed_1(s7_scheme *sc)
static bool feed_to(s7_scheme *sc)
{
- if (is_multiple_value(sc->value))
+ if (is_multiple_value(sc->value)) /* (... ((values 1 2) => +)) more or less s7test.scm 29539 */
{
sc->args = multiple_value(sc->value);
clear_multiple_value(sc->args);
@@ -79749,7 +80266,7 @@ static bool set_pair4(s7_scheme *sc, s7_pointer obj, s7_pointer index1, s7_point
return(set_pair3(sc, sc->value, index2, value));
case T_C_RST_NO_REQ_FUNCTION: case T_C_FUNCTION:
- case T_C_FUNCTION_STAR: /* obj here is a c_function, but its setter could be a closure and vice versa below */
+ case T_C_FUNCTION_STAR: /* obj here is any_c_function, but its setter could be a closure and vice versa below */
if (is_c_function(c_function_setter(obj)))
return(pair4_cfunc(sc, obj, c_function_setter(obj), index1, index2, value));
sc->code = c_function_setter(obj); /* closure|macro */
@@ -80013,13 +80530,8 @@ static void op_decrement_by_1(s7_scheme *sc) /* ([set!] ctr (- ctr 1)) */
/* ---------------- implicit ref/set ---------------- */
static Inline bool inline_op_implicit_vector_ref_a(s7_scheme *sc) /* called once in eval */
{
- s7_pointer x;
- s7_pointer v = lookup_checked(sc, car(sc->code));
- if (!is_any_vector(v))
- {
- sc->last_function = v;
- return(false);
- }
+ s7_pointer x, v = lookup_checked(sc, car(sc->code));
+ if (!is_any_vector(v)) {sc->last_function = v; return(false);}
x = fx_call(sc, cdr(sc->code));
if ((s7_is_integer(x)) &&
(vector_rank(v) == 1))
@@ -80034,6 +80546,22 @@ static Inline bool inline_op_implicit_vector_ref_a(s7_scheme *sc) /* called once
return(true);
}
+static s7_pointer fx_implicit_vector_ref_a(s7_scheme *sc, s7_pointer arg)
+{
+ s7_pointer x, v = lookup_checked(sc, car(arg));
+ if (!is_any_vector(v))
+ return(s7_apply_function(sc, v, list_1(sc, fx_call(sc, cdr(arg)))));
+ x = fx_call(sc, cdr(arg));
+ if ((s7_is_integer(x)) &&
+ (vector_rank(v) == 1))
+ {
+ s7_int index = s7_integer_clamped_if_gmp(sc, x);
+ if ((index < vector_length(v)) && (index >= 0))
+ return(vector_getter(v)(sc, v, index));
+ }
+ return(vector_ref_1(sc, v, set_plist_1(sc, x)));
+}
+
static bool op_implicit_vector_ref_aa(s7_scheme *sc) /* if Inline 70 in concordance */
{
s7_pointer x, y, code;
@@ -80194,7 +80722,7 @@ static goto_t set_implicit_vector(s7_scheme *sc, s7_pointer vect, s7_pointer ind
return(goto_start);
}}
push_op_stack(sc, sc->vector_set_function); /* vector_setter(vect) has wrong args */
- sc->code = (is_null(cdr(inds))) ? val : pair_append(sc, cdr(inds), T_Lst(val)); /* i.e. rest(args) + val */
+ sc->code = (is_null(cdr(inds))) ? val : ((is_null(cddr(inds))) ? cons(sc, cadr(inds), val) : pair_append(sc, cdr(inds), T_Lst(val))); /* i.e. rest(args) + val */
push_stack(sc, OP_EVAL_ARGS4, list_1(sc, vect), sc->code);
sc->code = car(inds);
sc->cur_op = optimize_op(sc->code);
@@ -80263,7 +80791,7 @@ static goto_t set_implicit_c_object(s7_scheme *sc, s7_pointer c_obj, s7_pointer
}
else
{
- sc->code = pair_append(sc, cdr(inds), T_Lst(val));
+ sc->code = (is_null(cdr(inds))) ? cons(sc, car(inds), val) : pair_append(sc, cdr(inds), T_Lst(val));
push_stack(sc, OP_EVAL_ARGS4, list_1(sc, c_obj), sc->code);
sc->code = car(inds);
}
@@ -80540,7 +81068,8 @@ static goto_t set_implicit_c_function(s7_scheme *sc, s7_pointer fnc) /* (let ((
{
if (!is_any_macro(c_function_setter(fnc)))
no_setter_error_nr(sc, fnc);
- sc->args = (is_null(cdar(sc->code))) ? cdr(sc->code) : pair_append(sc, cdar(sc->code), cdr(sc->code));
+ sc->args = (is_null(cdar(sc->code))) ? cdr(sc->code) :
+ ((is_null(cddar(sc->code))) ? cons(sc, cadar(sc->code), cdr(sc->code)) : pair_append(sc, cdar(sc->code), cdr(sc->code)));
sc->code = c_function_setter(fnc);
/* here multiple-values can't happen because we don't eval the new-value argument */
return(goto_apply);
@@ -80576,7 +81105,8 @@ static goto_t set_implicit_closure(s7_scheme *sc, s7_pointer fnc)
{
if (!is_any_macro(setter))
no_setter_error_nr(sc, fnc);
- sc->args = (is_null(cdar(sc->code))) ? cdr(sc->code) : pair_append(sc, cdar(sc->code), cdr(sc->code));
+ sc->args = (is_null(cdar(sc->code))) ? cdr(sc->code) :
+ ((is_null(cddar(sc->code))) ? cons(sc, cadar(sc->code), cdr(sc->code)) : pair_append(sc, cdar(sc->code), cdr(sc->code)));
sc->code = setter;
return(goto_apply);
}
@@ -80809,7 +81339,7 @@ static bool all_ints_here(s7_scheme *sc, s7_pointer settee, s7_pointer expr, s7_
if (expr == settee) return(true);
for (s7_pointer step = step_vars; is_pair(step); step = cdr(step))
if (caar(step) == expr)
- {
+ {
if (!all_ints_here(sc, caar(step), cadar(step), step_vars)) /* TODO: can we lookup step_vars here? or only in do_is_safe? */
return(false);
if (is_pair(cddar(step)))
@@ -80833,7 +81363,7 @@ static bool all_ints_here(s7_scheme *sc, s7_pointer settee, s7_pointer expr, s7_
sig = c_function_signature(func);
if ((is_pair(sig)) &&
((car(sig) == sc->is_integer_symbol) || (car(sig) == sc->is_byte_symbol) ||
- ((is_pair(car(sig))) &&
+ ((is_pair(car(sig))) &&
((direct_memq(sc->is_integer_symbol, car(sig))) || (direct_memq(sc->is_byte_symbol, car(sig)))))))
return(true); /* like int-vector or length */
if (!is_all_integer(car(expr))) return(false);
@@ -80967,7 +81497,7 @@ static bool do_is_safe(s7_scheme *sc, s7_pointer body, s7_pointer stepper, s7_po
if ((val) && (is_t_integer(val)) && (!all_ints_here(sc, settee, caddr(expr), step_vars)))
return(false);
}}
- if (!do_is_safe(sc, cddr(expr), stepper, var_list, step_vars, has_set))
+ if (!do_is_safe(sc, cddr(expr), stepper, var_list, step_vars, has_set))
return(false);
if (!safe_stepper_expr(expr, stepper)) /* is step var's value used as the stored value by set!? */
return(false);
@@ -81986,7 +82516,7 @@ static goto_t op_dox(s7_scheme *sc)
s7_pointer s3 = NULL;
/* thash case -- this is dumb */
if ((f2 == fx_add_u1) && (is_t_integer(slot_value(s2))) && (cadr(endp) == slot_symbol(s2)) && (!s7_tree_memq(sc, cadr(endp), body)) &&
- (((endf == fx_num_eq_ui) && (is_t_integer(caddr(endp)))) ||
+ (((endf == fx_num_eq_ui) && (is_t_integer(caddr(endp)))) ||
((endf == fx_num_eq_us) && (s3 = opt_integer_symbol(sc, caddr(endp))) && (!s7_tree_memq(sc, caddr(endp), body)))))
{ /* (do ((i 0 (+ i 1)) (z (random 100) (random 100))) ((= i 5000000) counts) (hash-table-set! counts z (+ (or (hash-table-ref counts z) 0) 1))) */
s7_int i = integer(slot_value(s2));
@@ -83410,7 +83940,7 @@ static bool do_let(s7_scheme *sc, s7_pointer step_slot, s7_pointer scc)
return(true);
}
-static bool dotimes(s7_scheme *sc, s7_pointer code, bool one_expr)
+static bool do_let_or_dotimes(s7_scheme *sc, s7_pointer code, bool one_expr)
{
s7_pointer body = caddr(code); /* here we assume one expr in body?? */
if (((is_syntactic_pair(body)) ||
@@ -83467,7 +83997,7 @@ static goto_t op_safe_dotimes(s7_scheme *sc)
{
if (!is_unsafe_do(code))
{
- if (dotimes(sc, code, true))
+ if (do_let_or_dotimes(sc, code, true))
return(goto_safe_do_end_clauses);
set_unsafe_do(code);
}
@@ -83653,7 +84183,7 @@ static goto_t op_dotimes_p(s7_scheme *sc)
set_loop_end(sc->args, integer(let_dox2_value(sc->curlet)));
set_has_loop_end(sc->args); /* dotimes step is by 1 */
sc->code = cdr(sc->code);
- if (dotimes(sc, code, false))
+ if (do_let_or_dotimes(sc, code, false))
return(goto_do_end_clauses); /* not safe_do here */
slot_set_value(sc->args, old_init);
set_curlet(sc, old_e); /* free_cell(sc, sc->curlet) beforehand is not safe */
@@ -83831,8 +84361,21 @@ static inline s7_pointer apply_c_function(s7_scheme *sc, s7_pointer func, s7_poi
*/
}
+static s7_pointer apply_c_function_unopt(s7_scheme *sc, s7_pointer func, s7_pointer args) /* an experiment -- callgrind says this saves time */
+{
+ s7_int len = proper_list_length(args);
+ if (len < c_function_min_args(func))
+ error_nr(sc, sc->wrong_number_of_args_symbol,
+ set_elist_4(sc, wrap_string(sc, "~A: not enough arguments: (~A~{~^ ~S~})", 39), func, func, args));
+ if (c_function_max_args(func) < len)
+ error_nr(sc, sc->wrong_number_of_args_symbol,
+ set_elist_4(sc, wrap_string(sc, "~A: too many arguments: (~A~{~^ ~S~})", 37), func, func, args));
+ return(c_function_call(func)(sc, args));
+}
+
static void apply_c_rst_no_req_function(s7_scheme *sc) /* -------- C-based function that can take any number of arguments -------- */
{
+ if ((S7_DEBUGGING) && (type(sc->code) == T_C_FUNCTION_STAR)) fprintf(stderr, "%s: c_func*!\n", __func__);
sc->value = c_function_call(sc->code)(sc, sc->args);
}
@@ -84604,7 +85147,7 @@ static bool call_lambda_star(s7_scheme *sc, s7_pointer code, s7_pointer arglist)
bool target;
sc->code = opt1_lambda(code);
target = apply_safe_closure_star_1(sc);
- clear_list_in_use(arglist);
+ if (!in_heap(arglist)) clear_list_in_use(arglist);
return(target);
}
@@ -85585,7 +86128,7 @@ static void op_safe_closure_na(s7_scheme *sc)
slot_set_value(x, car(z));
symbol_set_local_slot(slot_symbol(x), id, x);
}
- clear_list_in_use(sc->args);
+ if (!in_heap(sc->args)) clear_list_in_use(sc->args);
set_curlet(sc, let);
sc->code = closure_body(sc->code);
if_pair_set_up_begin_unchecked(sc);
@@ -86431,7 +86974,8 @@ static void op_tc_when_la(s7_scheme *sc, s7_pointer code)
{
s7_pointer if_test = cadr(code), body = cddr(code), la_call, la, la_slot = let_slots(sc->curlet);
s7_function tf = fx_proc(cdr(code));
- for (la_call = body; is_pair(cdr(la_call)); la_call = cdr(la_call));
+ /* for (la_call = body; is_pair(cdr(la_call)); la_call = cdr(la_call)); */
+ la_call = opt3_pair(code);
la = cdar(la_call);
while (tf(sc, if_test) != sc->F)
{
@@ -86441,11 +86985,19 @@ static void op_tc_when_la(s7_scheme *sc, s7_pointer code)
sc->value = sc->unspecified;
}
+static s7_pointer fx_tc_when_la(s7_scheme *sc, s7_pointer arg)
+{
+ tick_tc(sc, OP_TC_WHEN_LA);
+ op_tc_when_la(sc, arg);
+ return(sc->value);
+}
+
static void op_tc_when_laa(s7_scheme *sc, s7_pointer code)
{
s7_pointer if_test = cadr(code), body = cddr(code), la, laa, laa_slot, la_call, la_slot = let_slots(sc->curlet);
s7_function tf = fx_proc(cdr(code));
- for (la_call = body; is_pair(cdr(la_call)); la_call = cdr(la_call));
+ /* for (la_call = body; is_pair(cdr(la_call)); la_call = cdr(la_call)); */
+ la_call = opt3_pair(code);
la = cdar(la_call);
laa = cdr(la);
laa_slot = next_slot(la_slot);
@@ -86460,11 +87012,19 @@ static void op_tc_when_laa(s7_scheme *sc, s7_pointer code)
sc->value = sc->unspecified;
}
+static s7_pointer fx_tc_when_laa(s7_scheme *sc, s7_pointer arg)
+{
+ tick_tc(sc, OP_TC_WHEN_LAA);
+ op_tc_when_laa(sc, arg);
+ return(sc->value);
+}
+
static void op_tc_when_l3a(s7_scheme *sc, s7_pointer code)
{
s7_pointer if_test = cadr(code), body = cddr(code), la, laa, l3a, laa_slot, l3a_slot, la_call, la_slot = let_slots(sc->curlet);
s7_function tf = fx_proc(cdr(code));
- for (la_call = body; is_pair(cdr(la_call)); la_call = cdr(la_call));
+ /* for (la_call = body; is_pair(cdr(la_call)); la_call = cdr(la_call)); */
+ la_call = opt3_pair(code);
la = cdar(la_call);
laa = cdr(la);
l3a = cdr(laa);
@@ -86483,6 +87043,13 @@ static void op_tc_when_l3a(s7_scheme *sc, s7_pointer code)
sc->value = sc->unspecified;
}
+static s7_pointer fx_tc_when_l3a(s7_scheme *sc, s7_pointer arg)
+{
+ tick_tc(sc, OP_TC_WHEN_L3A);
+ op_tc_when_l3a(sc, arg);
+ return(sc->value);
+}
+
static bool op_tc_if_a_z_l3a(s7_scheme *sc, s7_pointer code, bool z_first)
{
s7_pointer if_test = cdr(code), la_slot = let_slots(sc->curlet);
@@ -88496,12 +89063,6 @@ static void op_safe_c_ssp_1(s7_scheme *sc)
sc->value = fn_proc(sc->code)(sc, sc->t3_1);
}
-static void op_safe_c_ssp_mv(s7_scheme *sc)
-{
- sc->args = cons_unchecked(sc, lookup(sc, cadr(sc->code)), cons(sc, lookup(sc, caddr(sc->code)), sc->value)); /* not ulist here */
- sc->code = c_function_base(opt1_cfunc(sc->code));
-}
-
static void op_s(s7_scheme *sc)
{
sc->code = lookup(sc, car(sc->code));
@@ -88569,9 +89130,18 @@ static bool op_x_a(s7_scheme *sc, s7_pointer f)
return(false); /* goto APPLY */
}
-static void op_x_aa(s7_scheme *sc, s7_pointer f)
+static bool op_x_aa(s7_scheme *sc, s7_pointer f)
{
s7_pointer code = sc->code;
+ if ((((type(f) == T_C_FUNCTION) &&
+ (c_function_is_aritable(f, 2))) ||
+ ((type(f) == T_C_RST_NO_REQ_FUNCTION) &&
+ (c_function_max_args(f) >= 2))) &&
+ (!needs_copied_args(f)))
+ {
+ sc->value = c_function_call(f)(sc, with_list_t2(fx_call(sc, cdr(code)), fx_call(sc, cddr(code))));
+ return(true);
+ }
if (!is_applicable(f))
apply_error_nr(sc, f, cdr(code));
if (dont_eval_args(f))
@@ -88584,6 +89154,7 @@ static void op_x_aa(s7_scheme *sc, s7_pointer f)
else sc->args = list_2(sc, sc->value = fx_call(sc, cdr(code)), sc->args);
}
sc->code = f;
+ return(false); /* goto APPLY */
}
static void op_p_s_1(s7_scheme *sc)
@@ -88610,7 +89181,7 @@ static void op_safe_c_star_na(s7_scheme *sc)
set_car(p, fx_call(sc, args));
sc->code = opt1_cfunc(sc->code);
apply_c_function_star(sc);
- clear_list_in_use(sc->args);
+ if (!in_heap(sc->args)) clear_list_in_use(sc->args);
}
static void op_safe_c_star(s7_scheme *sc)
@@ -88656,15 +89227,6 @@ static void op_safe_c_ps_1(s7_scheme *sc)
sc->value = fn_proc(sc->code)(sc, sc->t2_1);
}
-static void op_safe_c_ps_mv(s7_scheme *sc) /* (define (hi a) (+ (values 1 2) a)) from safe_c_ps_1 */
-{
- sc->args = pair_append(sc, sc->value, list_1(sc, lookup(sc, caddr(sc->code)))); /* don't assume sc->value can be used as sc->args here! */
- sc->code = c_function_base(opt1_cfunc(sc->code));
- /* we know it's a c function here, but there are 3 choices (c_function, c_function_star, no_rst_no_req_function)
- * sc->value = fn_proc(sc->code)(sc, sc->args) might not check argnum
- */
-}
-
static void op_safe_c_sp(s7_scheme *sc)
{
s7_pointer args = cdr(sc->code);
@@ -88679,12 +89241,6 @@ static void op_safe_c_sp_1(s7_scheme *sc)
sc->value = fn_proc(sc->code)(sc, with_list_t2(sc->args, sc->value));
}
-static void op_safe_c_sp_mv(s7_scheme *sc)
-{
- sc->args = cons(sc, sc->args, sc->value); /* not ulist */
- sc->code = c_function_base(opt1_cfunc(sc->code));
-}
-
static void op_safe_add_sp_1(s7_scheme *sc)
{
if ((is_t_integer(sc->args)) && (is_t_integer(sc->value)))
@@ -88707,12 +89263,6 @@ static void op_safe_c_pc(s7_scheme *sc)
sc->code = car(args);
}
-static void op_safe_c_pc_mv(s7_scheme *sc)
-{
- sc->args = pair_append(sc, sc->value, list_1(sc, sc->args)); /* not plist! sc->value is not reusable */
- sc->code = c_function_base(opt1_cfunc(sc->code));
-}
-
static void op_safe_c_pc_1(s7_scheme *sc) {sc->value = fn_proc(sc->code)(sc, with_list_t2(sc->value, sc->args));}
static void op_safe_c_cp(s7_scheme *sc)
@@ -88864,18 +89414,9 @@ static void op_safe_c_pp_5(s7_scheme *sc)
set_cdr(p, list_1(sc, sc->value));
}
sc->code = c_function_base(opt1_cfunc(sc->code));
-}
-
-static void op_safe_c_pp_6_mv(s7_scheme *sc) /* both args mv */
-{
- s7_pointer p;
- for (p = cdr(sc->args); is_pair(cdr(p)); p = cdr(p)); /* we used to copy here: sc->args = pair_append(sc, sc->args, sc->value); */
- set_cdr(p, sc->value);
- /* fn_proc(sc->code) here is g_add_2, but we have any number of args from a values call
- * the original (unoptimized) function is c_function_base(opt1_cfunc(sc->code))
- * (let () (define (hi) (+ (values 1 2) (values 3 4))) (hi)) -> 10
- */
- sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
}
static void op_safe_c_3p(s7_scheme *sc)
@@ -88937,6 +89478,9 @@ static void op_safe_c_3p_3_mv(s7_scheme *sc)
set_cdr(p, p3);
sc->args = p1;
sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (type(sc->code) == T_C_FUNCTION)
+ sc->value = apply_c_function_unopt(sc, sc->code, sc->args);
+ else apply_c_rst_no_req_function(sc);
}
static Inline bool inline_collect_np_args(s7_scheme *sc, opcode_t op, s7_pointer args) /* called (all hits:)op_any_c_np_1/mv and eval, tlet (cb/set) */
@@ -89120,22 +89664,27 @@ static bool op_safe_c_pa(s7_scheme *sc)
static void op_safe_c_pa_1(s7_scheme *sc)
{
- sc->args = sc->value; /* fx* might change sc->value? */
+ sc->args = sc->value; /* fx* might change sc->value */
set_car(sc->t2_2, fx_call(sc, cddr(sc->code)));
set_car(sc->t2_1, sc->args);
sc->value = fn_proc(sc->code)(sc, sc->t2_1);
}
-static void op_safe_c_pa_mv(s7_scheme *sc)
+static void op_c_nc(s7_scheme *sc)
{
- s7_pointer p, val = copy_proper_list(sc, sc->value); /* this is necessary since the fx_proc below can clobber sc->value */
- gc_protect_via_stack(sc, val);
- for (p = val; is_pair(cdr(p)); p = cdr(p)); /* must be more than 1 member of list or it's not mv */
- sc->args = fx_call(sc, cddr(sc->code));
- set_cdr(p, set_plist_1(sc, sc->args)); /* do we need to copy sc->args if it is immutable (i.e. plist)? */
- sc->args = val;
- unstack_gc_protect(sc);
- sc->code = c_function_base(opt1_cfunc(sc->code));
+ if (car(sc->code) != sc->values_symbol) /* (define (f) (let ((val (catch #t (lambda () (error 1 2 3)) (lambda args (list 2 3 4))))) val)) (f) */
+ {
+ s7_pointer new_args = make_list(sc, opt3_arglen(cdr(sc->code)), sc->unused);
+ for (s7_pointer args = cdr(sc->code), p = new_args; is_pair(args); args = cdr(args), p = cdr(p)) set_car(p, car(args));
+ sc->temp3 = new_args; /* desperation? */
+ sc->value = fn_proc(sc->code)(sc, new_args);
+ sc->temp3 = sc->unused;
+ }
+ else
+ { /* opt2 = splice_in_values */
+ set_needs_copied_args(cdr(sc->code)); /* needed, see s7test, set_multiple_value which currently aborts if not a heap pointer */
+ sc->value = splice_in_values(sc, cdr(sc->code));
+ }
}
static void op_c_na(s7_scheme *sc) /* (set-cdr! lst ()) */
@@ -89163,12 +89712,6 @@ static void op_c_p(s7_scheme *sc)
sc->code = T_Pair(cadr(sc->code));
}
-static void op_c_p_mv(s7_scheme *sc) /* op_c_p_1 -> mv case: (define (hi) (format (values #f "~A ~D" 1 2))) */
-{
- sc->code = c_function_base(opt1_cfunc(sc->code)); /* see comment above */
- sc->args = copy_proper_list(sc, sc->value);
-}
-
static inline void op_c_ss(s7_scheme *sc)
{
sc->args = list_2(sc, lookup(sc, cadr(sc->code)), lookup(sc, caddr(sc->code)));
@@ -89182,13 +89725,6 @@ static void op_c_ap(s7_scheme *sc)
sc->code = caddr(sc->code);
}
-static void op_c_ap_mv(s7_scheme *sc)
-{
- clear_multiple_value(sc->value);
- sc->args = cons(sc, sc->args, sc->value);
- sc->code = c_function_base(opt1_cfunc(sc->code));
-}
-
static void op_c_aa(s7_scheme *sc)
{
gc_protect_via_stack(sc, fx_call(sc, cdr(sc->code)));
@@ -89200,7 +89736,7 @@ static void op_c_aa(s7_scheme *sc)
static inline void op_c_s(s7_scheme *sc)
{
- sc->args = list_1(sc, lookup(sc, cadr(sc->code)));
+ sc->args = list_1(sc, lookup_checked(sc, cadr(sc->code)));
sc->value = fn_proc(sc->code)(sc, sc->args);
}
@@ -89441,10 +89977,11 @@ static bool eval_car_pair(s7_scheme *sc)
{
if (!no_int_opt(code))
{
+ /* lambda */
if ((car(carc) == sc->lambda_symbol) && /* ((lambda ...) expr) */
(is_pair(cddr(carc))) && (s7_is_proper_list(sc, cddr(carc)))) /* not dotted! */
{
- set_opt3_pair(code, cddr(carc));
+ set_opt3_pair(code, cddr(carc)); /* lambda body */
if ((is_null(cadr(carc))) && (is_null(cdr(code))))
{
set_optimize_op(code, OP_F); /* ((lambda () ...)) */
@@ -89455,7 +89992,7 @@ static bool eval_car_pair(s7_scheme *sc)
if ((is_normal_symbol(caadr(carc))) && (!is_constant(sc, caadr(carc))) &&
(is_pair(cdr(code))) && (is_fxable(sc, cadr(code))))
{
- set_opt3_sym(cdr(code), caadr(carc));
+ set_opt3_sym(cdr(code), caadr(carc)); /* new curlet symbol #1 (first arg of lambda) */
if ((is_null(cdadr(carc))) && (is_null(cddr(code))))
{
fx_annotate_args(sc, cdr(code), sc->curlet); /* ((lambda (x) ...) expr) */
@@ -89479,6 +90016,7 @@ static bool eval_car_pair(s7_scheme *sc)
sc->code = carc;
if (!no_cell_opt(carc))
{
+ /* if */
if ((car(carc) == sc->if_symbol) &&
(is_pair(cdr(code))) && /* check that we got one or two args */
((is_null(cddr(code))) ||
@@ -89500,6 +90038,7 @@ static bool eval_car_pair(s7_scheme *sc)
pair_set_syntax_op(sc->code, sc->cur_op);
return(true);
}
+
push_stack_no_args(sc, OP_EVAL_ARGS, code);
if ((is_pair(cdr(code))) && (is_optimized(carc)))
{
@@ -89514,7 +90053,7 @@ static bool eval_car_pair(s7_scheme *sc)
sc->code = carc;
return(false); /* goto eval in trailers */
}
- if ((is_null(cddr(code))) && (is_symbol(cadr(code)))) /* ((x 'f82) x) in tstar for example */
+ if ((is_null(cddr(code))) && (is_symbol(cadr(code))))
{
set_optimize_op(code, OP_P_S);
set_opt3_sym(code, cadr(code));
@@ -90134,7 +90673,7 @@ static s7_pointer read_expression(s7_scheme *sc)
break;
case TOKEN_FLOAT_VECTOR:
- push_stack_no_let_no_code(sc, OP_READ_FLOAT_VECTOR, sc->w);
+ push_stack_no_let_no_code(sc, OP_READ_FLOAT_VECTOR, sc->w); /* here sc->w (vector dimensions from read_sharp) -> sc->args */
sc->tok = TOKEN_LEFT_PAREN;
break;
@@ -90448,9 +90987,17 @@ static bool op_read_int_vector(s7_scheme *sc)
static bool op_read_float_vector(s7_scheme *sc)
{
+ /* sc->value is the list of values, #r(...sc->value...) */
sc->value = (sc->args == int_one) ? g_float_vector(sc, sc->value) : g_float_multivector(sc, integer(sc->args), sc->value);
if (sc->safety > IMMUTABLE_VECTOR_SAFETY) set_immutable(sc->value);
return(stack_top_op(sc) != OP_READ_LIST);
+
+ /* to avoid making the list: sc->floats array (growable and maybe pruned),
+ * token_float_vector in read_expression: sc->value = unused, push op_read_float_vector
+ * sc->args = dims (read_sharp sc->w = dims, read_expression push_op moves it to sc->args
+ * <read each entry...>: push op_read_float_vector (no op_read_list), read, eval,
+ * fill sc->floats, when right-paren make new vector [for multidims, get list->frame]
+ */
}
static bool op_read_byte_vector(s7_scheme *sc)
@@ -90496,7 +91043,7 @@ static bool op_unknown(s7_scheme *sc)
s7_pointer code = sc->code, f = sc->last_function;
if (!f) /* can be NULL if unbound variable */
unbound_variable_error_nr(sc, car(sc->code));
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s %s %s\n", __func__, display_80(f), s7_type_names[type(f)]);
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s %s %s\n", __func__, display_80(f), s7_type_names[type(f)]);
switch (type(f))
{
@@ -90634,7 +91181,7 @@ static bool op_unknown_s(s7_scheme *sc)
s7_pointer code = sc->code, f = sc->last_function;
if (!f) unbound_variable_error_nr(sc, car(sc->code));
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s %s\n", __func__, display_80(f));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s %s\n", __func__, display_80(f));
if ((S7_DEBUGGING) && (!is_normal_symbol(cadr(code)))) fprintf(stderr, "%s[%d]: not a symbol: %s\n", __func__, __LINE__, display(code));
if ((!is_any_macro(f)) && /* if f is a macro, its argument can be unbound legitimately */
@@ -90725,7 +91272,7 @@ static bool op_unknown_a(s7_scheme *sc)
{
s7_pointer code = sc->code, f = sc->last_function;
if (!f) unbound_variable_error_nr(sc, car(sc->code));
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s %s\n", __func__, display_80(f));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s %s\n", __func__, display_80(f));
switch (type(f))
{
@@ -90782,13 +91329,14 @@ static bool op_unknown_a(s7_scheme *sc)
case T_LET:
{
s7_pointer arg1 = cadr(code);
- if (is_quoted_pair(arg1))
+ if ((is_quoted_symbol(arg1)) || (is_symbol_and_keyword(arg1)))
{
- set_opt3_con(code, cadadr(code));
+ s7_pointer sym = (is_pair(arg1)) ? cadr(arg1) : arg1;
+ if (is_keyword(sym)) sym = keyword_symbol(sym);
+ set_opt3_con(code, sym);
return(fixup_unknown_op(sc, code, f, OP_IMPLICIT_LET_REF_C));
}
- set_opt3_any(code, cadr(code));
- return(fixup_unknown_op(sc, code, f, OP_IMPLICIT_LET_REF_A));
+ return(fixup_unknown_op(sc, code, f, OP_IMPLICIT_LET_REF_A)); /* "A" might be a symbol */
}
default: break;
@@ -90804,7 +91352,7 @@ static bool op_unknown_gg(s7_scheme *sc)
bool s1, s2;
s7_pointer code = sc->code, f = sc->last_function;
if (!f) unbound_variable_error_nr(sc, car(sc->code));
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s %s\n", __func__, display_80(f));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s %s\n", __func__, display_80(f));
s1 = is_normal_symbol(cadr(code));
s2 = is_normal_symbol(caddr(code));
@@ -90941,7 +91489,7 @@ static bool op_unknown_ns(s7_scheme *sc)
int32_t num_args = opt3_arglen(cdr(code));
if (!f) unbound_variable_error_nr(sc, car(sc->code));
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s %s\n", __func__, display_80(f));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s %s\n", __func__, display_80(f));
for (s7_pointer arg = cdr(code); is_pair(arg); arg = cdr(arg))
if (!is_slot(s7_slot(sc, car(arg))))
@@ -91013,7 +91561,7 @@ static bool op_unknown_aa(s7_scheme *sc)
s7_pointer code = sc->code, f = sc->last_function;
if (!f) unbound_variable_error_nr(sc, car(sc->code));
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s %s\n", __func__, display_80(f));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s %s\n", __func__, display_80(f));
switch (type(f))
{
@@ -91101,7 +91649,7 @@ static bool op_unknown_na(s7_scheme *sc)
int32_t num_args = (is_pair(cdr(code))) ? opt3_arglen(cdr(code)) : 0;
if (!f) unbound_variable_error_nr(sc, car(sc->code));
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s[%d]: %s %s\n", __func__, __LINE__, display_80(f), display_80(sc->code));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: %s %s\n", __func__, __LINE__, display_80(f), display_80(sc->code));
if (num_args == 0) return(fixup_unknown_op(sc, code, f, OP_S)); /* via op_closure*-fx where original had 0 args, safe case -> op_safe_closure*_0 */
switch (type(f))
@@ -91219,7 +91767,7 @@ static bool op_unknown_np(s7_scheme *sc)
int32_t num_args = (is_pair(cdr(code))) ? opt3_arglen(cdr(code)) : 0;
if (!f) unbound_variable_error_nr(sc, car(sc->code));
- if (SHOW_EVAL_OPS) fprintf(stderr, "%s[%d]: %s %s %s\n", __func__, __LINE__, display_80(f), type_name(sc, f, NO_ARTICLE), display_80(sc->code));
+ if (SHOW_EVAL_OPS) fprintf(stderr, " %s[%d]: %s %s %s\n", __func__, __LINE__, display_80(f), type_name(sc, f, NO_ARTICLE), display_80(sc->code));
switch (type(f))
{
@@ -91439,7 +91987,7 @@ static noreturn void eval_apply_error_nr(s7_scheme *sc)
/* ---------------- eval ---------------- */
static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
{
- if (SHOW_EVAL_OPS) safe_print(fprintf(stderr, "eval[%d]:, %s %s %s\n", __LINE__, op_names[first_op], display_80(sc->code), display_80(sc->args)));
+ if (SHOW_EVAL_OPS) safe_print(fprintf(stderr, " eval[%d]:, %s %s %s\n", __LINE__, op_names[first_op], display_80(sc->code), display_80(sc->args)));
sc->cur_op = first_op;
goto TOP_NO_POP;
@@ -91476,7 +92024,7 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
{
/* safe c_functions */
case OP_SAFE_C_NC: if (!c_function_is_ok(sc, sc->code)) break; /* break refers to the switch statement */
- case HOP_SAFE_C_NC: sc->value = fc_call(sc, sc->code); continue; /* continue refers to the outer while loop -- unfortunate C ambiguity */
+ case HOP_SAFE_C_NC: sc->value = fn_call(sc, sc->code); continue; /* continue refers to the outer while loop -- unfortunate C ambiguity */
case OP_SAFE_C_S: if (!c_function_is_ok(sc, sc->code)) {if (op_unknown_s(sc)) goto EVAL; continue;} /* checking symbol_ctr(car(sc->code)) == 1 just slows us down */
case HOP_SAFE_C_S: inline_op_safe_c_s(sc); continue;
@@ -91512,7 +92060,6 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
case OP_SAFE_C_SSP: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_SSP: op_safe_c_ssp(sc); goto EVAL;
case OP_SAFE_C_SSP_1: op_safe_c_ssp_1(sc); continue;
- case OP_SAFE_C_SSP_MV: op_safe_c_ssp_mv(sc); goto APPLY;
case OP_SAFE_C_A: if (!c_function_is_ok(sc, sc->code)) {if (op_unknown_a(sc)) goto EVAL; continue;}
case HOP_SAFE_C_A: sc->value = fx_c_a(sc, sc->code); continue;
@@ -91626,17 +92173,14 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
case OP_SAFE_C_PS: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_PS: op_safe_c_ps(sc); goto EVAL;
case OP_SAFE_C_PS_1: op_safe_c_ps_1(sc); continue;
- case OP_SAFE_C_PS_MV: op_safe_c_ps_mv(sc); goto APPLY;
case OP_SAFE_C_PC: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_PC: op_safe_c_pc(sc); goto EVAL;
case OP_SAFE_C_PC_1: op_safe_c_pc_1(sc); continue;
- case OP_SAFE_C_PC_MV: op_safe_c_pc_mv(sc); goto APPLY;
case OP_SAFE_C_SP: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_SP: op_safe_c_sp(sc); goto EVAL;
case OP_SAFE_C_SP_1: op_safe_c_sp_1(sc); continue;
- case OP_SAFE_C_SP_MV: op_safe_c_sp_mv(sc); goto APPLY;
case OP_SAFE_CONS_SP_1: sc->value = cons(sc, sc->args, sc->value); continue;
case OP_SAFE_ADD_SP_1: op_safe_add_sp_1(sc); continue;
@@ -91648,17 +92192,16 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
case OP_SAFE_C_PA: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_PA: if (op_safe_c_pa(sc)) goto EVAL; continue;
case OP_SAFE_C_PA_1: op_safe_c_pa_1(sc); continue;
- case OP_SAFE_C_PA_MV: op_safe_c_pa_mv(sc); goto APPLY;
case OP_SAFE_C_CP: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_CP: op_safe_c_cp(sc); goto EVAL;
+ /* mv case goes through opt_sp_1 to op_safe_c_sp_mv */
case OP_SAFE_C_PP: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_PP: op_safe_c_pp(sc); goto EVAL;
case OP_SAFE_C_PP_1: op_safe_c_pp_1(sc); goto EVAL;
case OP_SAFE_C_PP_3_MV: op_safe_c_pp_3_mv(sc); goto EVAL;
- case OP_SAFE_C_PP_5: op_safe_c_pp_5(sc); goto APPLY;
- case OP_SAFE_C_PP_6_MV: op_safe_c_pp_6_mv(sc); goto APPLY;
+ case OP_SAFE_C_PP_5: op_safe_c_pp_5(sc); continue;
case OP_SAFE_C_3P: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_3P: op_safe_c_3p(sc); goto EVAL;
@@ -91667,7 +92210,7 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
case OP_SAFE_C_3P_3: op_safe_c_3p_3(sc); continue;
case OP_SAFE_C_3P_1_MV: op_safe_c_3p_1_mv(sc); goto EVAL;
case OP_SAFE_C_3P_2_MV: op_safe_c_3p_2_mv(sc); goto EVAL;
- case OP_SAFE_C_3P_3_MV: op_safe_c_3p_3_mv(sc); goto APPLY;
+ case OP_SAFE_C_3P_3_MV: op_safe_c_3p_3_mv(sc); continue;
case OP_SAFE_C_opSSq: if (!c_function_is_ok_cadr(sc, sc->code)) break;
case HOP_SAFE_C_opSSq: sc->value = fx_c_opssq(sc, sc->code); continue;
@@ -91780,7 +92323,6 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
case OP_C_P: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_C_P: op_c_p(sc); goto EVAL;
case OP_C_P_1: sc->value = fn_proc(sc->code)(sc, list_1(sc, sc->value)); continue;
- case OP_C_P_MV: op_c_p_mv(sc); goto APPLY;
case OP_C_SS: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_C_SS: op_c_ss(sc); continue;
@@ -91788,11 +92330,12 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
case OP_C_AP: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_C_AP: op_c_ap(sc); goto EVAL;
case OP_C_AP_1: sc->value = fn_proc(sc->code)(sc, sc->args = list_2(sc, sc->args, sc->value)); continue;
- case OP_C_AP_MV: op_c_ap_mv(sc); goto APPLY;
case OP_C_AA: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_C_AA: op_c_aa(sc); continue;
+ case OP_C_NC: if (!c_function_is_ok(sc, sc->code)) break;
+ case HOP_C_NC: op_c_nc(sc); continue;
case OP_C_NA: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_C_NA: op_c_na(sc); continue;
@@ -91826,13 +92369,13 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
case OP_F_NP_1: if (op_f_np_1(sc)) goto EVAL; goto BEGIN;
case OP_S: op_s(sc); goto APPLY;
- case OP_S_G: if (op_s_g(sc)) continue; goto APPLY;
- case OP_S_A: if (op_x_a(sc, lookup_checked(sc, car(sc->code)))) continue; goto APPLY;
- case OP_A_A: if (op_x_a(sc, fx_call(sc, sc->code))) continue; goto APPLY;
- case OP_S_AA: op_x_aa(sc, lookup_checked(sc, car(sc->code))); goto APPLY;
- case OP_A_AA: op_x_aa(sc, fx_call(sc, sc->code)); goto APPLY;
+ case OP_S_G: if (op_s_g(sc)) continue; goto APPLY;
+ case OP_S_A: if (op_x_a(sc, lookup_checked(sc, car(sc->code)))) continue; goto APPLY;
+ case OP_A_A: if (op_x_a(sc, fx_call(sc, sc->code))) continue; goto APPLY;
+ case OP_S_AA: if (op_x_aa(sc, lookup_checked(sc, car(sc->code)))) continue; goto APPLY;
+ case OP_A_AA: if (op_x_aa(sc, fx_call(sc, sc->code))) continue; goto APPLY;
case OP_P_S: push_stack_no_args_direct(sc, OP_P_S_1); sc->code = car(sc->code); goto EVAL;
- case OP_P_S_1: op_p_s_1(sc); goto APPLY;
+ case OP_P_S_1: op_p_s_1(sc); goto APPLY;
case OP_SAFE_C_STAR: if (!c_function_is_ok(sc, sc->code)) break;
case HOP_SAFE_C_STAR: op_safe_c_star(sc); continue;
@@ -92074,10 +92617,6 @@ static s7_pointer eval(s7_scheme *sc, opcode_t first_op)
sc->args = cons(sc, sc->value, sc->args);
op_any_closure_np_end(sc);
goto EVAL;
- case OP_ANY_CLOSURE_NP_MV: /* this is an error -- a values call confusing the optimizer's arg count */
- if (!(collect_np_args(sc, OP_ANY_CLOSURE_NP_MV, (is_multiple_value(sc->value)) ? revappend(sc, sc->value, sc->args) : cons(sc, sc->value, sc->args))))
- op_any_closure_np_end(sc);
- goto EVAL;
case OP_ANY_CLOSURE_SYM: if (!check_closure_sym(sc, 1)) break; /* (lambda args ...) */
case HOP_ANY_CLOSURE_SYM: op_any_closure_sym(sc); goto BEGIN;
@@ -93359,7 +93898,7 @@ static void save_holder_data(s7_scheme *sc, s7_pointer p)
}
if (hash_table_entries(p) > 0)
{
- s7_int len = hash_table_mask(p) + 1;
+ s7_int len = hash_table_size(p);
hash_entry_t **entries = hash_table_elements(p);
hash_entry_t **last = (hash_entry_t **)(entries + len);
if ((is_weak_hash_table(p)) && (weak_hash_iters(p) == 0))
@@ -93420,6 +93959,7 @@ void s7_heap_analyze(s7_scheme *sc)
mark_holdee(NULL, sc->temp3, "sc->temp3");
mark_holdee(NULL, sc->temp4, "sc->temp4");
mark_holdee(NULL, sc->temp5, "sc->temp5");
+ mark_holdee(NULL, sc->temp6, "sc->temp6");
mark_holdee(NULL, sc->temp7, "sc->temp7");
mark_holdee(NULL, sc->temp8, "sc->temp8");
mark_holdee(NULL, sc->temp9, "sc->temp9");
@@ -93834,6 +94374,7 @@ static s7_pointer memory_usage(s7_scheme *sc)
add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "cell-size", 9), make_integer(sc, sizeof(s7_cell)));
add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "gc-total-freed", 14), make_integer(sc, sc->gc_total_freed));
add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "gc-total-time", 13), make_real(sc, (double)(sc->gc_total_time) / ticks_per_second()));
+ add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "gc-calls", 8), make_integer(sc, sc->gc_calls));
add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "small_ints", 10),
cons(sc, make_integer(sc, NUM_SMALL_INTS), kmg(sc, NUM_SMALL_INTS * (sizeof(s7_pointer) + sizeof(s7_cell)))));
@@ -93847,6 +94388,27 @@ static s7_pointer memory_usage(s7_scheme *sc)
for (gc_obj_t *g = sc->semipermanent_lets; g; i++, g = (gc_obj_t *)(g->nxt));
add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "permanent_lets", 14), make_integer(sc, i));
+ /* safe_lists */
+ {
+ s7_int live = 0, in_use = 0;
+ for (i = 1; i < NUM_SAFE_LISTS; i++)
+ if (is_pair(sc->safe_lists[i]))
+ {
+ live++;
+ if (list_is_in_use(sc->safe_lists[i])) in_use++;
+ }
+ sc->w = sc->nil;
+#if S7_DEBUGGING
+ for (i = NUM_SAFE_LISTS - 1; i > 0; i--)
+ sc->w = cons(sc, make_integer(sc, sc->safe_list_uses[i]), sc->w);
+#endif
+ add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "safe-lists", 10),
+ list_3(sc, make_integer(sc, live), make_integer(sc, in_use), sc->w));
+#if S7_DEBUGGING
+ sc->w = sc->unused;
+#endif
+ }
+
/* show how many active cells there are of each type (this is where all the memory_usage cpu time goes) */
for (i = 0; i < NUM_TYPES; i++) ts[i] = 0;
for (k = 0; k < sc->heap_size; k++)
@@ -93930,7 +94492,7 @@ static s7_pointer memory_usage(s7_scheme *sc)
for (i = 0, gp = sc->hash_tables; i < gp->loc; i++)
{
s7_pointer v = gp->list[i];
- hlen += ((hash_table_mask(v) + 1) * sizeof(hash_entry_t *));
+ hlen += ((hash_table_size(v)) * sizeof(hash_entry_t *));
hlen += (hash_table_entries(v) * sizeof(hash_entry_t));
}
all_len += all_len;
@@ -94014,7 +94576,7 @@ static s7_pointer memory_usage(s7_scheme *sc)
sc->w = cons(sc, make_integer(sc, k), sc->w);
#if S7_DEBUGGING
num_blocks += k;
- add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "blocks allocated", 16),
+ add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "blocks-allocated", 16),
cons(sc, make_integer(sc, num_blocks), make_integer(sc, sc->blocks_allocated)));
#endif
add_slot_unchecked_with_id(sc, mu_let, make_symbol(sc, "free-lists", 10),
@@ -94027,6 +94589,7 @@ static s7_pointer memory_usage(s7_scheme *sc)
((2 * sc->heap_size + SYMBOL_TABLE_SIZE + sc->stack_size) * sizeof(s7_pointer)) +
len + all_len));
}
+
s7_gc_unprotect_at(sc, gc_loc);
return(mu_let);
}
@@ -94311,7 +94874,6 @@ static s7_pointer set_bignum_precision(s7_scheme *sc, int32_t precision)
mpc_set_default_precision(bits);
bpi = big_pi(sc);
global_slot(sc->pi_symbol)->object.slt.val = bpi; /* don't check immutable flag here (if debugging) -- i.e. don't use slot_set_value! */
- slot_set_value(initial_slot(sc->pi_symbol), bpi); /* if #_pi occurs after precision set, make sure #_pi is still legit (not a free cell) */
return(sc->F);
}
#endif
@@ -94956,9 +95518,15 @@ static void init_fx_function(void)
fx_function[OP_BEGIN_NA] = fx_begin_na;
fx_function[OP_BEGIN_AA] = fx_begin_aa;
fx_function[OP_LET_TEMP_A_A] = fx_let_temp_a_a;
- fx_function[OP_IMPLICIT_S7_STARLET_REF_S] = fx_implicit_s7_starlet_ref_s;
fx_function[OP_WITH_LET_S] = fx_with_let_s;
+ fx_function[OP_IMPLICIT_S7_STARLET_REF_S] = fx_implicit_s7_starlet_ref_s;
+ fx_function[OP_IMPLICIT_LET_REF_C] = fx_implicit_let_ref_c;
+ fx_function[OP_IMPLICIT_HASH_TABLE_REF_A] = fx_implicit_hash_table_ref_a;
+ fx_function[OP_IMPLICIT_PAIR_REF_A] = fx_implicit_pair_ref_a;
+ fx_function[OP_IMPLICIT_C_OBJECT_REF_A] = fx_implicit_c_object_ref_a;
+ fx_function[OP_IMPLICIT_VECTOR_REF_A] = fx_implicit_vector_ref_a;
+
/* these are ok even if a "z" branch is taken -- in that case the body does not have the is_optimized bit, so is_fxable returns false */
fx_function[OP_TC_AND_A_OR_A_LA] = fx_tc_and_a_or_a_la;
fx_function[OP_TC_OR_A_AND_A_LA] = fx_tc_or_a_and_a_la;
@@ -94998,6 +95566,9 @@ static void init_fx_function(void)
fx_function[OP_TC_LET_UNLESS_LAA] = fx_tc_let_unless_laa;
fx_function[OP_TC_LET_COND] = fx_tc_let_cond;
fx_function[OP_TC_COND_A_Z_A_LAA_LAA] = fx_tc_cond_a_z_a_laa_laa;
+ fx_function[OP_TC_WHEN_LA] = fx_tc_when_la;
+ fx_function[OP_TC_WHEN_LAA] = fx_tc_when_laa;
+ fx_function[OP_TC_WHEN_L3A] = fx_tc_when_l3a;
fx_function[OP_RECUR_IF_A_A_opA_LAq] = fx_recur_if_a_a_opa_laq;
fx_function[OP_RECUR_IF_A_opA_LAq_A] = fx_recur_if_a_opa_laq_a;
@@ -95616,9 +96187,6 @@ static void init_features(s7_scheme *sc)
s7_provide(sc, "solaris");
#endif
-#ifdef __SUNPRO_C
- s7_provide(sc, "sunpro_c");
-#endif
#ifdef __clang__
s7_provide(sc, "clang");
#endif
@@ -95846,7 +96414,7 @@ static void init_setters(s7_scheme *sc)
s7_make_safe_function(sc, "#<set-hash-table-key-typer>", g_set_hash_table_key_typer, 2, 0, false, "hash-table-key-typer setter"));
c_function_set_setter(global_value(sc->hash_table_value_typer_symbol),
s7_make_safe_function(sc, "#<set-hash-table-value-typer>", g_set_hash_table_value_typer, 2, 0, false, "hash-table-value-typer setter"));
- c_function_set_setter(global_value(sc->symbol_symbol),
+ c_function_set_setter(global_value(sc->symbol_symbol),
s7_make_safe_function(sc, "#<symbol-set>", g_symbol_set, 2, 0, true, "symbol setter"));
}
@@ -96477,7 +97045,7 @@ static void init_rootlet(s7_scheme *sc)
sc->cyclic_sequences_symbol = defun("cyclic-sequences", cyclic_sequences, 1, 0, false);
sc->call_cc_symbol = semisafe_defun("call/cc", call_cc, 1, 0, false);
- sc->call_with_current_continuation_symbol = unsafe_defun("call-with-current-continuation", call_cc, 1, 0, false);
+ sc->call_with_current_continuation_symbol = semisafe_defun("call-with-current-continuation", call_cc, 1, 0, false);
sc->call_with_exit_symbol = semisafe_defun("call-with-exit", call_with_exit, 1, 0, false);
sc->load_symbol = semisafe_defun("load", load, 1, 1, false);
@@ -96780,6 +97348,9 @@ s7_scheme *s7_init(void)
for (i = NUM_SAFE_PRELISTS; i < NUM_SAFE_LISTS; i++)
sc->safe_lists[i] = sc->nil;
sc->current_safe_list = 0;
+#if S7_DEBUGGING
+ local_memset((void *)(sc->safe_list_uses), 0, NUM_SAFE_LISTS);
+#endif
sc->input_port_stack_size = INPUT_PORT_STACK_INITIAL_SIZE;
sc->input_port_stack = (s7_pointer *)Malloc(sc->input_port_stack_size * sizeof(s7_pointer));
@@ -96818,6 +97389,7 @@ s7_scheme *s7_init(void)
sc->temp3 = sc->unused;
sc->temp4 = sc->unused;
sc->temp5 = sc->unused;
+ sc->temp6 = sc->unused;
sc->temp7 = sc->unused;
sc->temp8 = sc->unused;
sc->temp9 = sc->unused;
@@ -96924,7 +97496,7 @@ s7_scheme *s7_init(void)
/* keep the symbol table out of the heap */
sc->symbol_table = (s7_pointer)Malloc(sizeof(s7_cell)); /* was calloc 14-Apr-22 */
- full_type(sc->symbol_table) = T_VECTOR | T_UNHEAP;
+ full_type(sc->symbol_table) = T_VECTOR | T_UNHEAP | T_SYMBOL_TABLE;
vector_length(sc->symbol_table) = SYMBOL_TABLE_SIZE;
vector_elements(sc->symbol_table) = (s7_pointer *)Malloc(SYMBOL_TABLE_SIZE * sizeof(s7_pointer));
vector_getter(sc->symbol_table) = t_vector_getter;
@@ -97045,6 +97617,7 @@ s7_scheme *s7_init(void)
sc->shadow_rootlet = sc->rootlet;
sc->unlet_slots = slot_end;
sc->objstr_max_len = S7_INT64_MAX;
+ sc->let_temp_hook = sc->nil;
init_wrappers(sc);
init_standard_ports(sc);
@@ -97077,9 +97650,6 @@ s7_scheme *s7_init(void)
gmp_randseed(random_gmp_state(p), sc->mpz_1);
sc->pi_symbol = s7_define_constant(sc, "pi", big_pi(sc)); /* not actually a constant because it changes with bignum-precision */
- set_initial_slot(sc->pi_symbol, make_semipermanent_slot(sc, sc->pi_symbol, big_pi(sc))); /* s7_make_slot does not handle this */
- slot_set_next(initial_slot(sc->pi_symbol), sc->unlet_slots);
- sc->unlet_slots = initial_slot(sc->pi_symbol);
s7_provide(sc, "gmp");
#else
random_seed(p) = (uint64_t)my_clock(); /* used to be time(NULL), but that means separate threads can get the same random number sequence */
@@ -97232,16 +97802,18 @@ s7_scheme *s7_init(void)
* Otherwise, the cond-expand has no effect." The code above returns #<unspecified>, but I read that prose to say that
* (begin 23 (cond-expand (surreals 1) (foonly 2))) should evaluate to 23.
*/
+ /* make-polar, call-with-values, make-hook, hook-functions, multiple-value-bind, cond-expand, and reader-cond can't
+ * set the initial_value to the global_value so that #_... can be used because the global_value is not semipremanent.
+ */
#endif
#if S7_DEBUGGING
s7_define_function(sc, "report-missed-calls", g_report_missed_calls, 0, 0, false, NULL); /* tc/recur tests in s7test.scm */
if (strcmp(op_names[HOP_SAFE_C_PP], "h_safe_c_pp") != 0) fprintf(stderr, "c op_name: %s\n", op_names[HOP_SAFE_C_PP]);
if (strcmp(op_names[OP_SET_WITH_LET_2], "set_with_let_2") != 0) fprintf(stderr, "set op_name: %s\n", op_names[OP_SET_WITH_LET_2]);
- if (NUM_OPS != 933) fprintf(stderr, "size: cell: %d, block: %d, max op: %d, opt: %d\n", (int)sizeof(s7_cell), (int)sizeof(block_t), NUM_OPS, (int)sizeof(opt_info));
+ if (NUM_OPS != 926) fprintf(stderr, "size: cell: %d, block: %d, max op: %d, opt: %d\n", (int)sizeof(s7_cell), (int)sizeof(block_t), NUM_OPS, (int)sizeof(opt_info));
/* cell size: 48, 120 if debugging, block size: 40, opt: 128 or 280 */
#endif
-
return(sc);
}
@@ -97611,70 +98183,71 @@ int main(int argc, char **argv)
#endif
#endif
-/* -------------------------------------------------------------
- * 19.9 20.9 21.0 22.0 23.0 24.0 24.1
- * -------------------------------------------------------------
+/* --------------------------------------------------------------
+ * 19.9 20.9 21.0 22.0 23.0 24.0 24.2
+ * --------------------------------------------------------------
* tpeak 148 115 114 108 105 102 102
* tref 1081 691 687 463 459 464 466
- * index 1026 1016 973 967 972 974
- * tmock 1177 1165 1057 1019 1032 1037
+ * index 1026 1016 973 967 972 973
+ * tmock 1177 1165 1057 1019 1032 1031
* tvect 3408 2519 2464 1772 1669 1497 1452
* tauto 2562 2048 1729 1704
- * timp 2637 2575 1930 1694 1740 1738
- * texit 1884 1778 1741 1770 1771
+ * texit 1884 1930 1950 1778 1741 1770 1771
* s7test 1873 1831 1818 1829 1830 1855
* lt 2222 2187 2172 2150 2185 1950 1950
- * thook 7651 2590 2030 2046 2046
- * dup 3805 3788 2492 2239 2097 2042
+ * thook 7651 2590 2030 2046 2008
+ * dup 3805 3788 2492 2239 2097 2076
* tcopy 8035 5546 2539 2375 2386 2386
- * tread 2440 2421 2419 2408 2405 2402
- * trclo 8031 2735 2574 2454 2445 2449 2470
+ * tread 2440 2421 2419 2408 2405 2259
* titer 3657 2865 2842 2641 2509 2449 2446
- * tload 3046 2404 2566 2444
+ * trclo 8031 2735 2574 2454 2445 2449 2470
+ * tload 3046 2404 2566 2549
* fbench 2933 2688 2583 2460 2430 2478 2559
- * tmat 3065 3042 2524 2578 2590 2576
+ * tmat 3065 3042 2524 2578 2590 2573
* tsort 3683 3105 3104 2856 2804 2858 2858
- * tobj 4016 3970 3828 3577 3508 3502
+ * tobj 4016 3970 3828 3577 3508 3515
* teq 4068 4045 3536 3486 3544 3537
* tio 3816 3752 3683 3620 3583 3601
* tmac 3950 3873 3033 3677 3677 3680
- * tcase 4960 4793 4439 4430 4439 4467
- * tlet 9166 7775 5640 4450 4427 4457 4466
- * tclo 6362 4787 4735 4390 4384 4474 4447
+ * tclo 6362 4787 4735 4390 4384 4474 4339
+ * tcase 4960 4793 4439 4430 4439 4443
+ * tlet 9166 7775 5640 4450 4427 4457 4483
* tfft 7820 7729 4755 4476 4536 4543
- * tstar 6139 5923 5519 4449 4550 4604
* tmap 8869 8774 4489 4541 4586 4592
+ * tstar 6139 5923 5519 4449 4550 4570
* tshoot 5525 5447 5183 5055 5034 5034
* tform 5357 5348 5307 5316 5084 5095
- * tstr 10.0 6880 6342 5488 5162 5180 5180
+ * tstr 10.0 6880 6342 5488 5162 5180 5197
* tnum 6348 6013 5433 5396 5409 5423
- * tgsl 8485 7802 6373 6282 6208 6193
+ * tgsl 8485 7802 6373 6282 6208 6186
* tari 15.0 13.0 12.7 6827 6543 6278 6278
- * tlist 9219 7896 7546 6558 6240 6300 6300
- * tset 6260 6364 6402
+ * tlist 9219 7896 7546 6558 6240 6300 6298
+ * tset 6260 6364 6408
* trec 19.5 6936 6922 6521 6588 6583 6583
- * tleft 11.1 10.4 10.2 7657 7479 7627 7622
- * tlamb 7941 7941
+ * tleft 11.1 10.4 10.2 7657 7479 7627 7614
+ * tmisc 8142 7631 7745
+ * tlamb 8003 7941 7936
* tgc 11.9 11.1 8177 7857 7986 8005
- * tmisc 8488 7862 8041
- * thash 11.8 11.7 9734 9479 9526 9542
+ * thash 11.8 11.7 9734 9479 9526 9260
* cb 12.9 11.2 11.0 9658 9564 9609 9635
+ * tmap-hash 1671.0 1467.0 10.3
+ * timp 16.4 15.8 11.8 11.7 11.7 10.4
+ * tmv 16.0 15.4 14.7 14.5 14.4 11.9
* tgen 11.2 11.4 12.0 12.1 12.2 12.3
* tall 15.9 15.6 15.6 15.6 15.6 15.1 15.1
* calls 36.7 37.5 37.0 37.5 37.1 37.0
* sg 55.9 55.8 55.4 55.2
* tbig 177.4 175.8 156.5 148.1 146.2 146.3
- * -------------------------------------------------------------
+ * --------------------------------------------------------------
*
* snd-region|select: (since we can't check for consistency when set), should there be more elaborate writable checks for default-output-header|sample-type?
* fx_chooser can't depend on the is_global bit because it sees args before local bindings reset that bit, get rid of these if possible
* lots of is_global(sc->quote_symbol)
- * do bodies use cell_optimize which is not optimal
- * set_pending_value wrapped (big, rclo)
- * wrapped form of FFI funcs? reals/ints? let wrappers seem doable [in safe-do etc]
- * more string_uncopied, read-line-uncopied (etc), generics uncopied?
- * op-*-vector etc
- * hash_string is very slow? thash add 1M strs/syms and check -- for normal strings/hash-tables, it's hashing on the last 1..2 chars!
- * gmp+debugging snd (snd-test): g_vector_set[41123]: not a number, but a big real (type: 17): Abort (core dumped)
- * T_Num does not include bignums?! tests7 tries this?
+ * safe/mutable lists in opt? savable mutable ints? (wrappers+in-use-flag?) second-layer of base safe_lists? need counts of fallbacks
+ * timing: setter, check op_s|a|x_* and trailers -- what is currently unopt'd
+ * t683 extended -> timp?
+ * op_x_aa: ss star, sc|cc imp
+ * strings, format individual tests
+ * let-temp in opt*, save slot (let), hash-entry (hash+resize check), maybe also for set! in opt*
+ * odd equal messages in t101-aux-*, t718 snd-test troubles, pair_to_port free cell
*/
diff --git a/s7.h b/s7.h
index 8116283..6232c10 100644
--- a/s7.h
+++ b/s7.h
@@ -2,7 +2,7 @@
#define S7_H
#define S7_VERSION "10.8"
-#define S7_DATE "2-Feb-2024"
+#define S7_DATE "12-Mar-2024"
#define S7_MAJOR_VERSION 10
#define S7_MINOR_VERSION 8
diff --git a/s7test.scm b/s7test.scm
index bfd1c87..80f5b19 100644
--- a/s7test.scm
+++ b/s7test.scm
@@ -1269,6 +1269,11 @@ static s7_pointer g_blocks(s7_scheme *sc, s7_pointer args)
return(s7_copy(sc, s7_list(sc, 1, args)));
}
+static s7_pointer g_2_values(s7_scheme *sc, s7_pointer args)
+{
+ return(s7_values(sc, s7_list(sc, 2, s7_car(args), s7_cadr(args))));
+}
+
static s7_pointer g_subblock(s7_scheme *sc, s7_pointer args)
{
#define g_subblock_help \"(subblock block (start 0) end) returns a portion of the block.\"
@@ -1481,6 +1486,8 @@ void block_init(s7_scheme *sc)
s7_define_safe_function(sc, \"block-append\", g_block_append, 0, 0, true, g_block_append_help);
s7_define_safe_function(sc, \"block-reverse!\", g_block_reverse_in_place, 1, 0, false, g_block_reverse_in_place_help);
s7_define_typed_function(sc, \"block?\", g_is_block, 1, 0, false, g_is_block_help, g_is_block_sig);
+ s7_define_safe_function_star(sc, \"values2\", g_2_values, \"arg1 arg2\", \"values test for function*\");
+ s7_define_function_star(sc, \"unsafe-values2\", g_2_values, \"arg1 arg2\", \"values test for function*\");
s7_define_safe_function_star(sc, \"blocks1\", g_blocks, \"(frequency 4)\", \"test for function*\");
s7_define_safe_function_star(sc, \"blocks\", g_blocks, \"(frequency 4) (scaler 1)\", \"test for function*\");
s7_define_safe_function_star(sc, \"blocks3\", g_blocks, \"(frequency 4) (scaler 1) (asdf 32)\", \"test for function*\");
@@ -1551,6 +1558,7 @@ void block_init(s7_scheme *sc)
s7_c_type_set_free(sc, g_cycle_type, g_cycle_free);
s7_c_type_set_to_list(sc, g_cycle_type, g_cycle_to_list);
s7_c_type_set_copy(sc, g_cycle_type, g_cycle_copy);
+ s7_c_type_set_ref(sc, g_cycle_type, g_cycle_ref);
s7_c_type_set_set(sc, g_cycle_type, g_cycle_implicit_set);
s7_define_safe_function(sc, \"cycle-ref\", g_cycle_ref, 1, 0, false, \"no help here\");
s7_define_safe_function(sc, \"cycle-set!\", g_cycle_set, 2, 0, false, \"no help here\");
@@ -1624,8 +1632,7 @@ void block_init(s7_scheme *sc)
(system (string-append "gcc -fPIC -c s7test-block.c " flags))
(system "gcc s7test-block.o -shared -o s7test-block.so -ldl -lm -Wl,-export-dynamic"))))
- (let ((new-env (sublet (curlet) (cons 'init_func 'block_init)))) ; load calls init_func
- (load "s7test-block.so" new-env))
+ (let ((e (sublet (curlet) (cons 'init_func 'block_init)))) (load "s7test-block.so" e))
(define _c_obj_ (make-block 16))
(unless (immutable? (block-let _c_obj_)) (format *stderr* "~S's let is mutable~%" _c_obj_))) ; with-block
@@ -2696,9 +2703,12 @@ void block_init(s7_scheme *sc)
(test (equal? '(1/0) '(1/0)) #f)
(test (equal? '1/0 '1/0) #f)
+(test (+ '1 '2) 3)
(test (equal? '(+nan.0) '(+nan.0)) #f)
(test (equal? (list +nan.0) (list +nan.0)) #f)
(test (equal? (vector +nan.0) (vector +nan.0)) #f)
+(test (let ((V (vector +nan.0))) (equal? V (copy V))) #f) ; sigh...
+(test (let ((V (vector +nan.0))) (equal? V V)) #t)
(test (equal? #(1/0) #(1/0)) #f)
(test (equal? #r(0.0) #r(-0.0)) #t)
(test (equal? (float-vector) (int-vector)) #t)
@@ -3872,14 +3882,9 @@ void block_init(s7_scheme *sc)
(set! (h2 (complex +nan.0 0.0)) 2)
(test (equivalent? h1 h2) #f)
)))
-(test (equivalent? (let ((h (make-hash-table 8 equivalent?)))
- (set! (h (lambda (x) (or x))) (log 0))
- h)
- (eval-string (object->string (let ((h (make-hash-table 8 equivalent?)))
- (set! (h (lambda (x) (or x))) (log 0))
- h)
- :readable)))
- #t)
+(test (equivalent? (let ((h (make-hash-table 8 equivalent?))) (set! (h #_abs) (log 0)) h)
+ (eval-string (object->string (let ((h (make-hash-table 8 equivalent?))) (set! (h #_abs) (log 0)) h) :readable)))
+ #t)
;;; ----------------
@@ -5072,6 +5077,7 @@ void block_init(s7_scheme *sc)
(test (symbol? if) #f)
(test (symbol? quote) #f)
(test (symbol? '(AB\c () xyz)) #f)
+(test (symbol? '.i) #t)
(for-each
(lambda (arg)
@@ -16968,6 +16974,91 @@ i" (lambda (p) (eval (read p)))) pi)
(set! (ht 1/0) :a)
(test (ht 1/0) #f)) ; NaNs aren't equal?
+(let ()
+ (define nan1 +nan.0)
+ (define nan2 -nan.0)
+
+ (let ((H (hash-table)))
+ (set! (H nan1) 1)
+ (test (H nan1) #f)
+ (test (H nan2) #f)
+ (set! (H nan2) 2)
+ (test (object->string H) "(hash-table +nan.0 2 +nan.0 1)")
+ (test (H nan1) #f)
+ (test (H nan2) #f)
+ (test (H +nan.0) #f)
+ (test (H -nan.0) #f)
+ (set! (H -nan.0) 3)
+ (test (object->string H) "(hash-table +nan.0 3 +nan.0 2 +nan.0 1)"))
+
+ (define vn1 (float-vector +nan.0))
+ (define vn2 (float-vector -nan.0))
+
+ (let ((H (hash-table)))
+ (set! (H vn1) 1)
+ (test (H vn1) 1)
+ (set! (H vn2) 2)
+ (test (object->string H) "(hash-table #r(+nan.0) 2 #r(+nan.0) 1)")
+ (test (equal? vn1 vn1) #t)) ; see below
+
+ (let ((H (hash-table)))
+ (set! (H #(0)) 1)
+ (test (H #(0)) 1)
+ (test (H #(0.0)) #f)
+ (test (H (vector 0)) 1))
+
+ (let ((H (hash-table))
+ (L1 (list +nan.0))
+ (L2 (list +nan.0)))
+ (set! (H L1) 1)
+ (test (H L1) 1)
+ (test (H L2) #f)
+ (test (equal? (list +nan.0) (list +nan.0)) #f)
+ (test (equal? L1 L1) #t))
+ ;; is this inconsistent? It's the same object, so its contents aren't relevant??
+ ;; otherwise anything with a NaN in it can't be equal? even to itself -- seems perverse.
+
+ ;; guile:
+ ;; scheme@(guile-user)> (equal? (vector +nan.0) (vector +nan.0))
+ ;; $1 = #t
+ ;; s7:
+ ;; <1> (equal? (vector +nan.0) (vector +nan.0))
+ ;; #f
+ ;; <2> (equal? (float-vector +nan.0) (float-vector +nan.0))
+ ;; #f
+ ;; <3> (equivalent? (float-vector +nan.0) (float-vector +nan.0))
+ ;; #t
+
+ (let ((typed-hash (make-hash-table 8 eq? (cons symbol? integer?))))
+ (define (f) (do ((i 0 (+ i 1))) ((= i 3)) (char-upcase (string-ref typed-hash else))))
+ (test (f) 'error)) ; opt_p_pp_sf_href problem
+ (let ((imfv2 #r2d((1 2 3) (4 5 6)))
+ (V_2 (let ((v (make-vector 1))) (set! (v 0) v) v)))
+ (define (f) (do ((i 0 (+ i 1))) ((= i 3)) (imfv2 V_2 (hash-table-ref or call-with-exit))))
+ (test (f) 'error)) ; and another!
+ (let ()
+ (define (func) (let ((lt (inlet 'a 1))) (do ((i 0 (+ i 1))) ((= i 2)) (lt or))))
+ (test (func) 'error)) ; and another!!
+
+ (let ((H (make-hash-table 8 equivalent?)))
+ (set! (H nan1) 1)
+ (test (H nan1) 1)
+ (test (H nan2) 1)
+ (set! (H nan2) 2)
+ (test (object->string H) "(hash-table +nan.0 2)")
+ (test (H nan1) 2)
+ (test (H nan2) 2)
+ (test (H +nan.0) 2)
+ (test (H -nan.0) 2)
+ (set! (H -nan.0) 3)
+ (test (object->string H) "(hash-table +nan.0 3)"))
+
+ (let ((H (make-hash-table 8 equivalent?)))
+ (set! (H vn1) 1)
+ (test (H vn1) 1)
+ (set! (H vn2) 2)
+ (test (object->string H) "(hash-table #r(+nan.0) 2)")))
+
(test (hash-table 'a #f 'b 1) (hash-table 'b 1))
(test (hash-table 'a #f) (hash-table))
@@ -17788,6 +17879,31 @@ i" (lambda (p) (eval (read p)))) pi)
(fill! ht ())
(test (ht 'key) ()))
+(let ((H (hash-table)))
+ (test (set! (H (inlet 'a 1 'b 2 'c 3)) 1) 1)
+ (test (H (inlet 'a 1 'b 2 'c 3)) 1)
+ (test (set! (H (inlet 'b 2 'c 3 'a 1)) 2) 2)
+ (test (H (inlet 'a 1 'b 2 'c 3)) 2)
+ (test (equal? (inlet 'b 2 'c 3 'a 1) (inlet 'a 1 'b 2 'c 3)) #t)
+ (test H (hash-table (inlet 'a 1 'b 2 'c 3) 2)))
+
+(let ((H (hash-table)))
+ (test (set! (H (c-pointer 0)) 1) 1)
+ (test (H (c-pointer 0)) 1)
+ (test (set! (H (c-pointer 0)) 2) 2)
+ (test (H (c-pointer 0)) 2)
+ (test (set! (H (c-pointer 1)) 3) 3)
+ (test (hash-table-entries H) 2)
+ (test (H (c-pointer 1)) 3)
+ (test (equal? (c-pointer 0) (c-pointer 0)) #t)
+ (test (eq? (c-pointer 0) (c-pointer 0)) #f))
+
+(let ((H (hash-table)))
+ (test (hash-table-set! H #asdf 1) 1)
+ (test (hash-table-ref H #asdf) 1)
+ (test (set! (H #<undefined>) 2) 2)
+ (test (H #<undefined>) 2))
+
(let ((ht (make-hash-table)))
(test (hash-table-set! ht #\a 'key) 'key)
(for-each
@@ -29294,7 +29410,7 @@ in s7:
;;; --------------------------------------------------------------------------------
-;;; do
+;;; do
;;; --------------------------------------------------------------------------------
(test (do () (#t 1)) 1)
@@ -29546,7 +29662,7 @@ in s7:
(set! x (* i j))
(cos (+ x (* y 2.3))))))
(test (f2) 1)
-
+
(define (f3)
(let ((x 0)
(y 2))
@@ -29556,7 +29672,7 @@ in s7:
(set! y (* i 2.1))
(cos (+ x (* y 2.1))))))
(test (f3) 4.2)
-
+
(define (f4)
(let ((x 0)
(y 2))
@@ -29566,7 +29682,7 @@ in s7:
(set! x (* i j))
(cos (+ x (* y 2.1))))))
(test (f4) 4.4)
-
+
(define (f5)
(let ((x 0))
(do ((i 0 (+ i 1))
@@ -29574,7 +29690,7 @@ in s7:
((= i 3) x)
(set! x (max x (* i j))))))
(test (f5) 4)
-
+
(define (f5a)
(let ((x 0)
(i 2.2)
@@ -29584,7 +29700,7 @@ in s7:
((= i 3) x)
(set! x (max x (* i j))))))
(test (f5a) 4)
-
+
(define (f6)
(let ((sum 0))
(do ((i 0 (+ i 1)))
@@ -29692,7 +29808,7 @@ in s7:
(set! y (round (+ y 1)))
(vector-set! v i y))))
(test (f1) #(2 3 4))
-
+
(define (f2)
(let ((v (vector 0 0 0))
(y 1.0))
@@ -29705,17 +29821,17 @@ in s7:
(test (let () (define-constant _bg_ 0) (define (f) (do ((x 0) (i 0 (+ i 1))) ((= i 1) x) (set! x (set! _bg_ x)))) (f)) 0) ; op_set1 s7_is_eqv
(let () ; opt_dotimes coverage tests (some miss their target...)
- (define (od1)
+ (define (od1)
(let ((fv #2r((0 1 2) (2 3 4))))
(do ((i 0 (+ i 1))) ((= i 2) fv) (float-vector-set! fv (+ i 0) (+ i 1) (* 2.0 3.0)))))
(test (od1) #r2d((0.0 6.0 2.0) (2.0 3.0 6.0)))
(define (od2)
(let ((y 0) (z 0.0))
- (do ((i 0 (+ i 1))) ((= i 3) y) (if (= (+ z 1) 2.2) (display (+ z 1))))))
+ (do ((i 0 (+ i 1))) ((= i 3) y) (if (= (+ z 1) 2.2) (display (+ z 1))))))
(test (od2) 0)
(define (od3)
(let ((len 2) (lst '(0 1 2 3)))
- (do ((i 0 (+ i 1))) ((= i len)) (if (not (= (list-ref lst i) i)) (display "oops")))))
+ (do ((i 0 (+ i 1))) ((= i len)) (if (not (= (list-ref lst i) i)) (display "oops")))))
(test (od3) #t)
(define (od4)
(let ((size 2) (vct-hash (hash-table #r(0.0) 0 #r(1.0) 1)))
@@ -29726,18 +29842,18 @@ in s7:
(do ((i 0 (+ i 1))) ((= i size) (vector-ref v 0)) (vector-set! v i 2))))
(test (od5) 2)
(define (od51)
- (let ((v #u(0 1 2)) (size 2))
+ (let ((v #u(0 1 2)) (size 2))
(do ((i 0 (+ i 1))) ((= i size) (byte-vector-ref v 0)) (byte-vector-set! v i 2))))
(test (od51) 2)
(define (od6)
- (do ((i 0 (+ i 1))) ((= i 1)) (char-alphabetic? (string-ref "asdf" 1))))
+ (do ((i 0 (+ i 1))) ((= i 1)) (char-alphabetic? (string-ref "asdf" 1))))
(test (od6) #t)
(define (od7)
- (let ((len 2) (mx 0) (loc 0) (vect #(0 1 2)))
+ (let ((len 2) (mx 0) (loc 0) (vect #(0 1 2)))
(do ((i 0 (+ i 1))) ((= i len) (list mx loc)) (when (> (abs (vect i)) mx) (set! mx (vect i)) (set! loc i)))))
(test (od7) '(1 1))
(define (od8)
- (let ((sum 0) (v #2d((0 0) (1 1) (2 2))) (size/10 1))
+ (let ((sum 0) (v #2d((0 0) (1 1) (2 2))) (size/10 1))
(do ((k 0 (+ k 1))) ((= k 1) sum) (do ((i 0 (+ i 1))) ((= i size/10)) (set! sum (+ sum (round (vector-ref v k i))))))))
(test (od8) 0)
(define (od9)
@@ -32436,6 +32552,7 @@ yow...
(test (let ((x 32)) (((lambda (x) (lambda (y) x)) 3) x)) 3)
(test ((call/cc (lambda (return) (return +))) 3 2) 5)
(test ((call-with-values (lambda () (values +)) (lambda (x) x)) 3 2) 5)
+;(unless pure-s7 (test ((#_call-with-values (lambda () (values +)) (lambda (x) x)) 3 2) 5)) ; not semipermanent
(test ((case '+ ((+) +)) 3 2) 5)
(test ((case '+ ((-) -) (else +)) 3 2) 5)
(test ((call/cc (lambda (return) (dynamic-wind (lambda () #f) (lambda () (return +)) (lambda () #f)))) 3 2) 5)
@@ -35684,6 +35801,9 @@ yow...
(test (list (values (values 1 2 3))) '(1 2 3))
(test (values (values 'one)) 'one)
(test (list (c-macro-with-values 1 2 3)) '(1 2 3))
+(test (let () (define (f) (list (values (int-vector (values 1 2)) (int-vector (values 1 2))))) (f)) (list #i(1 2) #i(1 2)))
+(test (list (values2 1 2)) '(1 2))
+(test (list (unsafe-values2 1 2)) '(1 2))
(let ((gb1 'gb2)
(gb2 'gb3)
@@ -38511,6 +38631,10 @@ yow...
(test (apply call-with-exit (lambda (g) (g 123)) ()) 123)
(test (apply call/cc (lambda (g) (g 123)) ()) 123)
+(test (call/cc call-with-exit) 'error)
+(test (call-with-exit call/cc) 'error) ; less than ideal error message here: call-with-exit escape procedure called outside its block
+(test (call-with-exit call-with-exit) 'error)
+(test (continuation? (call/cc call/cc)) #t) ; hmmm...
(let ()
(define (f)
@@ -41061,7 +41185,7 @@ who says the continuation has to restart the map from the top?
;; (apply + (list-values (apply-values ()))) -> 0 -- this is a special quasiquote list handling of ,@ that
;; is not the same as (apply + (list-values (apply values ()))) -> error. quasiquote turns list into list-values
-;; and list-values treats (apply values...) specially.
+;; and list-values treats (apply values...) specially.
;;
;; (let ((x ())) `(+ ,@x)) -> (+)
;; via (+ (unquote (apply-values x))) -> (list-values '+ (apply-values x))
@@ -41136,9 +41260,13 @@ who says the continuation has to restart the map from the top?
(test (equal? (keyword->symbol :3) 3) #f)
(test (equal? (symbol->value (keyword->symbol :3)) 3) #f) ; 3 as a symbol has value #<undefined>
- (test (keyword? (keyword->symbol :n:)) #t)
- (test (keyword? (keyword->symbol (keyword->symbol :n:))) #f)
- (test (symbol->keyword n:) :n:)
+ (test (keyword? (keyword->symbol :n:)) #t)
+ (test (keyword? (keyword->symbol (keyword->symbol :n:))) #f)
+ (test (symbol->keyword n:) :n:)
+ (test (keyword? (keyword->symbol ::a)) #t)
+ (test (keyword? (keyword->symbol a::)) #t)
+ (test (symbol->keyword a:) :a:)
+ (test (symbol->keyword :a) ::a)
#|
(let ()
@@ -41456,12 +41584,28 @@ who says the continuation has to restart the map from the top?
(test (set! *features* 123) 'error)
(test (fill! *features* 'asdf) 'error)
+;; (let ((*features* (cons 0 (lambda (a b . c) a))))...) gets through because let doesn't check setters
+;;
+;; none of these raise an error:
+;; (set! (car *features*) #2i((1 2) (3 4)))
+;; (set-car! *features* #2i((1 2) (5 6)))
+;; (set-cdr! *features* #(1 2))
+;; (set! (cdr *features*) #(1 2))
+;; (let ((*features* #(1 2))) *features*)
+;; (copy '(1 2 3) *features*)
+;; (reverse! *features*)
+;; (list-set! *features* 1 123)
+;; (sort! *features* (lambda (x y) (string<? (symbol->string x) (symbol->string y))))
+;;
+;; these raise an error:
+;; (fill! *features* 1): error: can't fill! *features*
+;; (set! *features* (cons 1 1)): error: can't set *features* to an improper or circular list (1 . 1)
(when (pair? *libraries*)
(test (fill! *libraries* #f) 'error))
(test (set! *libraries* #f) 'error)
(test (set! *libraries* (list 1 2)) 'error)
-;(test (copy '(1 2 3) *features*) 'error) ; '(1 2 3 cload.scm write.scm gcc linux aligned ...)
+;(test (copy '(1 2 3) *features*) 'error) ; '(1 2 3 cload.scm write.scm gcc linux aligned ...)
(test (set! pi 3) 'error)
(test (let-temporarily ((pi 3)) pi) 'error)
@@ -41515,31 +41659,31 @@ who says the continuation has to restart the map from the top?
(call-with-output-file "/home/bil/test/test-load-1.scm"
(lambda (port)
(format port "(define (lt3) 333)\n(lt3)\n")))
-
+
(test (load "test-load-1.scm") 111)
(test (load "test-load-2.scm") 'error)
-
+
(set! *load-path* (cons "/home/bil/test/" *load-path*))
(test (load "test-load-1.scm") 111) ; local dir is always searched first
(test (load "test-load-2.scm") 222)
-
+
(set! *load-path* (list "/home/bil/test/"))
(test (load "test-load-1.scm") 111)
(test (load "test-load-2.scm") 222)
-
+
(set! *load-path* (list "."))
(let ((*load-path* (list "/home/bil/test/" ".")))
(test (load "test-load-1.scm" (curlet)) 111) ; if no env, curlet set to rootlet during load, so the *load-path* used is the rootlet version
(test (load "test-load-2.scm" (curlet)) 222))
-
+
(test (delete-file "test-load-1.scm") 0)
(test (load "test-load-1.scm") 'error)
(test (load "test-load-2.scm") 'error)
-
+
(let ((*load-path* (list "/home/bil/test/")))
(test (load "test-load-1.scm" (curlet)) 333)
(test (load "test-load-2.scm" (curlet)) 222))
-
+
(set! *load-path* old-load-path))
;;; --------
@@ -43973,41 +44117,41 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(let ()
(define (f1 a b)
(list (holler) (+ a b)))
-
+
(define-bacro (holler)
- `(format #f "(~S~{ ~S ~S~^~})"
+ `(format #f "(~S~{ ~S ~S~^~})"
(let ((f (*function*)))
(if (pair? f) (car f) f))
(map (lambda (slot)
(values (symbol->keyword (car slot)) (cdr slot)))
(map values ,(outlet (curlet))))))
-
+
(test (f1 2 3) '("(f1 :a 2 :b 3)" 5))
-
+
(define (f2 a b)
(list (holler1 a) (+ a b)))
-
+
(define-bacro (holler1 x)
- `(format #f "(~S~{ ~S ~S~^~})"
+ `(format #f "(~S~{ ~S ~S~^~})"
(let ((f (*function*)))
(if (pair? f) (car f) f))
(map (lambda (slot)
(values (symbol->keyword (car slot)) (cdr slot)))
(map values ,(outlet (curlet))))))
-
+
(test (let ((two 2)) (f2 two 3)) '("(f2 :a 2 :b 3)" 5))
-
+
(define (f3 a b)
(list (holler2 a b) (+ a b)))
-
+
(define-bacro (holler2 x y)
- `(format #f "(~S~{ ~S ~S~^~})"
+ `(format #f "(~S~{ ~S ~S~^~})"
(let ((f (*function*)))
(if (pair? f) (car f) f))
(map (lambda (slot)
(values (symbol->keyword (car slot)) (cdr slot)))
(map values ,(outlet (curlet))))))
-
+
(test (let ((two 2) (three 3)) (f3 two three)) '("(f3 :a 2 :b 3)" 5)))
(let () ; need this, else the define-macro below leaks into rootlet
@@ -46148,12 +46292,12 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(let ()
(define-macro (with-immutable objs . body)
`(let-temporarily (,@(map (lambda (obj)
- `((setter ',obj)
- (lambda (s v)
+ `((setter ',obj)
+ (lambda (s v)
(error 'immutable-object-error "in with-immutable, can't set! ~A" ',obj))))
objs))
,@body))
- ;; (display (macroexpand (with-immutable (x) (set! y x))))
+ ;; (display (macroexpand (with-immutable (x) (set! y x))))
;; (let-temporarily (((setter 'x) (lambda (s v) (error 'immutable-object-error "in with-immutable, can't set! ~A" 'x)))) (set! y x))
(test (let ((x 21)) (with-immutable (x) (set! x 3)) x) 'error)
(test (let ((x 21) (y 0)) (let-temporarily (((setter 'x) (lambda (s v) (error 'oops "nope")))) (set! y x) y)) 21)
@@ -50772,6 +50916,9 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(test (with-input-from-string "#o98" read) 'error)
(test (undefined? #<>) #t)
+(test (equal? #<> #<>) #t)
+(test (eq? #<> #<>) #f) ; currently anyway
+(test (equal? #<asdf> #<asdf>) #t)
(test (equal? #<> (cdr (cons 1 #<>))) #t)
(test (undefined? #<x:>) #t)
(test (undefined? #<xyz>) #t)
@@ -51218,6 +51365,9 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(test (let ((c (list 1 2))) (set! (with-let (curlet) (c 3)) 32 0)) 'error)
(test (let () (define (func) (let ((lt (inlet 'a 1))) (set! (with-let lt a) 32))) (func) (func)) 32)
(test (abs (let ((abs (lambda (x) 32))) (openlet (curlet)))) 32)
+(test (let ((i 0)) ; check bugfix: in_with_let set in optimize_syntax to warn optimize_c_func_one_arg that 'i in (null i) is trouble
+ (let loop ((i 1) (x (lambda () (set! (with-let (inlet) ((null? i) i)) 0))))
+ (if (> i 0) (loop (- i 1) x) (x)))) 'error) ; unbound variable i
(let ((a (inlet 'abc (let ((inx 0)) (dilambda (lambda () inx) (lambda (y) (set! inx y)))))))
(set! ((a 'abc)) 32)
@@ -51311,6 +51461,12 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(test (set! (with-let) 1) 'error)
(test (set! (with-let (curlet)) 1) 'error)
+(test (let ((a3 (inlet 'a 1))) (define (func) (procedure? (a3 ':abs))) (func)) #t)
+(test (let ((a3 (inlet 'a 1))) (define (func) (procedure? (a3 :abs))) (func)) #t)
+(test (let ((a3 (inlet 'a 1))) (define (func) (procedure? (a3 'abs))) (func)) #t)
+(test (let ((a3 (inlet 'a 1)) (asdf :abs)) (define (func) (procedure? (a3 asdf))) (func)) #t)
+(test (let ((a3 (inlet 'a 1)) (asdf abs)) (define (func) (procedure? (a3 asdf))) (func)) 'error)
+
(for-each
(lambda (arg)
(test (let->list arg) 'error))
@@ -51371,9 +51527,9 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(test (let ((L (inlet 'a 1))) (define (func) (set! (let-ref L) (vector))) (func)) 'error)
(test (catch #t
(lambda ()
- (let ((x #f))
+ (let ((x #f))
(let-temporarily ((x 1))
- (set! (setter 'x) (macro (a b . c)
+ (set! (setter 'x) (macro (a b . c)
`(list ,a ,b ,c))))))
(lambda (type info)
(apply format #f info)))
@@ -51381,6 +51537,40 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(let () (define (ft) (let ((a (vector #f)) (b 0)) (*s7* (vector-ref a b)))) (test (ft) 'error))
+(let ()
+ (define f2
+ (let ((plus1 (lambda (x) (* x 2)))) ; "p0"
+ (let ((L (inlet 'plus1 (lambda (x) (if (< x 3) (plus1 (+ x 1)) x))))) ; "p1" calls "p0"
+ (lambda ()
+ (with-let L (plus1 2)))))) ; "p1"
+
+ (test (f2) 6))
+
+(let ()
+ (define (f5)
+ (let ((L (inlet 'a 1))
+ (H (hash-table 'a 2))
+ (res ()))
+ (do ((i 0 (+ i 1)))
+ ((= i 1) (reverse res))
+ (set! res (cons (L 'a) res))
+ (set! L H)
+ (set! res (cons (L 'a) res)))))
+
+ (test (f5) '(1 2))
+
+ (define (f6)
+ (let ((L (inlet 'a 1))
+ (V (vector 2))
+ (res ()))
+ (do ((i 0 (+ i 1)))
+ ((= i 1) (reverse res))
+ (set! res (cons (L 'a) res))
+ (set! L V)
+ (set! res (cons (L 'a) res)))))
+
+ (test (f6) 'error))
+
(test (inlet :a 1) (inlet (cons 'a 1)))
(test (inlet :a 1 :b 2) (inlet 'a 1 'b 2))
(test (inlet 'pi 3.0) 'error)
@@ -51616,7 +51806,7 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(if (#_pair? sig)
(#_call-with-exit
(lambda (return)
- (#_for-each
+ (#_for-each
(lambda (checker)
(if ((#_with-let (#_unlet) (symbol->value checker)) arg)
(return #t)))
@@ -51625,27 +51815,27 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(#_format *stderr* "~S for ~S if (~S ~{~^ S~}~%" arg sig sym args))))
;; redefine all the built-in procedures (so this code gradually clobbers rootlet as it runs)
- (#_for-each
+ (#_for-each
(lambda (sym)
(let ((x (#_symbol->value sym)))
(when (and (#_procedure? x)
(#_signature x)
(#_not (#_immutable? sym)) ; unlet etc
(#_not (#_memq sym '(values setup-check-sig check-sig))))
- (apply set! sym
+ (apply set! sym
(#_list (let ((old-x x))
(lambda args
(#_catch #t ; this messes with outside error handling -- it's probably also unnecessary
(lambda ()
(let ((result (#_apply old-x args))
(sig (#_signature old-x)))
-
+
;; check result against (car signature)
(unless (#_memq (#_car sig) '(#t values))
(let ((sig-result (check-sig sym (#_car sig) result args)))
(if (#_not sig-result)
(#_format *stderr* "(~S~{~^ ~$~}) -> ~$ (~S) but sig: ~S~%" sym args result (#_type-of result) (#_car sig)))))
-
+
;; check args against (cdr signature)
(#_for-each
(lambda (arg-sig arg)
@@ -51653,9 +51843,9 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(let ((sig-result (check-sig sym arg-sig arg args)))
(if (#_not sig-result)
(#_format *stderr* "(~S~{~^ ~$~}) arg ~$ (~S) -> ~$ but sig: ~S~%" sym args arg (#_type-of arg) result arg-sig)))))
- (#_cdr sig)
+ (#_cdr sig)
args)
-
+
;; return function result
result))
(lambda (type info)
@@ -52981,8 +53171,18 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(iter)
(test (object->let iter) (inlet :value iter :type 'iterator? :at-end #t :sequence (int-vector 1 2) :size 2 :position 2)))
-(let ((h (hash-table :a 1 :b 2))) (test (object->let h) (inlet :value h :type 'hash-table? :size 8 :entries 2 :mutable? #t :function 'eq?)))
-(let ((h (hash-table 1 1 2 2))) (test (object->let h) (inlet :value h :type 'hash-table? :size 8 :entries 2 :mutable? #t :function '=)))
+(let ((h (hash-table :a 1 :b 2)))
+ (test (object->let h)
+ (if (provided? 'debugging)
+ (inlet :stats:0|1|2|n|max '(6 2 0 0 1) :function 'eq? :value h :type 'hash-table? :size 8 :entries 2 :mutable? #t)
+ (inlet :value h :type 'hash-table? :size 8 :entries 2 :mutable? #t :function 'eq?))))
+
+(let ((h (hash-table 1 1 2 2)))
+ (test (object->let h)
+ (if (provided? 'debugging)
+ (inlet 'stats:0|1|2|n|max '(6 2 0 0 1) 'function '= 'value h 'type 'hash-table? 'size 8 'entries 2 'mutable? #t)
+ (inlet :value h :type 'hash-table? :size 8 :entries 2 :mutable? #t :function '=))))
+
(let ((h (make-hash-table 8 string=?))) (test (object->let h) (inlet :value h :type 'hash-table? :size 8 :entries 0 :mutable? #t :function 'string=?)))
(test ((object->let (make-weak-hash-table)) 'weak) #t)
@@ -53057,6 +53257,7 @@ or better (define-macro (prog vars . body) `(call-with-exit (lambda (return) (ta
(test (e 'type) 'output-port?)
(test (e 'port-type) 'string)
(test (e 'size) 128)
+ (test (let-ref e 'size) 128)
(test (e 'position) 3)
(test (substring (e 'data) 0 3) "123"))))
(let ((e #f))
@@ -54951,8 +55152,8 @@ hi6: (string-app...
(dilambda
(lambda (index)
(vector-ref vect index))
- (lambda (index new-value)
- (if (< (abs new-value) 10)
+ (lambda (index new-value)
+ (if (< (abs new-value) 10)
(vector-set! vect index new-value)
(error 'wring-type-arg "can't set (v ~D) to ~S" index new-value)))))))
(test (v 0) 1)
@@ -84608,622 +84809,312 @@ gmp:
(num-test (* -1.0+1.0i) -1.0+1.0i)
(num-test (* -10) -10)
(num-test (* -10/3) -10/3)
-(num-test (* -1234000000) -1234000000)
-(num-test (* -1234000000.0) -1234000000.0)
-(num-test (* -1234000000/10) -1234000000/10)
-(num-test (* -2) -2)
(num-test (* -2/2) -2/2)
-(num-test (* 0 -1.0+1.0i) 0.0)
(num-test (* 0 0) 0)
-(num-test (* 0 0.0) 0.0)
(num-test (* 0 0.0+1.0i) 0.0)
-(num-test (* 0 1 -1.0+1.0i) 0.0)
(num-test (* 0 1 0) 0)
-(num-test (* 0 1 0.0) 0.0)
(num-test (* 0 1 0.0+1.0i) 0.0)
-(num-test (* 0 1 1) 0)
(num-test (* 0 1 1.0) 0.0)
-(num-test (* 0 1 1.0+1.0i) 0.0)
(num-test (* 0 1 1/1) 0)
-(num-test (* 0 1 123.4) 0.0)
(num-test (* 0 1 1234) 0)
-(num-test (* 0 1 1234/11) 0)
(num-test (* 0 1) 0)
-(num-test (* 0 1.0 -1.0+1.0i) 0.0)
(num-test (* 0 1.0 0) 0.0)
-(num-test (* 0 1.0 0.0) 0.0)
(num-test (* 0 1.0 0.0+1.0i) 0.0)
-(num-test (* 0 1.0 1) 0.0)
(num-test (* 0 1.0 1.0) 0.0)
-(num-test (* 0 1.0 1.0+1.0i) 0.0)
(num-test (* 0 1.0 1/1) 0.0)
-(num-test (* 0 1.0 123.4) 0.0)
(num-test (* 0 1.0 1234) 0.0)
-(num-test (* 0 1.0 1234/11) 0.0)
(num-test (* 0 1.0) 0.0)
-(num-test (* 0 1.0+1.0i -1.0+1.0i) 0.0)
(num-test (* 0 1.0+1.0i 0) 0.0)
-(num-test (* 0 1.0+1.0i 0.0) 0.0)
(num-test (* 0 1.0+1.0i 0.0+1.0i) 0.0)
-(num-test (* 0 1.0+1.0i 1) 0.0)
(num-test (* 0 1.0+1.0i 1.0) 0.0)
-(num-test (* 0 1.0+1.0i 1.0+1.0i) 0.0)
(num-test (* 0 1.0+1.0i 1/1) 0.0)
-(num-test (* 0 1.0+1.0i 123.4) 0.0)
(num-test (* 0 1.0+1.0i 1234) 0.0)
-(num-test (* 0 1.0+1.0i 1234/11) 0.0)
(num-test (* 0 1.0+1.0i) 0.0)
-(num-test (* 0 1/1 -1.0+1.0i) 0.0)
(num-test (* 0 123.4) 0.0)
-(num-test (* 0 1234) 0)
(num-test (* 0 1234/11) 0)
-(num-test (* 0) 0)
(num-test (* 0.0 -1.0+1.0i -1.0+1.0i) 0.0)
-(num-test (* 0.0 -1.0+1.0i 0) 0.0)
(num-test (* 0.0 -1.0+1.0i 0.0) 0.0)
-(num-test (* 0.0 -1.0+1.0i 0.0+1.0i) 0.0)
(num-test (* 0.0 -1.0+1.0i 1) 0.0)
-(num-test (* 0.0 -1.0+1.0i 1.0) 0.0)
(num-test (* 0.0 -1.0+1.0i 1.0+1.0i) 0.0)
-(num-test (* 0.0 -1.0+1.0i 1/1) 0.0)
(num-test (* 0.0 -1.0+1.0i 123.4) 0.0)
-(num-test (* 0.0 -1.0+1.0i 1234) 0.0)
(num-test (* 0.0 -1.0+1.0i 1234/11) 0.0)
-(num-test (* 0.0 -1.0+1.0i) 0.0)
(num-test (* 0.0 0 -1.0+1.0i) 0.0)
-(num-test (* 0.0 0 0) 0.0)
(num-test (* 0.0 0 0.0) 0.0)
-(num-test (* 0.0 0 0.0+1.0i) 0.0)
(num-test (* 0.0 0 1) 0.0)
-(num-test (* 0.0 0 1.0) 0.0)
(num-test (* 0.0 0 1.0+1.0i) 0.0)
-(num-test (* 0.0 0 1/1) 0.0)
(num-test (* 0.0 0 123.4) 0.0)
-(num-test (* 0.0 0 1234) 0.0)
(num-test (* 0.0 0 1234/11) 0.0)
-(num-test (* 0.0 0) 0.0)
(num-test (* 0.0 0.0 -1.0+1.0i) 0.0)
-(num-test (* 0.0 0.0 0) 0.0)
(num-test (* 0.0 0.0 0.0) 0.0)
-(num-test (* 0.0 0.0 0.0+1.0i) 0.0)
(num-test (* 0.0 0.0 1) 0.0)
-(num-test (* 0.0 0.0 1.0) 0.0)
(num-test (* 0.0 0.0 1.0+1.0i) 0.0)
-(num-test (* 0.0 0.0 1/1) 0.0)
(num-test (* 0.0 0.0 123.4) 0.0)
-(num-test (* 0.0 0.0 1234) 0.0)
(num-test (* 0.0 0.0 1234/11) 0.0)
-(num-test (* 0.0 0.0) 0.0)
(num-test (* 0.0 0.0+1.0i -1.0+1.0i) 0.0)
-(num-test (* 0.0 0.0+1.0i 0) 0.0)
(num-test (* 0.0 0.0+1.0i 0.0) 0.0)
-(num-test (* 0.0 0.0+1.0i 0.0+1.0i) 0.0)
(num-test (* 0.0 0.0+1.0i 1) 0.0)
-(num-test (* 0.0 0.0+1.0i 1.0) 0.0)
(num-test (* 0.0 0.0+1.0i 1.0+1.0i) 0.0)
-(num-test (* 0.0 0.0+1.0i 1/1) 0.0)
(num-test (* 0.0 0.0+1.0i 123.4) 0.0)
-(num-test (* 0.0 0.0+1.0i 1234) 0.0)
(num-test (* 0.0 0.0+1.0i 1234/11) 0.0)
-(num-test (* 0.0 0.0+1.0i) 0.0)
(num-test (* 0.0 1 -1.0+1.0i) 0.0)
-(num-test (* 0.0 1 0) 0.0)
(num-test (* 0.0 1 0.0) 0.0)
-(num-test (* 0.0 1 0.0+1.0i) 0.0)
(num-test (* 0.0 1 1.0) 0.0)
-(num-test (* 0.0 1 1.0+1.0i) 0.0)
(num-test (* 0.0 1 1/1) 0.0)
-(num-test (* 0.0 1 123.4) 0.0)
(num-test (* 0.0 1 1234) 0.0)
-(num-test (* 0.0 1 1234/11) 0.0)
(num-test (* 0.0 1) 0.0)
-(num-test (* 0.0 1.0 -1.0+1.0i) 0.0)
(num-test (* 0.0 1.0 0) 0.0)
-(num-test (* 0.0 1.0 0.0) 0.0)
(num-test (* 0.0 1.0 0.0+1.0i) 0.0)
-(num-test (* 0.0 1.0 1) 0.0)
(num-test (* 0.0 1.0 1.0) 0.0)
-(num-test (* 0.0 1.0 1.0+1.0i) 0.0)
(num-test (* 0.0 1.0 1/1) 0.0)
-(num-test (* 0.0 1.0 123.4) 0.0)
(num-test (* 0.0 1.0 1234) 0.0)
-(num-test (* 0.0 1.0 1234/11) 0.0)
(num-test (* 0.0 1.0) 0.0)
-(num-test (* 0.0 1.0+1.0i -1.0+1.0i) 0.0)
(num-test (* 0.0 1.0+1.0i 0) 0.0)
-(num-test (* 0.0 1.0+1.0i 0.0) 0.0)
(num-test (* 0.0 1.0+1.0i 0.0+1.0i) 0.0)
-(num-test (* 0.0 1.0+1.0i 1) 0.0)
(num-test (* 0.0 1.0+1.0i 1.0) 0.0)
-(num-test (* 0.0 1.0+1.0i 1.0+1.0i) 0.0)
(num-test (* 0.0 1.0+1.0i 1/1) 0.0)
-(num-test (* 0.0 1.0+1.0i 123.4) 0.0)
(num-test (* 0.0 1.0+1.0i 1234) 0.0)
-(num-test (* 0.0 1.0+1.0i 1234/11) 0.0)
(num-test (* 0.0 1.0+1.0i) 0.0)
-(num-test (* 0.0 123.4 -1.0+1.0i) 0.0)
(num-test (* 0.0 123.4 0) 0.0)
-(num-test (* 0.0 123.4 0.0) 0.0)
(num-test (* 0.0 123.4 0.0+1.0i) 0.0)
-(num-test (* 0.0 123.4 1) 0.0)
(num-test (* 0.0 123.4 1.0) 0.0)
-(num-test (* 0.0 123.4 1.0+1.0i) 0.0)
(num-test (* 0.0 123.4 1/1) 0.0)
-(num-test (* 0.0 123.4 123.4) 0.0)
(num-test (* 0.0 123.4 1234) 0.0)
-(num-test (* 0.0 123.4 1234/11) 0.0)
(num-test (* 0.0 123.4) 0.0)
-(num-test (* 0.0 1234 -1.0+1.0i) 0.0)
(num-test (* 0.0 1234 0) 0.0)
-(num-test (* 0.0 1234 0.0) 0.0)
(num-test (* 0.0 1234 0.0+1.0i) 0.0)
-(num-test (* 0.0 1234 1) 0.0)
(num-test (* 0.0 1234 1.0) 0.0)
-(num-test (* 0.0 1234 1.0+1.0i) 0.0)
(num-test (* 0.0 1234 1/1) 0.0)
-(num-test (* 0.0 1234 123.4) 0.0)
(num-test (* 0.0 1234 1234) 0.0)
-(num-test (* 0.0 1234 1234/11) 0.0)
(num-test (* 0.0 1234) 0.0)
-(num-test (* 0.0 1234/11 -1.0+1.0i) 0.0)
(num-test (* 0.0 1234/11 0) 0.0)
-(num-test (* 0.0 1234/11 0.0) 0.0)
(num-test (* 0.0 1234/11 0.0+1.0i) 0.0)
-(num-test (* 0.0 1234/11 1) 0.0)
(num-test (* 0.0 1234/11 1.0) 0.0)
-(num-test (* 0.0 1234/11 1.0+1.0i) 0.0)
(num-test (* 0.0 1234/11 1/1) 0.0)
-(num-test (* 0.0 1234/11 123.4) 0.0)
(num-test (* 0.0 1234/11 1234) 0.0)
-(num-test (* 0.0 1234/11 1234/11) 0.0)
(num-test (* 0.0 1234/11) 0.0)
-(num-test (* 0.0) 0.0)
(num-test (* 0.0+0.00000001i) 0.0+0.00000001i)
-(num-test (* 0.0+1.0i -1.0+1.0i) -1.0-1.0i)
(num-test (* 0.0+1.0i 0) 0.0)
-(num-test (* 0.0+1.0i 0.0) 0.0)
(num-test (* 0.0+1.0i 0.0+1.0i) -1.0)
-(num-test (* 0.0+1.0i 1) 0.0+1.0i)
(num-test (* 0.0+1.0i 1.0) 0.0+1.0i)
-(num-test (* 0.0+1.0i 1.0+1.0i) -1.0+1.0i)
(num-test (* 0.0+1.0i 1/1) 0.0+1.0i)
-(num-test (* 0.0+1.0i 123.4) 0.0+123.4i)
(num-test (* 0.0+1.0i 1234) 0.0+1234.0i)
-(num-test (* 0.0+1.0i 1234/11) 0.0+112.18181818181819i)
(num-test (* 0/1) 0/1)
-(num-test (* 1 -1.0+1.0i) -1.0+1.0i)
(num-test (* 1 0) 0)
-(num-test (* 1 0.0) 0.0)
(num-test (* 1 0.0+1.0i) 0.0+1.0i)
-(num-test (* 1 1 -1.0+1.0i) -1.0+1.0i)
(num-test (* 1 1 0) 0)
-(num-test (* 1 1 0.0) 0.0)
(num-test (* 1 1 0.0+1.0i) 0.0+1.0i)
-(num-test (* 1 1 1) 1)
(num-test (* 1 1 1.0) 1.0)
-(num-test (* 1 1 1.0+1.0i) 1.0+1.0i)
(num-test (* 1 1 1/1) 1)
-(num-test (* 1 1 123.4) 123.4)
(num-test (* 1 1 1234) 1234)
-(num-test (* 1 1 1234/11) 1234/11)
(num-test (* 1 1) 1)
-(num-test (* 1 1.0 -1.0+1.0i) -1.0+1.0i)
(num-test (* 1 1.0 0) 0.0)
-(num-test (* 1 1.0 0.0) 0.0)
(num-test (* 1 1.0 0.0+1.0i) 0.0+1.0i)
-(num-test (* 1 1.0 1) 1.0)
(num-test (* 1 1.0 1.0) 1.0)
-(num-test (* 1 1.0 1.0+1.0i) 1.0+1.0i)
(num-test (* 1 1.0 1/1) 1.0)
-(num-test (* 1 1.0 123.4) 123.4)
(num-test (* 1 1.0 1234) 1234.0)
-(num-test (* 1 1.0 1234/11) 112.18181818181819)
(num-test (* 1 1.0) 1.0)
-(num-test (* 1 1.0+1.0i -1.0+1.0i) -2.0)
(num-test (* 1 1.0+1.0i 0) 0.0)
-(num-test (* 1 1.0+1.0i 0.0) 0.0)
(num-test (* 1 1.0+1.0i 0.0+1.0i) -1.0+1.0i)
-(num-test (* 1 1.0+1.0i 1) 1.0+1.0i)
(num-test (* 1 1.0+1.0i 1.0) 1.0+1.0i)
-(num-test (* 1 1.0+1.0i 1.0+1.0i) 0.0+2.0i)
(num-test (* 1 1.0+1.0i 1/1) 1.0+1.0i)
-(num-test (* 1 1.0+1.0i 123.4) 123.4+123.4i)
(num-test (* 1 1.0+1.0i 1234) 1234.0+1234.0i)
-(num-test (* 1 1.0+1.0i 1234/11) 112.18181818181819+112.18181818181819i)
(num-test (* 1 1.0+1.0i) 1.0+1.0i)
-(num-test (* 1 123.4) 123.4)
(num-test (* 1 1234) 1234)
-(num-test (* 1 1234/11) 1234/11)
(num-test (* 1.0 -1.0+1.0i -1.0+1.0i) 0.0-2.0i)
-(num-test (* 1.0 -1.0+1.0i 0) 0.0)
(num-test (* 1.0 -1.0+1.0i 0.0) 0.0)
-(num-test (* 1.0 -1.0+1.0i 0.0+1.0i) -1.0-1.0i)
(num-test (* 1.0 -1.0+1.0i 1) -1.0+1.0i)
-(num-test (* 1.0 -1.0+1.0i 1.0) -1.0+1.0i)
(num-test (* 1.0 -1.0+1.0i 1.0+1.0i) -2.0)
-(num-test (* 1.0 -1.0+1.0i 1/1) -1.0+1.0i)
(num-test (* 1.0 -1.0+1.0i 123.4) -123.4+123.4i)
-(num-test (* 1.0 -1.0+1.0i 1234) -1234.0+1234.0i)
(num-test (* 1.0 -1.0+1.0i 1234/11) -112.18181818181819+112.18181818181819i)
-(num-test (* 1.0 -1.0+1.0i) -1.0+1.0i)
(num-test (* 1.0 0 -1.0+1.0i) 0.0)
-(num-test (* 1.0 0 0) 0.0)
(num-test (* 1.0 0 0.0) 0.0)
-(num-test (* 1.0 0 0.0+1.0i) 0.0)
(num-test (* 1.0 0 1) 0.0)
-(num-test (* 1.0 0 1.0) 0.0)
(num-test (* 1.0 0 1.0+1.0i) 0.0)
-(num-test (* 1.0 0 1/1) 0.0)
(num-test (* 1.0 0 123.4) 0.0)
-(num-test (* 1.0 0 1234) 0.0)
(num-test (* 1.0 0 1234/11) 0.0)
-(num-test (* 1.0 0) 0.0)
(num-test (* 1.0 0.0 -1.0+1.0i) 0.0)
-(num-test (* 1.0 0.0 0) 0.0)
(num-test (* 1.0 0.0 0.0) 0.0)
-(num-test (* 1.0 0.0 0.0+1.0i) 0.0)
(num-test (* 1.0 0.0 1) 0.0)
-(num-test (* 1.0 0.0 1.0) 0.0)
(num-test (* 1.0 0.0 1.0+1.0i) 0.0)
-(num-test (* 1.0 0.0 1/1) 0.0)
(num-test (* 1.0 0.0 123.4) 0.0)
-(num-test (* 1.0 0.0 1234) 0.0)
(num-test (* 1.0 0.0 1234/11) 0.0)
-(num-test (* 1.0 0.0) 0.0)
(num-test (* 1.0 0.0+1.0i -1.0+1.0i) -1.0-1.0i)
-(num-test (* 1.0 0.0+1.0i 0) 0.0)
(num-test (* 1.0 0.0+1.0i 0.0) 0.0)
-(num-test (* 1.0 0.0+1.0i 0.0+1.0i) -1.0)
(num-test (* 1.0 0.0+1.0i 1) 0.0+1.0i)
-(num-test (* 1.0 0.0+1.0i 1.0) 0.0+1.0i)
(num-test (* 1.0 0.0+1.0i 1.0+1.0i) -1.0+1.0i)
-(num-test (* 1.0 0.0+1.0i 1/1) 0.0+1.0i)
(num-test (* 1.0 0.0+1.0i 123.4) 0.0+123.4i)
-(num-test (* 1.0 0.0+1.0i 1234) 0.0+1234.0i)
(num-test (* 1.0 0.0+1.0i 1234/11) 0.0+112.18181818181819i)
-(num-test (* 1.0 0.0+1.0i) 0.0+1.0i)
(num-test (* 1.0 1 -1.0+1.0i) -1.0+1.0i)
-(num-test (* 1.0 1 0) 0.0)
(num-test (* 1.0 1 0.0) 0.0)
-(num-test (* 1.0 1 0.0+1.0i) 0.0+1.0i)
(num-test (* 1.0 1 1) 1.0)
-(num-test (* 1.0 1 1.0) 1.0)
(num-test (* 1.0 1 1.0+1.0i) 1.0+1.0i)
-(num-test (* 1.0 1 1/1) 1.0)
(num-test (* 1.0 1 123.4) 123.4)
-(num-test (* 1.0 1 1234) 1234.0)
(num-test (* 1.0 1 1234/11) 112.18181818181819)
-(num-test (* 1.0 1) 1.0)
(num-test (* 1.0 1.0 -1.0+1.0i) -1.0+1.0i)
-(num-test (* 1.0 1.0 0) 0.0)
(num-test (* 1.0 1.0 0.0) 0.0)
-(num-test (* 1.0 1.0 0.0+1.0i) 0.0+1.0i)
(num-test (* 1.0 1.0 1) 1.0)
-(num-test (* 1.0 1.0 1.0) 1.0)
(num-test (* 1.0 1.0 1.0+1.0i) 1.0+1.0i)
-(num-test (* 1.0 1.0 1/1) 1.0)
(num-test (* 1.0 1.0 123.4) 123.4)
-(num-test (* 1.0 1.0 1234) 1234.0)
(num-test (* 1.0 1.0 1234/11) 112.18181818181819)
-(num-test (* 1.0 1.0) 1.0)
(num-test (* 1.0 1.0+1.0i -1.0+1.0i) -2.0)
-(num-test (* 1.0 1.0+1.0i 0) 0.0)
(num-test (* 1.0 1.0+1.0i 0.0) 0.0)
-(num-test (* 1.0 1.0+1.0i 0.0+1.0i) -1.0+1.0i)
(num-test (* 1.0 1.0+1.0i 1) 1.0+1.0i)
-(num-test (* 1.0 1.0+1.0i 1.0) 1.0+1.0i)
(num-test (* 1.0 1.0+1.0i 1.0+1.0i) 0.0+2.0i)
-(num-test (* 1.0 1.0+1.0i 1/1) 1.0+1.0i)
(num-test (* 1.0 1.0+1.0i 123.4) 123.4+123.4i)
-(num-test (* 1.0 1.0+1.0i 1234) 1234.0+1234.0i)
(num-test (* 1.0 1.0+1.0i 1234/11) 112.18181818181819+112.18181818181819i)
-(num-test (* 1.0 1.0+1.0i) 1.0+1.0i)
(num-test (* 1.0 1/1 -1.0+1.0i) -1.0+1.0i)
-(num-test (* 1.0 123.4 -1.0+1.0i) -123.4+123.4i)
(num-test (* 1.0 123.4 0) 0.0)
-(num-test (* 1.0 123.4 0.0) 0.0)
(num-test (* 1.0 123.4 0.0+1.0i) 0.0+123.4i)
-(num-test (* 1.0 123.4 1) 123.4)
(num-test (* 1.0 123.4 1.0) 123.4)
-(num-test (* 1.0 123.4 1.0+1.0i) 123.4+123.4i)
(num-test (* 1.0 123.4 1/1) 123.4)
-(num-test (* 1.0 123.4 123.4) 15227.56000000000131)
(num-test (* 1.0 123.4 1234) 152275.60000000000582)
-(num-test (* 1.0 123.4 1234/11) 13843.23636363636433)
(num-test (* 1.0 123.4) 123.4)
-(num-test (* 1.0 1234 -1.0+1.0i) -1234.0+1234.0i)
(num-test (* 1.0 1234 0) 0.0)
-(num-test (* 1.0 1234 0.0) 0.0)
(num-test (* 1.0 1234 0.0+1.0i) 0.0+1234.0i)
-(num-test (* 1.0 1234 1) 1234.0)
(num-test (* 1.0 1234 1.0) 1234.0)
-(num-test (* 1.0 1234 1.0+1.0i) 1234.0+1234.0i)
(num-test (* 1.0 1234 1/1) 1234.0)
-(num-test (* 1.0 1234 123.4) 152275.60000000000582)
(num-test (* 1.0 1234 1234) 1522756.0)
-(num-test (* 1.0 1234 1234/11) 138432.36363636364695)
(num-test (* 1.0 1234) 1234.0)
-(num-test (* 1.0 1234/11 -1.0+1.0i) -112.18181818181819+112.18181818181819i)
(num-test (* 1.0 1234/11 0) 0.0)
-(num-test (* 1.0 1234/11 0.0) 0.0)
(num-test (* 1.0 1234/11 0.0+1.0i) 0.0+112.18181818181819i)
-(num-test (* 1.0 1234/11 1) 112.18181818181819)
(num-test (* 1.0 1234/11 1.0) 112.18181818181819)
-(num-test (* 1.0 1234/11 1.0+1.0i) 112.18181818181819+112.18181818181819i)
(num-test (* 1.0 1234/11 1/1) 112.18181818181819)
-(num-test (* 1.0 1234/11 123.4) 13843.23636363636433)
(num-test (* 1.0 1234/11 1234) 138432.36363636364695)
-(num-test (* 1.0 1234/11 1234/11) 12584.76033057851237)
(num-test (* 1.0 1234/11) 112.18181818181819)
-(num-test (* 1.0) 1.0)
(num-test (* 1.0+1.0i -1.0+1.0i -1.0+1.0i) 2.0-2.0i)
-(num-test (* 1.0+1.0i -1.0+1.0i 0) 0.0)
(num-test (* 1.0+1.0i -1.0+1.0i 0.0) 0.0)
-(num-test (* 1.0+1.0i -1.0+1.0i 0.0+1.0i) -0.0-2.0i)
(num-test (* 1.0+1.0i -1.0+1.0i 1) -2.0)
-(num-test (* 1.0+1.0i -1.0+1.0i 1.0) -2.0)
(num-test (* 1.0+1.0i -1.0+1.0i 1.0+1.0i) -2.0-2.0i)
-(num-test (* 1.0+1.0i -1.0+1.0i 1/1) -2.0)
(num-test (* 1.0+1.0i -1.0+1.0i 123.4) -246.8)
-(num-test (* 1.0+1.0i -1.0+1.0i 1234) -2468.0)
(num-test (* 1.0+1.0i -1.0+1.0i 1234/11) -224.36363636363637)
-(num-test (* 1.0+1.0i -1.0+1.0i) -2.0)
(num-test (* 1.0+1.0i 0 -1.0+1.0i) 0.0)
-(num-test (* 1.0+1.0i 0 0) 0.0)
(num-test (* 1.0+1.0i 0 0.0) 0.0)
-(num-test (* 1.0+1.0i 0 0.0+1.0i) 0.0)
(num-test (* 1.0+1.0i 0 1) 0.0)
-(num-test (* 1.0+1.0i 0 1.0) 0.0)
(num-test (* 1.0+1.0i 0 1.0+1.0i) 0.0)
-(num-test (* 1.0+1.0i 0 1/1) 0.0)
(num-test (* 1.0+1.0i 0 123.4) 0.0)
-(num-test (* 1.0+1.0i 0 1234) 0.0)
(num-test (* 1.0+1.0i 0 1234/11) 0.0)
-(num-test (* 1.0+1.0i 0) 0.0)
(num-test (* 1.0+1.0i 0.0 -1.0+1.0i) 0.0)
-(num-test (* 1.0+1.0i 0.0 0) 0.0)
(num-test (* 1.0+1.0i 0.0 0.0) 0.0)
-(num-test (* 1.0+1.0i 0.0 0.0+1.0i) 0.0)
(num-test (* 1.0+1.0i 0.0 1) 0.0)
-(num-test (* 1.0+1.0i 0.0 1.0) 0.0)
(num-test (* 1.0+1.0i 0.0 1.0+1.0i) 0.0)
-(num-test (* 1.0+1.0i 0.0 1/1) 0.0)
(num-test (* 1.0+1.0i 0.0 123.4) 0.0)
-(num-test (* 1.0+1.0i 0.0 1234) 0.0)
(num-test (* 1.0+1.0i 0.0 1234/11) 0.0)
-(num-test (* 1.0+1.0i 0.0) 0.0)
(num-test (* 1.0+1.0i 0.0+1.0i -1.0+1.0i) 0.0-2.0i)
-(num-test (* 1.0+1.0i 0.0+1.0i 0) 0.0)
(num-test (* 1.0+1.0i 0.0+1.0i 0.0) 0.0)
-(num-test (* 1.0+1.0i 0.0+1.0i 0.0+1.0i) -1.0-1.0i)
(num-test (* 1.0+1.0i 0.0+1.0i 1) -1.0+1.0i)
-(num-test (* 1.0+1.0i 0.0+1.0i 1.0) -1.0+1.0i)
(num-test (* 1.0+1.0i 0.0+1.0i 1.0+1.0i) -2.0)
-(num-test (* 1.0+1.0i 0.0+1.0i 1/1) -1.0+1.0i)
(num-test (* 1.0+1.0i 0.0+1.0i 123.4) -123.4+123.4i)
-(num-test (* 1.0+1.0i 0.0+1.0i 1234) -1234.0+1234.0i)
(num-test (* 1.0+1.0i 0.0+1.0i 1234/11) -112.18181818181819+112.18181818181819i)
-(num-test (* 1.0+1.0i 0.0+1.0i) -1.0+1.0i)
(num-test (* 1.0+1.0i 1 -1.0+1.0i) -2.0)
-(num-test (* 1.0+1.0i 1 0) 0.0)
(num-test (* 1.0+1.0i 1 0.0) 0.0)
-(num-test (* 1.0+1.0i 1 0.0+1.0i) -1.0+1.0i)
(num-test (* 1.0+1.0i 1 1) 1.0+1.0i)
-(num-test (* 1.0+1.0i 1 1.0) 1.0+1.0i)
(num-test (* 1.0+1.0i 1 1.0+1.0i) 0.0+2.0i)
-(num-test (* 1.0+1.0i 1 1/1) 1.0+1.0i)
(num-test (* 1.0+1.0i 1 123.4) 123.4+123.4i)
-(num-test (* 1.0+1.0i 1 1234) 1234.0+1234.0i)
(num-test (* 1.0+1.0i 1 1234/11) 112.18181818181819+112.18181818181819i)
-(num-test (* 1.0+1.0i 1) 1.0+1.0i)
(num-test (* 1.0+1.0i 1.0 -1.0+1.0i) -2.0)
-(num-test (* 1.0+1.0i 1.0 0) 0.0)
(num-test (* 1.0+1.0i 1.0 0.0) 0.0)
-(num-test (* 1.0+1.0i 1.0 0.0+1.0i) -1.0+1.0i)
(num-test (* 1.0+1.0i 1.0 1) 1.0+1.0i)
-(num-test (* 1.0+1.0i 1.0 1.0) 1.0+1.0i)
(num-test (* 1.0+1.0i 1.0 1.0+1.0i) 0.0+2.0i)
-(num-test (* 1.0+1.0i 1.0 1/1) 1.0+1.0i)
(num-test (* 1.0+1.0i 1.0 123.4) 123.4+123.4i)
-(num-test (* 1.0+1.0i 1.0 1234) 1234.0+1234.0i)
(num-test (* 1.0+1.0i 1.0 1234/11) 112.18181818181819+112.18181818181819i)
-(num-test (* 1.0+1.0i 1.0) 1.0+1.0i)
(num-test (* 1.0+1.0i 1.0+1.0i -1.0+1.0i) -2.0-2.0i)
-(num-test (* 1.0+1.0i 1.0+1.0i 0) 0.0)
(num-test (* 1.0+1.0i 1.0+1.0i 0.0) 0.0)
-(num-test (* 1.0+1.0i 1.0+1.0i 0.0+1.0i) -2.0)
(num-test (* 1.0+1.0i 1.0+1.0i 1) 0.0+2.0i)
-(num-test (* 1.0+1.0i 1.0+1.0i 1.0) 0.0+2.0i)
(num-test (* 1.0+1.0i 1.0+1.0i 1.0+1.0i) -2.0+2.0i)
-(num-test (* 1.0+1.0i 1.0+1.0i 1/1) 0.0+2.0i)
(num-test (* 1.0+1.0i 1.0+1.0i 123.4) 0.0+246.8i)
-(num-test (* 1.0+1.0i 1.0+1.0i 1234) 0.0+2468.0i)
(num-test (* 1.0+1.0i 1.0+1.0i 1234/11) 0.0+224.36363636363637i)
-(num-test (* 1.0+1.0i 1.0+1.0i) 0.0+2.0i)
(num-test (* 1.0+1.0i 123.4 -1.0+1.0i) -246.8)
-(num-test (* 1.0+1.0i 123.4 0) 0.0)
(num-test (* 1.0+1.0i 123.4 0.0) 0.0)
-(num-test (* 1.0+1.0i 123.4 0.0+1.0i) -123.4+123.4i)
(num-test (* 1.0+1.0i 123.4 1) 123.4+123.4i)
-(num-test (* 1.0+1.0i 123.4 1.0) 123.4+123.4i)
(num-test (* 1.0+1.0i 123.4 1.0+1.0i) 0.0+246.8i)
-(num-test (* 1.0+1.0i 123.4 1/1) 123.4+123.4i)
(num-test (* 1.0+1.0i 123.4 123.4) 15227.56000000000131+15227.56000000000131i)
-(num-test (* 1.0+1.0i 123.4 1234) 152275.60000000000582+152275.60000000000582i)
(num-test (* 1.0+1.0i 123.4 1234/11) 13843.23636363636433+13843.23636363636433i)
-(num-test (* 1.0+1.0i 123.4) 123.4+123.4i)
(num-test (* 1.0+1.0i 1234 -1.0+1.0i) -2468.0)
-(num-test (* 1.0+1.0i 1234 0) 0.0)
(num-test (* 1.0+1.0i 1234 0.0) 0.0)
-(num-test (* 1.0+1.0i 1234 0.0+1.0i) -1234.0+1234.0i)
(num-test (* 1.0+1.0i 1234 1) 1234.0+1234.0i)
-(num-test (* 1.0+1.0i 1234 1.0) 1234.0+1234.0i)
(num-test (* 1.0+1.0i 1234 1.0+1.0i) 0.0+2468.0i)
-(num-test (* 1.0+1.0i 1234 1/1) 1234.0+1234.0i)
(num-test (* 1.0+1.0i 1234 123.4) 152275.60000000000582+152275.60000000000582i)
-(num-test (* 1.0+1.0i 1234 1234) 1522756.0+1522756.0i)
(num-test (* 1.0+1.0i 1234 1234/11) 138432.36363636364695+138432.36363636364695i)
-(num-test (* 1.0+1.0i 1234) 1234.0+1234.0i)
(num-test (* 1.0+1.0i 1234/11 -1.0+1.0i) -224.36363636363637)
-(num-test (* 1.0+1.0i 1234/11 0) 0.0)
(num-test (* 1.0+1.0i 1234/11 0.0) 0.0)
-(num-test (* 1.0+1.0i 1234/11 0.0+1.0i) -112.18181818181819+112.18181818181819i)
(num-test (* 1.0+1.0i 1234/11 1) 112.18181818181819+112.18181818181819i)
-(num-test (* 1.0+1.0i 1234/11 1.0) 112.18181818181819+112.18181818181819i)
(num-test (* 1.0+1.0i 1234/11 1.0+1.0i) 0.0+224.36363636363637i)
-(num-test (* 1.0+1.0i 1234/11 1/1) 112.18181818181819+112.18181818181819i)
(num-test (* 1.0+1.0i 1234/11 123.4) 13843.23636363636433+13843.23636363636433i)
-(num-test (* 1.0+1.0i 1234/11 1234) 138432.36363636364695+138432.36363636364695i)
(num-test (* 1.0+1.0i 1234/11 1234/11) 12584.76033057851419+12584.76033057851419i)
-(num-test (* 1.0+1.0i 1234/11) 112.18181818181819+112.18181818181819i)
(num-test (* 1.0+1.0i) 1.0+1.0i)
-(num-test (* 10) 10)
(num-test (* 10/3) 10/3)
-(num-test (* 123.4 -1.0+1.0i -1.0+1.0i) 0.0-246.8i)
(num-test (* 123.4 -1.0+1.0i 0) 0.0)
-(num-test (* 123.4 -1.0+1.0i 0.0) 0.0)
(num-test (* 123.4 -1.0+1.0i 0.0+1.0i) -123.4-123.4i)
-(num-test (* 123.4 -1.0+1.0i 1) -123.4+123.4i)
(num-test (* 123.4 -1.0+1.0i 1.0) -123.4+123.4i)
-(num-test (* 123.4 -1.0+1.0i 1.0+1.0i) -246.8)
(num-test (* 123.4 -1.0+1.0i 1/1) -123.4+123.4i)
-(num-test (* 123.4 -1.0+1.0i 123.4) -15227.56000000000131+15227.56000000000131i)
(num-test (* 123.4 -1.0+1.0i 1234) -152275.60000000000582+152275.60000000000582i)
-(num-test (* 123.4 -1.0+1.0i 1234/11) -13843.23636363636433+13843.23636363636433i)
(num-test (* 123.4 -1.0+1.0i) -123.4+123.4i)
-(num-test (* 123.4 0 -1.0+1.0i) 0.0)
(num-test (* 123.4 0 0) 0.0)
-(num-test (* 123.4 0 0.0) 0.0)
(num-test (* 123.4 0 0.0+1.0i) 0.0)
-(num-test (* 123.4 0 1) 0.0)
(num-test (* 123.4 0 1.0) 0.0)
-(num-test (* 123.4 0 1.0+1.0i) 0.0)
(num-test (* 123.4 0 1/1) 0.0)
-(num-test (* 123.4 0 123.4) 0.0)
(num-test (* 123.4 0 1234) 0.0)
-(num-test (* 123.4 0 1234/11) 0.0)
(num-test (* 123.4 0) 0.0)
-(num-test (* 123.4 0.0 -1.0+1.0i) 0.0)
(num-test (* 123.4 0.0 0) 0.0)
-(num-test (* 123.4 0.0 0.0) 0.0)
(num-test (* 123.4 0.0 0.0+1.0i) 0.0)
-(num-test (* 123.4 0.0 1) 0.0)
(num-test (* 123.4 0.0 1.0) 0.0)
-(num-test (* 123.4 0.0 1.0+1.0i) 0.0)
(num-test (* 123.4 0.0 1/1) 0.0)
-(num-test (* 123.4 0.0 123.4) 0.0)
(num-test (* 123.4 0.0 1234) 0.0)
-(num-test (* 123.4 0.0 1234/11) 0.0)
(num-test (* 123.4 0.0) 0.0)
-(num-test (* 123.4 0.0+1.0i -1.0+1.0i) -123.4-123.4i)
(num-test (* 123.4 0.0+1.0i 0) 0.0)
-(num-test (* 123.4 0.0+1.0i 0.0) 0.0)
(num-test (* 123.4 0.0+1.0i 0.0+1.0i) -123.4)
-(num-test (* 123.4 0.0+1.0i 1) 0.0+123.4i)
(num-test (* 123.4 0.0+1.0i 1.0) 0.0+123.4i)
-(num-test (* 123.4 0.0+1.0i 1.0+1.0i) -123.4+123.4i)
(num-test (* 123.4 0.0+1.0i 1/1) 0.0+123.4i)
-(num-test (* 123.4 0.0+1.0i 123.4) 0.0+15227.56000000000131i)
(num-test (* 123.4 0.0+1.0i 1234) 0.0+152275.60000000000582i)
-(num-test (* 123.4 0.0+1.0i 1234/11) 0.0+13843.23636363636433i)
(num-test (* 123.4 0.0+1.0i) 0.0+123.4i)
-(num-test (* 123.4 1 -1.0+1.0i) -123.4+123.4i)
(num-test (* 123.4 1 0) 0.0)
-(num-test (* 123.4 1 0.0) 0.0)
(num-test (* 123.4 1 0.0+1.0i) 0.0+123.4i)
-(num-test (* 123.4 1 1) 123.4)
(num-test (* 123.4 1 1.0) 123.4)
-(num-test (* 123.4 1 1.0+1.0i) 123.4+123.4i)
(num-test (* 123.4 1 1/1) 123.4)
-(num-test (* 123.4 1 123.4) 15227.56000000000131)
(num-test (* 123.4 1 1234) 152275.60000000000582)
-(num-test (* 123.4 1 1234/11) 13843.23636363636433)
(num-test (* 123.4 1) 123.4)
-(num-test (* 123.4 1.0 -1.0+1.0i) -123.4+123.4i)
(num-test (* 123.4 1.0 0) 0.0)
-(num-test (* 123.4 1.0 0.0) 0.0)
(num-test (* 123.4 1.0 0.0+1.0i) 0.0+123.4i)
-(num-test (* 123.4 1.0 1) 123.4)
(num-test (* 123.4 1.0 1.0) 123.4)
-(num-test (* 123.4 1.0 1.0+1.0i) 123.4+123.4i)
(num-test (* 123.4 1.0 1/1) 123.4)
-(num-test (* 123.4 1.0 123.4) 15227.56000000000131)
(num-test (* 123.4 1.0 1234) 152275.60000000000582)
-(num-test (* 123.4 1.0 1234/11) 13843.23636363636433)
(num-test (* 123.4 1.0) 123.4)
-(num-test (* 123.4 1.0+1.0i -1.0+1.0i) -246.8)
(num-test (* 123.4 1.0+1.0i 0) 0.0)
-(num-test (* 123.4 1.0+1.0i 0.0) 0.0)
(num-test (* 123.4 1.0+1.0i 0.0+1.0i) -123.4+123.4i)
-(num-test (* 123.4 1.0+1.0i 1) 123.4+123.4i)
(num-test (* 123.4 1.0+1.0i 1.0) 123.4+123.4i)
-(num-test (* 123.4 1.0+1.0i 1.0+1.0i) 0.0+246.8i)
(num-test (* 123.4 1.0+1.0i 1/1) 123.4+123.4i)
-(num-test (* 123.4 1.0+1.0i 123.4) 15227.56000000000131+15227.56000000000131i)
(num-test (* 123.4 1.0+1.0i 1234) 152275.60000000000582+152275.60000000000582i)
-(num-test (* 123.4 1.0+1.0i 1234/11) 13843.23636363636433+13843.23636363636433i)
(num-test (* 123.4 1.0+1.0i) 123.4+123.4i)
-(num-test (* 123.4 1/1 -1.0+1.0i) -123.4+123.4i)
(num-test (* 123.4 123.4 -1.0+1.0i) -15227.56000000000131+15227.56000000000131i)
-(num-test (* 123.4 123.4 0) 0.0)
(num-test (* 123.4 123.4 0.0) 0.0)
-(num-test (* 123.4 123.4 0.0+1.0i) 0.0+15227.56000000000131i)
(num-test (* 123.4 123.4 1) 15227.56000000000131)
-(num-test (* 123.4 123.4 1.0) 15227.56000000000131)
(num-test (* 123.4 123.4 1.0+1.0i) 15227.56000000000131+15227.56000000000131i)
-(num-test (* 123.4 123.4 1/1) 15227.56000000000131)
(num-test (* 123.4 123.4 123.4) 1879080.90400000032969)
-(num-test (* 123.4 123.4 1234) 18790809.04000000283122)
(num-test (* 123.4 123.4 1234/11) 1708255.36727272742428)
-(num-test (* 123.4 123.4) 15227.56000000000131)
(num-test (* 123.4 1234 -1.0+1.0i) -152275.60000000000582+152275.60000000000582i)
-(num-test (* 123.4 1234 0) 0.0)
(num-test (* 123.4 1234 0.0) 0.0)
-(num-test (* 123.4 1234 0.0+1.0i) 0.0+152275.60000000000582i)
(num-test (* 123.4 1234 1) 152275.60000000000582)
-(num-test (* 123.4 1234 1.0) 152275.60000000000582)
(num-test (* 123.4 1234 1.0+1.0i) 152275.60000000000582+152275.60000000000582i)
-(num-test (* 123.4 1234 1/1) 152275.60000000000582)
(num-test (* 123.4 1234 123.4) 18790809.04000000283122)
-(num-test (* 123.4 1234 1234) 187908090.40000000596046)
(num-test (* 123.4 1234 1234/11) 17082553.67272727191448)
-(num-test (* 123.4 1234) 152275.60000000000582)
(num-test (* 123.4 1234/11 -1.0+1.0i) -13843.23636363636433+13843.23636363636433i)
-(num-test (* 123.4 1234/11 0) 0.0)
(num-test (* 123.4 1234/11 0.0) 0.0)
-(num-test (* 123.4 1234/11 0.0+1.0i) 0.0+13843.23636363636433i)
(num-test (* 123.4 1234/11 1) 13843.23636363636433)
-(num-test (* 123.4 1234/11 1.0) 13843.23636363636433)
(num-test (* 123.4 1234/11 1.0+1.0i) 13843.23636363636433+13843.23636363636433i)
-(num-test (* 123.4 1234/11 1/1) 13843.23636363636433)
(num-test (* 123.4 1234/11 123.4) 1708255.36727272742428)
-(num-test (* 123.4 1234/11 1234) 17082553.67272727191448)
(num-test (* 123.4 1234/11 1234/11) 1552959.42479338846169)
-(num-test (* 123.4 1234/11) 13843.23636363636433)
(num-test (* 1234 -1.0+1.0i) -1234.0+1234.0i)
-(num-test (* 1234 0) 0)
(num-test (* 1234 0.0) 0.0)
-(num-test (* 1234 0.0+1.0i) 0.0+1234.0i)
(num-test (* 1234 1) 1234)
-(num-test (* 1234 1.0) 1234.0)
(num-test (* 1234 1.0+1.0i) 1234.0+1234.0i)
-(num-test (* 1234 1/1) 1234)
(num-test (* 1234 123.4) 152275.60000000000582)
-(num-test (* 1234 1234) 1522756)
(num-test (* 1234 1234/11) 1522756/11)
-(num-test (* 1234/11 -1.0+1.0i) -112.18181818181819+112.18181818181819i)
(num-test (* 1234/11 0) 0)
-(num-test (* 1234/11 0.0) 0.0)
(num-test (* 1234/11 0.0+1.0i) 0.0+112.18181818181819i)
-(num-test (* 1234/11 1) 1234/11)
(num-test (* 1234/11 1.0) 112.18181818181819)
-(num-test (* 1234/11 1.0+1.0i) 112.18181818181819+112.18181818181819i)
(num-test (* 1234/11 1/1) 1234/11)
-(num-test (* 1234/11 123.4) 13843.23636363636433)
(num-test (* 1234/11 1234) 1522756/11)
-(num-test (* 1234/11 1234/11) 1522756/121)
(num-test (* 1234000000) 1234000000)
-(num-test (* 1234000000.0) 1234000000.0)
(num-test (* 1234000000/10) 1234000000/10)
(num-test (* 2) 2)
(num-test (* 2/2) 2/2)
@@ -85898,621 +85789,313 @@ gmp:
(num-test (+ -1234000000) -1234000000)
(num-test (+ -1234000000.0) -1234000000.0)
(num-test (+ -1234000000/10) -1234000000/10)
-(num-test (+ -2) -2)
(num-test (+ -2/2) -2/2)
-(num-test (+ 0 -1.0+1.0i) -1.0+1.0i)
(num-test (+ 0 0) 0)
-(num-test (+ 0 0.0) 0.0)
(num-test (+ 0 0.0+1.0i) 0.0+1.0i)
-(num-test (+ 0 1 -1.0+1.0i) 0.0+1.0i)
(num-test (+ 0 1 0) 1)
-(num-test (+ 0 1 0.0) 1.0)
(num-test (+ 0 1 0.0+1.0i) 1.0+1.0i)
-(num-test (+ 0 1 1) 2)
(num-test (+ 0 1 1.0) 2.0)
-(num-test (+ 0 1 1.0+1.0i) 2.0+1.0i)
(num-test (+ 0 1 1/1) 2)
-(num-test (+ 0 1 123.4) 124.4)
(num-test (+ 0 1 1234) 1235)
-(num-test (+ 0 1 1234/11) 1245/11)
(num-test (+ 0 1) 1)
-(num-test (+ 0 1.0 -1.0+1.0i) 0.0+1.0i)
(num-test (+ 0 1.0 0) 1.0)
-(num-test (+ 0 1.0 0.0) 1.0)
(num-test (+ 0 1.0 0.0+1.0i) 1.0+1.0i)
-(num-test (+ 0 1.0 1) 2.0)
(num-test (+ 0 1.0 1.0) 2.0)
-(num-test (+ 0 1.0 1.0+1.0i) 2.0+1.0i)
(num-test (+ 0 1.0 1/1) 2.0)
-(num-test (+ 0 1.0 123.4) 124.4)
(num-test (+ 0 1.0 1234) 1235.0)
-(num-test (+ 0 1.0 1234/11) 113.18181818181819)
(num-test (+ 0 1.0) 1.0)
-(num-test (+ 0 1.0+1.0i -1.0+1.0i) 0.0+2.0i)
(num-test (+ 0 1.0+1.0i 0) 1.0+1.0i)
-(num-test (+ 0 1.0+1.0i 0.0) 1.0+1.0i)
(num-test (+ 0 1.0+1.0i 0.0+1.0i) 1.0+2.0i)
-(num-test (+ 0 1.0+1.0i 1) 2.0+1.0i)
(num-test (+ 0 1.0+1.0i 1.0) 2.0+1.0i)
-(num-test (+ 0 1.0+1.0i 1.0+1.0i) 2.0+2.0i)
(num-test (+ 0 1.0+1.0i 1/1) 2.0+1.0i)
-(num-test (+ 0 1.0+1.0i 123.4) 124.4+1.0i)
(num-test (+ 0 1.0+1.0i 1234) 1235.0+1.0i)
-(num-test (+ 0 1.0+1.0i 1234/11) 113.18181818181819+1.0i)
(num-test (+ 0 1.0+1.0i) 1.0+1.0i)
-(num-test (+ 0 1/1 -1.0+1.0i) 0.0+1.0i)
(num-test (+ 0 123.4) 123.4)
-(num-test (+ 0 1234) 1234)
(num-test (+ 0 1234/11) 1234/11)
-(num-test (+ 0) 0)
(num-test (+ 0.0 -1.0+1.0i -1.0+1.0i) -2.0+2.0i)
-(num-test (+ 0.0 -1.0+1.0i 0) -1.0+1.0i)
(num-test (+ 0.0 -1.0+1.0i 0.0) -1.0+1.0i)
-(num-test (+ 0.0 -1.0+1.0i 0.0+1.0i) -1.0+2.0i)
(num-test (+ 0.0 -1.0+1.0i 1) 0.0+1.0i)
-(num-test (+ 0.0 -1.0+1.0i 1.0) 0.0+1.0i)
(num-test (+ 0.0 -1.0+1.0i 1.0+1.0i) 0.0+2.0i)
-(num-test (+ 0.0 -1.0+1.0i 1/1) 0.0+1.0i)
(num-test (+ 0.0 -1.0+1.0i 123.4) 122.4+1.0i)
-(num-test (+ 0.0 -1.0+1.0i 1234) 1233.0+1.0i)
(num-test (+ 0.0 -1.0+1.0i 1234/11) 111.18181818181819+1.0i)
-(num-test (+ 0.0 -1.0+1.0i) -1.0+1.0i)
(num-test (+ 0.0 0 -1.0+1.0i) -1.0+1.0i)
-(num-test (+ 0.0 0 0) 0.0)
(num-test (+ 0.0 0 0.0) 0.0)
-(num-test (+ 0.0 0 0.0+1.0i) 0.0+1.0i)
(num-test (+ 0.0 0 1) 1.0)
-(num-test (+ 0.0 0 1.0) 1.0)
(num-test (+ 0.0 0 1.0+1.0i) 1.0+1.0i)
-(num-test (+ 0.0 0 1/1) 1.0)
(num-test (+ 0.0 0 123.4) 123.4)
-(num-test (+ 0.0 0 1234) 1234.0)
(num-test (+ 0.0 0 1234/11) 112.18181818181819)
-(num-test (+ 0.0 0) 0.0)
(num-test (+ 0.0 0.0 -1.0+1.0i) -1.0+1.0i)
-(num-test (+ 0.0 0.0 0) 0.0)
(num-test (+ 0.0 0.0 0.0) 0.0)
-(num-test (+ 0.0 0.0 0.0+1.0i) 0.0+1.0i)
(num-test (+ 0.0 0.0 1) 1.0)
-(num-test (+ 0.0 0.0 1.0) 1.0)
(num-test (+ 0.0 0.0 1.0+1.0i) 1.0+1.0i)
-(num-test (+ 0.0 0.0 1/1) 1.0)
(num-test (+ 0.0 0.0 123.4) 123.4)
-(num-test (+ 0.0 0.0 1234) 1234.0)
(num-test (+ 0.0 0.0 1234/11) 112.18181818181819)
-(num-test (+ 0.0 0.0) 0.0)
(num-test (+ 0.0 0.0+1.0i -1.0+1.0i) -1.0+2.0i)
-(num-test (+ 0.0 0.0+1.0i 0) 0.0+1.0i)
(num-test (+ 0.0 0.0+1.0i 0.0) 0.0+1.0i)
-(num-test (+ 0.0 0.0+1.0i 0.0+1.0i) 0.0+2.0i)
(num-test (+ 0.0 0.0+1.0i 1) 1.0+1.0i)
-(num-test (+ 0.0 0.0+1.0i 1.0) 1.0+1.0i)
(num-test (+ 0.0 0.0+1.0i 1.0+1.0i) 1.0+2.0i)
-(num-test (+ 0.0 0.0+1.0i 1/1) 1.0+1.0i)
(num-test (+ 0.0 0.0+1.0i 123.4) 123.4+1.0i)
-(num-test (+ 0.0 0.0+1.0i 1234) 1234.0+1.0i)
(num-test (+ 0.0 0.0+1.0i 1234/11) 112.18181818181819+1.0i)
-(num-test (+ 0.0 0.0+1.0i) 0.0+1.0i)
(num-test (+ 0.0 1 -1.0+1.0i) 0.0+1.0i)
-(num-test (+ 0.0 1 0) 1.0)
(num-test (+ 0.0 1 0.0) 1.0)
-(num-test (+ 0.0 1 0.0+1.0i) 1.0+1.0i)
(num-test (+ 0.0 1 1.0) 2.0)
-(num-test (+ 0.0 1 1.0+1.0i) 2.0+1.0i)
(num-test (+ 0.0 1 1/1) 2.0)
-(num-test (+ 0.0 1 123.4) 124.4)
(num-test (+ 0.0 1 1234) 1235.0)
-(num-test (+ 0.0 1 1234/11) 113.18181818181819)
(num-test (+ 0.0 1) 1.0)
-(num-test (+ 0.0 1.0 -1.0+1.0i) 0.0+1.0i)
(num-test (+ 0.0 1.0 0) 1.0)
-(num-test (+ 0.0 1.0 0.0) 1.0)
(num-test (+ 0.0 1.0 0.0+1.0i) 1.0+1.0i)
-(num-test (+ 0.0 1.0 1) 2.0)
(num-test (+ 0.0 1.0 1.0) 2.0)
-(num-test (+ 0.0 1.0 1.0+1.0i) 2.0+1.0i)
(num-test (+ 0.0 1.0 1/1) 2.0)
-(num-test (+ 0.0 1.0 123.4) 124.4)
(num-test (+ 0.0 1.0 1234) 1235.0)
-(num-test (+ 0.0 1.0 1234/11) 113.18181818181819)
(num-test (+ 0.0 1.0) 1.0)
-(num-test (+ 0.0 1.0+1.0i -1.0+1.0i) 0.0+2.0i)
(num-test (+ 0.0 1.0+1.0i 0) 1.0+1.0i)
-(num-test (+ 0.0 1.0+1.0i 0.0) 1.0+1.0i)
(num-test (+ 0.0 1.0+1.0i 0.0+1.0i) 1.0+2.0i)
-(num-test (+ 0.0 1.0+1.0i 1) 2.0+1.0i)
(num-test (+ 0.0 1.0+1.0i 1.0) 2.0+1.0i)
-(num-test (+ 0.0 1.0+1.0i 1.0+1.0i) 2.0+2.0i)
(num-test (+ 0.0 1.0+1.0i 1/1) 2.0+1.0i)
-(num-test (+ 0.0 1.0+1.0i 123.4) 124.4+1.0i)
(num-test (+ 0.0 1.0+1.0i 1234) 1235.0+1.0i)
-(num-test (+ 0.0 1.0+1.0i 1234/11) 113.18181818181819+1.0i)
(num-test (+ 0.0 1.0+1.0i) 1.0+1.0i)
-(num-test (+ 0.0 1/1 -1.0+1.0i) 0.0+1.0i)
(num-test (+ 0.0 123.4 -1.0+1.0i) 122.4+1.0i)
-(num-test (+ 0.0 123.4 0) 123.4)
(num-test (+ 0.0 123.4 0.0) 123.4)
-(num-test (+ 0.0 123.4 0.0+1.0i) 123.4+1.0i)
(num-test (+ 0.0 123.4 1) 124.4)
-(num-test (+ 0.0 123.4 1.0) 124.4)
(num-test (+ 0.0 123.4 1.0+1.0i) 124.4+1.0i)
-(num-test (+ 0.0 123.4 1/1) 124.4)
(num-test (+ 0.0 123.4 123.4) 246.8)
-(num-test (+ 0.0 123.4 1234) 1357.4)
(num-test (+ 0.0 123.4 1234/11) 235.58181818181819)
-(num-test (+ 0.0 123.4) 123.4)
(num-test (+ 0.0 1234 -1.0+1.0i) 1233.0+1.0i)
-(num-test (+ 0.0 1234 0) 1234.0)
(num-test (+ 0.0 1234 0.0) 1234.0)
-(num-test (+ 0.0 1234 0.0+1.0i) 1234.0+1.0i)
(num-test (+ 0.0 1234 1) 1235.0)
-(num-test (+ 0.0 1234 1.0) 1235.0)
(num-test (+ 0.0 1234 1.0+1.0i) 1235.0+1.0i)
-(num-test (+ 0.0 1234 1/1) 1235.0)
(num-test (+ 0.0 1234 123.4) 1357.4)
-(num-test (+ 0.0 1234 1234) 2468.0)
(num-test (+ 0.0 1234 1234/11) 1346.18181818181824)
-(num-test (+ 0.0 1234) 1234.0)
(num-test (+ 0.0 1234/11 -1.0+1.0i) 111.18181818181819+1.0i)
-(num-test (+ 0.0 1234/11 0) 112.18181818181819)
(num-test (+ 0.0 1234/11 0.0) 112.18181818181819)
-(num-test (+ 0.0 1234/11 0.0+1.0i) 112.18181818181819+1.0i)
(num-test (+ 0.0 1234/11 1) 113.18181818181819)
-(num-test (+ 0.0 1234/11 1.0) 113.18181818181819)
(num-test (+ 0.0 1234/11 1.0+1.0i) 113.18181818181819+1.0i)
-(num-test (+ 0.0 1234/11 1/1) 113.18181818181819)
(num-test (+ 0.0 1234/11 123.4) 235.58181818181819)
-(num-test (+ 0.0 1234/11 1234) 1346.18181818181824)
(num-test (+ 0.0 1234/11 1234/11) 224.36363636363637)
-(num-test (+ 0.0 1234/11) 112.18181818181819)
(num-test (+ 0.0) 0.0)
-(num-test (+ 0.0+0.00000001i) 0.0+0.00000001i)
(num-test (+ 0.0+1.0i -1.0+1.0i) -1.0+2.0i)
-(num-test (+ 0.0+1.0i 0) 0.0+1.0i)
(num-test (+ 0.0+1.0i 0.0) 0.0+1.0i)
-(num-test (+ 0.0+1.0i 0.0+1.0i) 0.0+2.0i)
(num-test (+ 0.0+1.0i 1) 1.0+1.0i)
-(num-test (+ 0.0+1.0i 1.0) 1.0+1.0i)
(num-test (+ 0.0+1.0i 1.0+1.0i) 1.0+2.0i)
-(num-test (+ 0.0+1.0i 1/1) 1.0+1.0i)
(num-test (+ 0.0+1.0i 123.4) 123.4+1.0i)
-(num-test (+ 0.0+1.0i 1234) 1234.0+1.0i)
(num-test (+ 0.0+1.0i 1234/11) 112.18181818181819+1.0i)
-(num-test (+ 0/1) 0/1)
(num-test (+ 1 -1.0+1.0i) 0.0+1.0i)
-(num-test (+ 1 0) 1)
(num-test (+ 1 0.0) 1.0)
-(num-test (+ 1 0.0+1.0i) 1.0+1.0i)
(num-test (+ 1 1 -1.0+1.0i) 1.0+1.0i)
-(num-test (+ 1 1 0) 2)
(num-test (+ 1 1 0.0) 2.0)
-(num-test (+ 1 1 0.0+1.0i) 2.0+1.0i)
(num-test (+ 1 1 1) 3)
-(num-test (+ 1 1 1.0) 3.0)
(num-test (+ 1 1 1.0+1.0i) 3.0+1.0i)
-(num-test (+ 1 1 1/1) 3)
(num-test (+ 1 1 123.4) 125.4)
-(num-test (+ 1 1 1234) 1236)
(num-test (+ 1 1 1234/11) 1256/11)
-(num-test (+ 1 1) 2)
(num-test (+ 1 1.0 -1.0+1.0i) 1.0+1.0i)
-(num-test (+ 1 1.0 0) 2.0)
(num-test (+ 1 1.0 0.0) 2.0)
-(num-test (+ 1 1.0 0.0+1.0i) 2.0+1.0i)
(num-test (+ 1 1.0 1) 3.0)
-(num-test (+ 1 1.0 1.0) 3.0)
(num-test (+ 1 1.0 1.0+1.0i) 3.0+1.0i)
-(num-test (+ 1 1.0 1/1) 3.0)
(num-test (+ 1 1.0 123.4) 125.4)
-(num-test (+ 1 1.0 1234) 1236.0)
(num-test (+ 1 1.0 1234/11) 114.18181818181819)
-(num-test (+ 1 1.0) 2.0)
(num-test (+ 1 1.0+1.0i -1.0+1.0i) 1.0+2.0i)
-(num-test (+ 1 1.0+1.0i 0) 2.0+1.0i)
(num-test (+ 1 1.0+1.0i 0.0) 2.0+1.0i)
-(num-test (+ 1 1.0+1.0i 0.0+1.0i) 2.0+2.0i)
(num-test (+ 1 1.0+1.0i 1) 3.0+1.0i)
-(num-test (+ 1 1.0+1.0i 1.0) 3.0+1.0i)
(num-test (+ 1 1.0+1.0i 1.0+1.0i) 3.0+2.0i)
-(num-test (+ 1 1.0+1.0i 1/1) 3.0+1.0i)
(num-test (+ 1 1.0+1.0i 123.4) 125.4+1.0i)
-(num-test (+ 1 1.0+1.0i 1234) 1236.0+1.0i)
(num-test (+ 1 1.0+1.0i 1234/11) 114.18181818181819+1.0i)
-(num-test (+ 1 1.0+1.0i) 2.0+1.0i)
(num-test (+ 1 123.4) 124.4)
-(num-test (+ 1 1234) 1235)
(num-test (+ 1 1234/11) 1245/11)
-(num-test (+ 1.0 -1.0+1.0i -1.0+1.0i) -1.0+2.0i)
(num-test (+ 1.0 -1.0+1.0i 0) 0.0+1.0i)
-(num-test (+ 1.0 -1.0+1.0i 0.0) 0.0+1.0i)
(num-test (+ 1.0 -1.0+1.0i 0.0+1.0i) 0.0+2.0i)
-(num-test (+ 1.0 -1.0+1.0i 1) 1.0+1.0i)
(num-test (+ 1.0 -1.0+1.0i 1.0) 1.0+1.0i)
-(num-test (+ 1.0 -1.0+1.0i 1.0+1.0i) 1.0+2.0i)
(num-test (+ 1.0 -1.0+1.0i 1/1) 1.0+1.0i)
-(num-test (+ 1.0 -1.0+1.0i 123.4) 123.4+1.0i)
(num-test (+ 1.0 -1.0+1.0i 1234) 1234.0+1.0i)
-(num-test (+ 1.0 -1.0+1.0i 1234/11) 112.18181818181819+1.0i)
(num-test (+ 1.0 -1.0+1.0i) 0.0+1.0i)
-(num-test (+ 1.0 0 -1.0+1.0i) 0.0+1.0i)
(num-test (+ 1.0 0 0) 1.0)
-(num-test (+ 1.0 0 0.0) 1.0)
(num-test (+ 1.0 0 0.0+1.0i) 1.0+1.0i)
-(num-test (+ 1.0 0 1) 2.0)
(num-test (+ 1.0 0 1.0) 2.0)
-(num-test (+ 1.0 0 1.0+1.0i) 2.0+1.0i)
(num-test (+ 1.0 0 1/1) 2.0)
-(num-test (+ 1.0 0 123.4) 124.4)
(num-test (+ 1.0 0 1234) 1235.0)
-(num-test (+ 1.0 0 1234/11) 113.18181818181819)
(num-test (+ 1.0 0) 1.0)
-(num-test (+ 1.0 0.0 -1.0+1.0i) 0.0+1.0i)
(num-test (+ 1.0 0.0 0) 1.0)
-(num-test (+ 1.0 0.0 0.0) 1.0)
(num-test (+ 1.0 0.0 0.0+1.0i) 1.0+1.0i)
-(num-test (+ 1.0 0.0 1) 2.0)
(num-test (+ 1.0 0.0 1.0) 2.0)
-(num-test (+ 1.0 0.0 1.0+1.0i) 2.0+1.0i)
(num-test (+ 1.0 0.0 1/1) 2.0)
-(num-test (+ 1.0 0.0 123.4) 124.4)
(num-test (+ 1.0 0.0 1234) 1235.0)
-(num-test (+ 1.0 0.0 1234/11) 113.18181818181819)
(num-test (+ 1.0 0.0) 1.0)
-(num-test (+ 1.0 0.0+1.0i -1.0+1.0i) 0.0+2.0i)
(num-test (+ 1.0 0.0+1.0i 0) 1.0+1.0i)
-(num-test (+ 1.0 0.0+1.0i 0.0) 1.0+1.0i)
(num-test (+ 1.0 0.0+1.0i 0.0+1.0i) 1.0+2.0i)
-(num-test (+ 1.0 0.0+1.0i 1) 2.0+1.0i)
(num-test (+ 1.0 0.0+1.0i 1.0) 2.0+1.0i)
-(num-test (+ 1.0 0.0+1.0i 1.0+1.0i) 2.0+2.0i)
(num-test (+ 1.0 0.0+1.0i 1/1) 2.0+1.0i)
-(num-test (+ 1.0 0.0+1.0i 123.4) 124.4+1.0i)
(num-test (+ 1.0 0.0+1.0i 1234) 1235.0+1.0i)
-(num-test (+ 1.0 0.0+1.0i 1234/11) 113.18181818181819+1.0i)
(num-test (+ 1.0 0.0+1.0i) 1.0+1.0i)
-(num-test (+ 1.0 1 -1.0+1.0i) 1.0+1.0i)
(num-test (+ 1.0 1 0) 2.0)
-(num-test (+ 1.0 1 0.0) 2.0)
(num-test (+ 1.0 1 0.0+1.0i) 2.0+1.0i)
-(num-test (+ 1.0 1 1) 3.0)
(num-test (+ 1.0 1 1.0) 3.0)
-(num-test (+ 1.0 1 1.0+1.0i) 3.0+1.0i)
(num-test (+ 1.0 1 1/1) 3.0)
-(num-test (+ 1.0 1 123.4) 125.4)
(num-test (+ 1.0 1 1234) 1236.0)
-(num-test (+ 1.0 1 1234/11) 114.18181818181819)
(num-test (+ 1.0 1) 2.0)
-(num-test (+ 1.0 1.0 -1.0+1.0i) 1.0+1.0i)
(num-test (+ 1.0 1.0 0) 2.0)
-(num-test (+ 1.0 1.0 0.0) 2.0)
(num-test (+ 1.0 1.0 0.0+1.0i) 2.0+1.0i)
-(num-test (+ 1.0 1.0 1) 3.0)
(num-test (+ 1.0 1.0 1.0) 3.0)
-(num-test (+ 1.0 1.0 1.0+1.0i) 3.0+1.0i)
(num-test (+ 1.0 1.0 1/1) 3.0)
-(num-test (+ 1.0 1.0 123.4) 125.4)
(num-test (+ 1.0 1.0 1234) 1236.0)
-(num-test (+ 1.0 1.0 1234/11) 114.18181818181819)
(num-test (+ 1.0 1.0) 2.0)
-(num-test (+ 1.0 1.0+1.0i -1.0+1.0i) 1.0+2.0i)
(num-test (+ 1.0 1.0+1.0i 0) 2.0+1.0i)
-(num-test (+ 1.0 1.0+1.0i 0.0) 2.0+1.0i)
(num-test (+ 1.0 1.0+1.0i 0.0+1.0i) 2.0+2.0i)
-(num-test (+ 1.0 1.0+1.0i 1) 3.0+1.0i)
(num-test (+ 1.0 1.0+1.0i 1.0) 3.0+1.0i)
-(num-test (+ 1.0 1.0+1.0i 1.0+1.0i) 3.0+2.0i)
(num-test (+ 1.0 1.0+1.0i 1/1) 3.0+1.0i)
-(num-test (+ 1.0 1.0+1.0i 123.4) 125.4+1.0i)
(num-test (+ 1.0 1.0+1.0i 1234) 1236.0+1.0i)
-(num-test (+ 1.0 1.0+1.0i 1234/11) 114.18181818181819+1.0i)
(num-test (+ 1.0 1.0+1.0i) 2.0+1.0i)
-(num-test (+ 1.0 1/1 -1.0+1.0i) 1.0+1.0i)
(num-test (+ 1.0 123.4 -1.0+1.0i) 123.4+1.0i)
-(num-test (+ 1.0 123.4 0) 124.4)
(num-test (+ 1.0 123.4 0.0) 124.4)
-(num-test (+ 1.0 123.4 0.0+1.0i) 124.4+1.0i)
(num-test (+ 1.0 123.4 1) 125.4)
-(num-test (+ 1.0 123.4 1.0) 125.4)
(num-test (+ 1.0 123.4 1.0+1.0i) 125.4+1.0i)
-(num-test (+ 1.0 123.4 1/1) 125.4)
(num-test (+ 1.0 123.4 123.4) 247.8)
-(num-test (+ 1.0 123.4 1234) 1358.4)
(num-test (+ 1.0 123.4 1234/11) 236.58181818181819)
-(num-test (+ 1.0 123.4) 124.4)
(num-test (+ 1.0 1234 -1.0+1.0i) 1234.0+1.0i)
-(num-test (+ 1.0 1234 0) 1235.0)
(num-test (+ 1.0 1234 0.0) 1235.0)
-(num-test (+ 1.0 1234 0.0+1.0i) 1235.0+1.0i)
(num-test (+ 1.0 1234 1) 1236.0)
-(num-test (+ 1.0 1234 1.0) 1236.0)
(num-test (+ 1.0 1234 1.0+1.0i) 1236.0+1.0i)
-(num-test (+ 1.0 1234 1/1) 1236.0)
(num-test (+ 1.0 1234 123.4) 1358.4)
-(num-test (+ 1.0 1234 1234) 2469.0)
(num-test (+ 1.0 1234 1234/11) 1347.18181818181824)
-(num-test (+ 1.0 1234) 1235.0)
(num-test (+ 1.0 1234/11 -1.0+1.0i) 112.18181818181819+1.0i)
-(num-test (+ 1.0 1234/11 0) 113.18181818181819)
(num-test (+ 1.0 1234/11 0.0) 113.18181818181819)
-(num-test (+ 1.0 1234/11 0.0+1.0i) 113.18181818181819+1.0i)
(num-test (+ 1.0 1234/11 1) 114.18181818181819)
-(num-test (+ 1.0 1234/11 1.0) 114.18181818181819)
(num-test (+ 1.0 1234/11 1.0+1.0i) 114.18181818181819+1.0i)
-(num-test (+ 1.0 1234/11 1/1) 114.18181818181819)
(num-test (+ 1.0 1234/11 123.4) 236.58181818181819)
-(num-test (+ 1.0 1234/11 1234) 1347.18181818181824)
(num-test (+ 1.0 1234/11 1234/11) 225.36363636363637)
-(num-test (+ 1.0 1234/11) 113.18181818181819)
(num-test (+ 1.0) 1.0)
-(num-test (+ 1.0+1.0i -1.0+1.0i -1.0+1.0i) -1.0+3.0i)
(num-test (+ 1.0+1.0i -1.0+1.0i 0) 0.0+2.0i)
-(num-test (+ 1.0+1.0i -1.0+1.0i 0.0) 0.0+2.0i)
(num-test (+ 1.0+1.0i -1.0+1.0i 0.0+1.0i) 0.0+3.0i)
-(num-test (+ 1.0+1.0i -1.0+1.0i 1) 1.0+2.0i)
(num-test (+ 1.0+1.0i -1.0+1.0i 1.0) 1.0+2.0i)
-(num-test (+ 1.0+1.0i -1.0+1.0i 1.0+1.0i) 1.0+3.0i)
(num-test (+ 1.0+1.0i -1.0+1.0i 1/1) 1.0+2.0i)
-(num-test (+ 1.0+1.0i -1.0+1.0i 123.4) 123.4+2.0i)
(num-test (+ 1.0+1.0i -1.0+1.0i 1234) 1234.0+2.0i)
-(num-test (+ 1.0+1.0i -1.0+1.0i 1234/11) 112.18181818181819+2.0i)
(num-test (+ 1.0+1.0i -1.0+1.0i) 0.0+2.0i)
-(num-test (+ 1.0+1.0i 0 -1.0+1.0i) 0.0+2.0i)
(num-test (+ 1.0+1.0i 0 0) 1.0+1.0i)
-(num-test (+ 1.0+1.0i 0 0.0) 1.0+1.0i)
(num-test (+ 1.0+1.0i 0 0.0+1.0i) 1.0+2.0i)
-(num-test (+ 1.0+1.0i 0 1) 2.0+1.0i)
(num-test (+ 1.0+1.0i 0 1.0) 2.0+1.0i)
-(num-test (+ 1.0+1.0i 0 1.0+1.0i) 2.0+2.0i)
(num-test (+ 1.0+1.0i 0 1/1) 2.0+1.0i)
-(num-test (+ 1.0+1.0i 0 123.4) 124.4+1.0i)
(num-test (+ 1.0+1.0i 0 1234) 1235.0+1.0i)
-(num-test (+ 1.0+1.0i 0 1234/11) 113.18181818181819+1.0i)
(num-test (+ 1.0+1.0i 0) 1.0+1.0i)
-(num-test (+ 1.0+1.0i 0.0 -1.0+1.0i) 0.0+2.0i)
(num-test (+ 1.0+1.0i 0.0 0) 1.0+1.0i)
-(num-test (+ 1.0+1.0i 0.0 0.0) 1.0+1.0i)
(num-test (+ 1.0+1.0i 0.0 0.0+1.0i) 1.0+2.0i)
-(num-test (+ 1.0+1.0i 0.0 1) 2.0+1.0i)
(num-test (+ 1.0+1.0i 0.0 1.0) 2.0+1.0i)
-(num-test (+ 1.0+1.0i 0.0 1.0+1.0i) 2.0+2.0i)
(num-test (+ 1.0+1.0i 0.0 1/1) 2.0+1.0i)
-(num-test (+ 1.0+1.0i 0.0 123.4) 124.4+1.0i)
(num-test (+ 1.0+1.0i 0.0 1234) 1235.0+1.0i)
-(num-test (+ 1.0+1.0i 0.0 1234/11) 113.18181818181819+1.0i)
(num-test (+ 1.0+1.0i 0.0) 1.0+1.0i)
-(num-test (+ 1.0+1.0i 0.0+1.0i -1.0+1.0i) 0.0+3.0i)
(num-test (+ 1.0+1.0i 0.0+1.0i 0) 1.0+2.0i)
-(num-test (+ 1.0+1.0i 0.0+1.0i 0.0) 1.0+2.0i)
(num-test (+ 1.0+1.0i 0.0+1.0i 0.0+1.0i) 1.0+3.0i)
-(num-test (+ 1.0+1.0i 0.0+1.0i 1) 2.0+2.0i)
(num-test (+ 1.0+1.0i 0.0+1.0i 1.0) 2.0+2.0i)
-(num-test (+ 1.0+1.0i 0.0+1.0i 1.0+1.0i) 2.0+3.0i)
(num-test (+ 1.0+1.0i 0.0+1.0i 1/1) 2.0+2.0i)
-(num-test (+ 1.0+1.0i 0.0+1.0i 123.4) 124.4+2.0i)
(num-test (+ 1.0+1.0i 0.0+1.0i 1234) 1235.0+2.0i)
-(num-test (+ 1.0+1.0i 0.0+1.0i 1234/11) 113.18181818181819+2.0i)
(num-test (+ 1.0+1.0i 0.0+1.0i) 1.0+2.0i)
-(num-test (+ 1.0+1.0i 1 -1.0+1.0i) 1.0+2.0i)
(num-test (+ 1.0+1.0i 1 0) 2.0+1.0i)
-(num-test (+ 1.0+1.0i 1 0.0) 2.0+1.0i)
(num-test (+ 1.0+1.0i 1 0.0+1.0i) 2.0+2.0i)
-(num-test (+ 1.0+1.0i 1 1) 3.0+1.0i)
(num-test (+ 1.0+1.0i 1 1.0) 3.0+1.0i)
-(num-test (+ 1.0+1.0i 1 1.0+1.0i) 3.0+2.0i)
(num-test (+ 1.0+1.0i 1 1/1) 3.0+1.0i)
-(num-test (+ 1.0+1.0i 1 123.4) 125.4+1.0i)
(num-test (+ 1.0+1.0i 1 1234) 1236.0+1.0i)
-(num-test (+ 1.0+1.0i 1 1234/11) 114.18181818181819+1.0i)
(num-test (+ 1.0+1.0i 1) 2.0+1.0i)
-(num-test (+ 1.0+1.0i 1.0 -1.0+1.0i) 1.0+2.0i)
(num-test (+ 1.0+1.0i 1.0 0) 2.0+1.0i)
-(num-test (+ 1.0+1.0i 1.0 0.0) 2.0+1.0i)
(num-test (+ 1.0+1.0i 1.0 0.0+1.0i) 2.0+2.0i)
-(num-test (+ 1.0+1.0i 1.0 1) 3.0+1.0i)
(num-test (+ 1.0+1.0i 1.0 1.0) 3.0+1.0i)
-(num-test (+ 1.0+1.0i 1.0 1.0+1.0i) 3.0+2.0i)
(num-test (+ 1.0+1.0i 1.0 1/1) 3.0+1.0i)
-(num-test (+ 1.0+1.0i 1.0 123.4) 125.4+1.0i)
(num-test (+ 1.0+1.0i 1.0 1234) 1236.0+1.0i)
-(num-test (+ 1.0+1.0i 1.0 1234/11) 114.18181818181819+1.0i)
(num-test (+ 1.0+1.0i 1.0) 2.0+1.0i)
-(num-test (+ 1.0+1.0i 1.0+1.0i -1.0+1.0i) 1.0+3.0i)
(num-test (+ 1.0+1.0i 1.0+1.0i 0) 2.0+2.0i)
-(num-test (+ 1.0+1.0i 1.0+1.0i 0.0) 2.0+2.0i)
(num-test (+ 1.0+1.0i 1.0+1.0i 0.0+1.0i) 2.0+3.0i)
-(num-test (+ 1.0+1.0i 1.0+1.0i 1) 3.0+2.0i)
(num-test (+ 1.0+1.0i 1.0+1.0i 1.0) 3.0+2.0i)
-(num-test (+ 1.0+1.0i 1.0+1.0i 1.0+1.0i) 3.0+3.0i)
(num-test (+ 1.0+1.0i 1.0+1.0i 1/1) 3.0+2.0i)
-(num-test (+ 1.0+1.0i 1.0+1.0i 123.4) 125.4+2.0i)
(num-test (+ 1.0+1.0i 1.0+1.0i 1234) 1236.0+2.0i)
-(num-test (+ 1.0+1.0i 1.0+1.0i 1234/11) 114.18181818181819+2.0i)
(num-test (+ 1.0+1.0i 1.0+1.0i) 2.0+2.0i)
-(num-test (+ 1.0+1.0i 123.4 -1.0+1.0i) 123.4+2.0i)
(num-test (+ 1.0+1.0i 123.4 0) 124.4+1.0i)
-(num-test (+ 1.0+1.0i 123.4 0.0) 124.4+1.0i)
(num-test (+ 1.0+1.0i 123.4 0.0+1.0i) 124.4+2.0i)
-(num-test (+ 1.0+1.0i 123.4 1) 125.4+1.0i)
(num-test (+ 1.0+1.0i 123.4 1.0) 125.4+1.0i)
-(num-test (+ 1.0+1.0i 123.4 1.0+1.0i) 125.4+2.0i)
(num-test (+ 1.0+1.0i 123.4 1/1) 125.4+1.0i)
-(num-test (+ 1.0+1.0i 123.4 123.4) 247.8+1.0i)
(num-test (+ 1.0+1.0i 123.4 1234) 1358.4+1.0i)
-(num-test (+ 1.0+1.0i 123.4 1234/11) 236.58181818181819+1.0i)
(num-test (+ 1.0+1.0i 123.4) 124.4+1.0i)
-(num-test (+ 1.0+1.0i 1234 -1.0+1.0i) 1234.0+2.0i)
(num-test (+ 1.0+1.0i 1234 0) 1235.0+1.0i)
-(num-test (+ 1.0+1.0i 1234 0.0) 1235.0+1.0i)
(num-test (+ 1.0+1.0i 1234 0.0+1.0i) 1235.0+2.0i)
-(num-test (+ 1.0+1.0i 1234 1) 1236.0+1.0i)
(num-test (+ 1.0+1.0i 1234 1.0) 1236.0+1.0i)
-(num-test (+ 1.0+1.0i 1234 1.0+1.0i) 1236.0+2.0i)
(num-test (+ 1.0+1.0i 1234 1/1) 1236.0+1.0i)
-(num-test (+ 1.0+1.0i 1234 123.4) 1358.4+1.0i)
(num-test (+ 1.0+1.0i 1234 1234) 2469.0+1.0i)
-(num-test (+ 1.0+1.0i 1234 1234/11) 1347.18181818181824+1.0i)
(num-test (+ 1.0+1.0i 1234) 1235.0+1.0i)
-(num-test (+ 1.0+1.0i 1234/11 -1.0+1.0i) 112.18181818181819+2.0i)
(num-test (+ 1.0+1.0i 1234/11 0) 113.18181818181819+1.0i)
-(num-test (+ 1.0+1.0i 1234/11 0.0) 113.18181818181819+1.0i)
(num-test (+ 1.0+1.0i 1234/11 0.0+1.0i) 113.18181818181819+2.0i)
-(num-test (+ 1.0+1.0i 1234/11 1) 114.18181818181819+1.0i)
(num-test (+ 1.0+1.0i 1234/11 1.0) 114.18181818181819+1.0i)
-(num-test (+ 1.0+1.0i 1234/11 1.0+1.0i) 114.18181818181819+2.0i)
(num-test (+ 1.0+1.0i 1234/11 1/1) 114.18181818181819+1.0i)
-(num-test (+ 1.0+1.0i 1234/11 123.4) 236.58181818181819+1.0i)
(num-test (+ 1.0+1.0i 1234/11 1234) 1347.18181818181824+1.0i)
-(num-test (+ 1.0+1.0i 1234/11 1234/11) 225.36363636363637+1.0i)
(num-test (+ 1.0+1.0i 1234/11) 113.18181818181819+1.0i)
-(num-test (+ 1.0+1.0i) 1.0+1.0i)
(num-test (+ 10) 10)
-(num-test (+ 10/3) 10/3)
(num-test (+ 123.4 -1.0+1.0i -1.0+1.0i) 121.4+2.0i)
-(num-test (+ 123.4 -1.0+1.0i 0) 122.4+1.0i)
(num-test (+ 123.4 -1.0+1.0i 0.0) 122.4+1.0i)
-(num-test (+ 123.4 -1.0+1.0i 0.0+1.0i) 122.4+2.0i)
(num-test (+ 123.4 -1.0+1.0i 1) 123.4+1.0i)
-(num-test (+ 123.4 -1.0+1.0i 1.0) 123.4+1.0i)
(num-test (+ 123.4 -1.0+1.0i 1.0+1.0i) 123.4+2.0i)
-(num-test (+ 123.4 -1.0+1.0i 1/1) 123.4+1.0i)
(num-test (+ 123.4 -1.0+1.0i 123.4) 245.8+1.0i)
-(num-test (+ 123.4 -1.0+1.0i 1234) 1356.4+1.0i)
(num-test (+ 123.4 -1.0+1.0i 1234/11) 234.58181818181819+1.0i)
-(num-test (+ 123.4 -1.0+1.0i) 122.4+1.0i)
(num-test (+ 123.4 0 -1.0+1.0i) 122.4+1.0i)
-(num-test (+ 123.4 0 0) 123.4)
(num-test (+ 123.4 0 0.0) 123.4)
-(num-test (+ 123.4 0 0.0+1.0i) 123.4+1.0i)
(num-test (+ 123.4 0 1) 124.4)
-(num-test (+ 123.4 0 1.0) 124.4)
(num-test (+ 123.4 0 1.0+1.0i) 124.4+1.0i)
-(num-test (+ 123.4 0 1/1) 124.4)
(num-test (+ 123.4 0 123.4) 246.8)
-(num-test (+ 123.4 0 1234) 1357.4)
(num-test (+ 123.4 0 1234/11) 235.58181818181819)
-(num-test (+ 123.4 0) 123.4)
(num-test (+ 123.4 0.0 -1.0+1.0i) 122.4+1.0i)
-(num-test (+ 123.4 0.0 0) 123.4)
(num-test (+ 123.4 0.0 0.0) 123.4)
-(num-test (+ 123.4 0.0 0.0+1.0i) 123.4+1.0i)
(num-test (+ 123.4 0.0 1) 124.4)
-(num-test (+ 123.4 0.0 1.0) 124.4)
(num-test (+ 123.4 0.0 1.0+1.0i) 124.4+1.0i)
-(num-test (+ 123.4 0.0 1/1) 124.4)
(num-test (+ 123.4 0.0 123.4) 246.8)
-(num-test (+ 123.4 0.0 1234) 1357.4)
(num-test (+ 123.4 0.0 1234/11) 235.58181818181819)
-(num-test (+ 123.4 0.0) 123.4)
(num-test (+ 123.4 0.0+1.0i -1.0+1.0i) 122.4+2.0i)
-(num-test (+ 123.4 0.0+1.0i 0) 123.4+1.0i)
(num-test (+ 123.4 0.0+1.0i 0.0) 123.4+1.0i)
-(num-test (+ 123.4 0.0+1.0i 0.0+1.0i) 123.4+2.0i)
(num-test (+ 123.4 0.0+1.0i 1) 124.4+1.0i)
-(num-test (+ 123.4 0.0+1.0i 1.0) 124.4+1.0i)
(num-test (+ 123.4 0.0+1.0i 1.0+1.0i) 124.4+2.0i)
-(num-test (+ 123.4 0.0+1.0i 1/1) 124.4+1.0i)
(num-test (+ 123.4 0.0+1.0i 123.4) 246.8+1.0i)
-(num-test (+ 123.4 0.0+1.0i 1234) 1357.4+1.0i)
(num-test (+ 123.4 0.0+1.0i 1234/11) 235.58181818181819+1.0i)
-(num-test (+ 123.4 0.0+1.0i) 123.4+1.0i)
(num-test (+ 123.4 1 -1.0+1.0i) 123.4+1.0i)
-(num-test (+ 123.4 1 0) 124.4)
(num-test (+ 123.4 1 0.0) 124.4)
-(num-test (+ 123.4 1 0.0+1.0i) 124.4+1.0i)
(num-test (+ 123.4 1 1) 125.4)
-(num-test (+ 123.4 1 1.0) 125.4)
(num-test (+ 123.4 1 1.0+1.0i) 125.4+1.0i)
-(num-test (+ 123.4 1 1/1) 125.4)
(num-test (+ 123.4 1 123.4) 247.8)
-(num-test (+ 123.4 1 1234) 1358.4)
(num-test (+ 123.4 1 1234/11) 236.58181818181819)
-(num-test (+ 123.4 1) 124.4)
(num-test (+ 123.4 1.0 -1.0+1.0i) 123.4+1.0i)
-(num-test (+ 123.4 1.0 0) 124.4)
(num-test (+ 123.4 1.0 0.0) 124.4)
-(num-test (+ 123.4 1.0 0.0+1.0i) 124.4+1.0i)
(num-test (+ 123.4 1.0 1) 125.4)
-(num-test (+ 123.4 1.0 1.0) 125.4)
(num-test (+ 123.4 1.0 1.0+1.0i) 125.4+1.0i)
-(num-test (+ 123.4 1.0 1/1) 125.4)
(num-test (+ 123.4 1.0 123.4) 247.8)
-(num-test (+ 123.4 1.0 1234) 1358.4)
(num-test (+ 123.4 1.0 1234/11) 236.58181818181819)
-(num-test (+ 123.4 1.0) 124.4)
(num-test (+ 123.4 1.0+1.0i -1.0+1.0i) 123.4+2.0i)
-(num-test (+ 123.4 1.0+1.0i 0) 124.4+1.0i)
(num-test (+ 123.4 1.0+1.0i 0.0) 124.4+1.0i)
-(num-test (+ 123.4 1.0+1.0i 0.0+1.0i) 124.4+2.0i)
(num-test (+ 123.4 1.0+1.0i 1) 125.4+1.0i)
-(num-test (+ 123.4 1.0+1.0i 1.0) 125.4+1.0i)
(num-test (+ 123.4 1.0+1.0i 1.0+1.0i) 125.4+2.0i)
-(num-test (+ 123.4 1.0+1.0i 1/1) 125.4+1.0i)
(num-test (+ 123.4 1.0+1.0i 123.4) 247.8+1.0i)
-(num-test (+ 123.4 1.0+1.0i 1234) 1358.4+1.0i)
(num-test (+ 123.4 1.0+1.0i 1234/11) 236.58181818181819+1.0i)
-(num-test (+ 123.4 1.0+1.0i) 124.4+1.0i)
(num-test (+ 123.4 1/1 -1.0+1.0i) 123.4+1.0i)
-(num-test (+ 123.4 123.4 -1.0+1.0i) 245.8+1.0i)
(num-test (+ 123.4 123.4 0) 246.8)
-(num-test (+ 123.4 123.4 0.0) 246.8)
(num-test (+ 123.4 123.4 0.0+1.0i) 246.8+1.0i)
-(num-test (+ 123.4 123.4 1) 247.8)
(num-test (+ 123.4 123.4 1.0) 247.8)
-(num-test (+ 123.4 123.4 1.0+1.0i) 247.8+1.0i)
(num-test (+ 123.4 123.4 1/1) 247.8)
-(num-test (+ 123.4 123.4 123.4) 370.20000000000005)
(num-test (+ 123.4 123.4 1234) 1480.79999999999995)
-(num-test (+ 123.4 123.4 1234/11) 358.98181818181820)
(num-test (+ 123.4 123.4) 246.8)
-(num-test (+ 123.4 1234 -1.0+1.0i) 1356.4+1.0i)
(num-test (+ 123.4 1234 0) 1357.4)
-(num-test (+ 123.4 1234 0.0) 1357.4)
(num-test (+ 123.4 1234 0.0+1.0i) 1357.4+1.0i)
-(num-test (+ 123.4 1234 1) 1358.4)
(num-test (+ 123.4 1234 1.0) 1358.4)
-(num-test (+ 123.4 1234 1.0+1.0i) 1358.4+1.0i)
(num-test (+ 123.4 1234 1/1) 1358.4)
-(num-test (+ 123.4 1234 123.4) 1480.80000000000018)
(num-test (+ 123.4 1234 1234) 2591.4)
-(num-test (+ 123.4 1234 1234/11) 1469.58181818181833)
(num-test (+ 123.4 1234) 1357.4)
-(num-test (+ 123.4 1234/11 -1.0+1.0i) 234.58181818181819+1.0i)
(num-test (+ 123.4 1234/11 0) 235.58181818181819)
-(num-test (+ 123.4 1234/11 0.0) 235.58181818181819)
(num-test (+ 123.4 1234/11 0.0+1.0i) 235.58181818181819+1.0i)
-(num-test (+ 123.4 1234/11 1) 236.58181818181819)
(num-test (+ 123.4 1234/11 1.0) 236.58181818181819)
-(num-test (+ 123.4 1234/11 1.0+1.0i) 236.58181818181819+1.0i)
(num-test (+ 123.4 1234/11 1/1) 236.58181818181819)
-(num-test (+ 123.4 1234/11 123.4) 358.98181818181820)
(num-test (+ 123.4 1234/11 1234) 1469.58181818181811)
-(num-test (+ 123.4 1234/11 1234/11) 347.76363636363635)
(num-test (+ 123.4 1234/11) 235.58181818181819)
-(num-test (+ 1234 -1.0+1.0i) 1233.0+1.0i)
(num-test (+ 1234 0) 1234)
-(num-test (+ 1234 0.0) 1234.0)
(num-test (+ 1234 0.0+1.0i) 1234.0+1.0i)
-(num-test (+ 1234 1) 1235)
(num-test (+ 1234 1.0) 1235.0)
-(num-test (+ 1234 1.0+1.0i) 1235.0+1.0i)
(num-test (+ 1234 1/1) 1235)
-(num-test (+ 1234 123.4) 1357.4)
(num-test (+ 1234 1234) 2468)
-(num-test (+ 1234 1234/11) 14808/11)
(num-test (+ 1234/11 -1.0+1.0i) 111.18181818181819+1.0i)
-(num-test (+ 1234/11 0) 1234/11)
(num-test (+ 1234/11 0.0) 112.18181818181819)
-(num-test (+ 1234/11 0.0+1.0i) 112.18181818181819+1.0i)
(num-test (+ 1234/11 1) 1245/11)
-(num-test (+ 1234/11 1.0) 113.18181818181819)
(num-test (+ 1234/11 1.0+1.0i) 113.18181818181819+1.0i)
-(num-test (+ 1234/11 1/1) 1245/11)
(num-test (+ 1234/11 123.4) 235.58181818181819)
-(num-test (+ 1234/11 1234) 14808/11)
(num-test (+ 1234/11 1234/11) 2468/11)
-(num-test (+ 1234000000) 1234000000)
(num-test (+ 1234000000.0) 1234000000.0)
-(num-test (+ 1234000000/10) 1234000000/10)
(num-test (+ 2) 2)
(num-test (+ 2/2) 2/2)
@@ -87393,623 +86976,314 @@ gmp:
(num-test (- 0 -1.0+1.0i) 1.0-1.0i)
(num-test (- 0 0) 0)
(num-test (- 0 0.0) 0.0)
-(num-test (- 0 0.0+1.0i) 0.0-1.0i)
(num-test (- 0 1 -1.0+1.0i) 0.0-1.0i)
-(num-test (- 0 1 0) -1)
(num-test (- 0 1 0.0) -1.0)
-(num-test (- 0 1 0.0+1.0i) -1.0-1.0i)
(num-test (- 0 1 1) -2)
-(num-test (- 0 1 1.0) -2.0)
(num-test (- 0 1 1.0+1.0i) -2.0-1.0i)
-(num-test (- 0 1 1/1) -2)
(num-test (- 0 1 123.4) -124.4)
-(num-test (- 0 1 1234) -1235)
(num-test (- 0 1 1234/11) -1245/11)
-(num-test (- 0 1) -1)
(num-test (- 0 1.0 -1.0+1.0i) 0.0-1.0i)
-(num-test (- 0 1.0 0) -1.0)
(num-test (- 0 1.0 0.0) -1.0)
-(num-test (- 0 1.0 0.0+1.0i) -1.0-1.0i)
(num-test (- 0 1.0 1) -2.0)
-(num-test (- 0 1.0 1.0) -2.0)
(num-test (- 0 1.0 1.0+1.0i) -2.0-1.0i)
-(num-test (- 0 1.0 1/1) -2.0)
(num-test (- 0 1.0 123.4) -124.4)
-(num-test (- 0 1.0 1234) -1235.0)
(num-test (- 0 1.0 1234/11) -113.18181818181819)
-(num-test (- 0 1.0) -1.0)
(num-test (- 0 1.0+1.0i -1.0+1.0i) 0.0-2.0i)
-(num-test (- 0 1.0+1.0i 0) -1.0-1.0i)
(num-test (- 0 1.0+1.0i 0.0) -1.0-1.0i)
-(num-test (- 0 1.0+1.0i 0.0+1.0i) -1.0-2.0i)
(num-test (- 0 1.0+1.0i 1) -2.0-1.0i)
-(num-test (- 0 1.0+1.0i 1.0) -2.0-1.0i)
(num-test (- 0 1.0+1.0i 1.0+1.0i) -2.0-2.0i)
-(num-test (- 0 1.0+1.0i 1/1) -2.0-1.0i)
(num-test (- 0 1.0+1.0i 123.4) -124.4-1.0i)
-(num-test (- 0 1.0+1.0i 1234) -1235.0-1.0i)
(num-test (- 0 1.0+1.0i 1234/11) -113.18181818181819-1.0i)
-(num-test (- 0 1.0+1.0i) -1.0-1.0i)
(num-test (- 0 123.4) -123.4)
-(num-test (- 0 1234) -1234)
(num-test (- 0 1234/11) -1234/11)
-(num-test (- 0) 0)
(num-test (- 0.0 -1.0+1.0i -1.0+1.0i) 2.0-2.0i)
-(num-test (- 0.0 -1.0+1.0i 0) 1.0-1.0i)
(num-test (- 0.0 -1.0+1.0i 0.0) 1.0-1.0i)
-(num-test (- 0.0 -1.0+1.0i 0.0+1.0i) 1.0-2.0i)
(num-test (- 0.0 -1.0+1.0i 1) 0.0-1.0i)
-(num-test (- 0.0 -1.0+1.0i 1.0) 0.0-1.0i)
(num-test (- 0.0 -1.0+1.0i 1.0+1.0i) 0.0-2.0i)
-(num-test (- 0.0 -1.0+1.0i 1/1) 0.0-1.0i)
(num-test (- 0.0 -1.0+1.0i 123.4) -122.4-1.0i)
-(num-test (- 0.0 -1.0+1.0i 1234) -1233.0-1.0i)
(num-test (- 0.0 -1.0+1.0i 1234/11) -111.18181818181819-1.0i)
-(num-test (- 0.0 -1.0+1.0i) 1.0-1.0i)
(num-test (- 0.0 0 -1.0+1.0i) 1.0-1.0i)
-(num-test (- 0.0 0 0) 0.0)
(num-test (- 0.0 0 0.0) 0.0)
-(num-test (- 0.0 0 0.0+1.0i) 0.0-1.0i)
(num-test (- 0.0 0 1) -1.0)
-(num-test (- 0.0 0 1.0) -1.0)
(num-test (- 0.0 0 1.0+1.0i) -1.0-1.0i)
-(num-test (- 0.0 0 1/1) -1.0)
(num-test (- 0.0 0 123.4) -123.4)
-(num-test (- 0.0 0 1234) -1234.0)
(num-test (- 0.0 0 1234/11) -112.18181818181819)
-(num-test (- 0.0 0) 0.0)
(num-test (- 0.0 0.0 -1.0+1.0i) 1.0-1.0i)
-(num-test (- 0.0 0.0 0) 0.0)
(num-test (- 0.0 0.0 0.0) 0.0)
-(num-test (- 0.0 0.0 0.0+1.0i) 0.0-1.0i)
(num-test (- 0.0 0.0 1) -1.0)
-(num-test (- 0.0 0.0 1.0) -1.0)
(num-test (- 0.0 0.0 1.0+1.0i) -1.0-1.0i)
-(num-test (- 0.0 0.0 1/1) -1.0)
(num-test (- 0.0 0.0 123.4) -123.4)
-(num-test (- 0.0 0.0 1234) -1234.0)
(num-test (- 0.0 0.0 1234/11) -112.18181818181819)
-(num-test (- 0.0 0.0) 0.0)
(num-test (- 0.0 0.0+1.0i -1.0+1.0i) 1.0-2.0i)
-(num-test (- 0.0 0.0+1.0i 0) 0.0-1.0i)
(num-test (- 0.0 0.0+1.0i 0.0) 0.0-1.0i)
-(num-test (- 0.0 0.0+1.0i 0.0+1.0i) 0.0-2.0i)
(num-test (- 0.0 0.0+1.0i 1) -1.0-1.0i)
-(num-test (- 0.0 0.0+1.0i 1.0) -1.0-1.0i)
(num-test (- 0.0 0.0+1.0i 1.0+1.0i) -1.0-2.0i)
-(num-test (- 0.0 0.0+1.0i 1/1) -1.0-1.0i)
(num-test (- 0.0 0.0+1.0i 123.4) -123.4-1.0i)
-(num-test (- 0.0 0.0+1.0i 1234) -1234.0-1.0i)
(num-test (- 0.0 0.0+1.0i 1234/11) -112.18181818181819-1.0i)
-(num-test (- 0.0 0.0+1.0i) 0.0-1.0i)
(num-test (- 0.0 1 -1.0+1.0i) 0.0-1.0i)
-(num-test (- 0.0 1 0) -1.0)
(num-test (- 0.0 1 0.0) -1.0)
-(num-test (- 0.0 1 0.0+1.0i) -1.0-1.0i)
(num-test (- 0.0 1 1.0) -2.0)
-(num-test (- 0.0 1 1.0+1.0i) -2.0-1.0i)
(num-test (- 0.0 1 1/1) -2.0)
-(num-test (- 0.0 1 123.4) -124.4)
(num-test (- 0.0 1 1234) -1235.0)
-(num-test (- 0.0 1 1234/11) -113.18181818181819)
(num-test (- 0.0 1) -1.0)
-(num-test (- 0.0 1.0 -1.0+1.0i) 0.0-1.0i)
(num-test (- 0.0 1.0 0) -1.0)
-(num-test (- 0.0 1.0 0.0) -1.0)
(num-test (- 0.0 1.0 0.0+1.0i) -1.0-1.0i)
-(num-test (- 0.0 1.0 1) -2.0)
(num-test (- 0.0 1.0 1.0) -2.0)
-(num-test (- 0.0 1.0 1.0+1.0i) -2.0-1.0i)
(num-test (- 0.0 1.0 1/1) -2.0)
-(num-test (- 0.0 1.0 123.4) -124.4)
(num-test (- 0.0 1.0 1234) -1235.0)
-(num-test (- 0.0 1.0 1234/11) -113.18181818181819)
(num-test (- 0.0 1.0) -1.0)
-(num-test (- 0.0 1.0+1.0i -1.0+1.0i) 0.0-2.0i)
(num-test (- 0.0 1.0+1.0i 0) -1.0-1.0i)
-(num-test (- 0.0 1.0+1.0i 0.0) -1.0-1.0i)
(num-test (- 0.0 1.0+1.0i 0.0+1.0i) -1.0-2.0i)
-(num-test (- 0.0 1.0+1.0i 1) -2.0-1.0i)
(num-test (- 0.0 1.0+1.0i 1.0) -2.0-1.0i)
-(num-test (- 0.0 1.0+1.0i 1.0+1.0i) -2.0-2.0i)
(num-test (- 0.0 1.0+1.0i 1/1) -2.0-1.0i)
-(num-test (- 0.0 1.0+1.0i 123.4) -124.4-1.0i)
(num-test (- 0.0 1.0+1.0i 1234) -1235.0-1.0i)
-(num-test (- 0.0 1.0+1.0i 1234/11) -113.18181818181819-1.0i)
(num-test (- 0.0 1.0+1.0i) -1.0-1.0i)
-(num-test (- 0.0 1/1 -1.0+1.0i) 0.0-1.0i)
(num-test (- 0.0 123.4 -1.0+1.0i) -122.4-1.0i)
-(num-test (- 0.0 123.4 0) -123.4)
(num-test (- 0.0 123.4 0.0) -123.4)
-(num-test (- 0.0 123.4 0.0+1.0i) -123.4-1.0i)
(num-test (- 0.0 123.4 1) -124.4)
-(num-test (- 0.0 123.4 1.0) -124.4)
(num-test (- 0.0 123.4 1.0+1.0i) -124.4-1.0i)
-(num-test (- 0.0 123.4 1/1) -124.4)
(num-test (- 0.0 123.4 123.4) -246.8)
-(num-test (- 0.0 123.4 1234) -1357.4)
(num-test (- 0.0 123.4 1234/11) -235.58181818181819)
-(num-test (- 0.0 123.4) -123.4)
(num-test (- 0.0 1234 -1.0+1.0i) -1233.0-1.0i)
-(num-test (- 0.0 1234 0) -1234.0)
(num-test (- 0.0 1234 0.0) -1234.0)
-(num-test (- 0.0 1234 0.0+1.0i) -1234.0-1.0i)
(num-test (- 0.0 1234 1) -1235.0)
-(num-test (- 0.0 1234 1.0) -1235.0)
(num-test (- 0.0 1234 1.0+1.0i) -1235.0-1.0i)
-(num-test (- 0.0 1234 1/1) -1235.0)
(num-test (- 0.0 1234 123.4) -1357.4)
-(num-test (- 0.0 1234 1234) -2468.0)
(num-test (- 0.0 1234 1234/11) -1346.18181818181824)
-(num-test (- 0.0 1234) -1234.0)
(num-test (- 0.0 1234/11 -1.0+1.0i) -111.18181818181819-1.0i)
-(num-test (- 0.0 1234/11 0) -112.18181818181819)
(num-test (- 0.0 1234/11 0.0) -112.18181818181819)
-(num-test (- 0.0 1234/11 0.0+1.0i) -112.18181818181819-1.0i)
(num-test (- 0.0 1234/11 1) -113.18181818181819)
-(num-test (- 0.0 1234/11 1.0) -113.18181818181819)
(num-test (- 0.0 1234/11 1.0+1.0i) -113.18181818181819-1.0i)
-(num-test (- 0.0 1234/11 1/1) -113.18181818181819)
(num-test (- 0.0 1234/11 123.4) -235.58181818181819)
-(num-test (- 0.0 1234/11 1234) -1346.18181818181824)
(num-test (- 0.0 1234/11 1234/11) -224.36363636363637)
-(num-test (- 0.0 1234/11) -112.18181818181819)
(num-test (- 0.0) -0.0)
-(num-test (- 0.0+0.00000001i) -0.0-0.00000001i)
(num-test (- 0.0+1.0i -1.0+1.0i) 1.0)
-(num-test (- 0.0+1.0i 0) 0.0+1.0i)
(num-test (- 0.0+1.0i 0.0) 0.0+1.0i)
-(num-test (- 0.0+1.0i 0.0+1.0i) 0.0)
(num-test (- 0.0+1.0i 1) -1.0+1.0i)
-(num-test (- 0.0+1.0i 1.0) -1.0+1.0i)
(num-test (- 0.0+1.0i 1.0+1.0i) -1.0)
-(num-test (- 0.0+1.0i 1/1) -1.0+1.0i)
(num-test (- 0.0+1.0i 123.4) -123.4+1.0i)
-(num-test (- 0.0+1.0i 1234) -1234.0+1.0i)
(num-test (- 0.0+1.0i 1234/11) -112.18181818181819+1.0i)
-(num-test (- 0.0-0.00000001i) -0.0+0.00000001i)
(num-test (- 0/1) 0/1)
-(num-test (- 1 -1.0+1.0i) 2.0-1.0i)
(num-test (- 1 0) 1)
-(num-test (- 1 0.0) 1.0)
(num-test (- 1 0.0+1.0i) 1.0-1.0i)
-(num-test (- 1 1 -1.0+1.0i) 1.0-1.0i)
(num-test (- 1 1 0) 0)
-(num-test (- 1 1 0.0) 0.0)
(num-test (- 1 1 0.0+1.0i) 0.0-1.0i)
-(num-test (- 1 1 1) -1)
(num-test (- 1 1 1.0) -1.0)
-(num-test (- 1 1 1.0+1.0i) -1.0-1.0i)
(num-test (- 1 1 1/1) -1)
-(num-test (- 1 1 123.4) -123.4)
(num-test (- 1 1 1234) -1234)
-(num-test (- 1 1 1234/11) -1234/11)
(num-test (- 1 1) 0)
-(num-test (- 1 1.0 -1.0+1.0i) 1.0-1.0i)
(num-test (- 1 1.0 0) 0.0)
-(num-test (- 1 1.0 0.0) 0.0)
(num-test (- 1 1.0 0.0+1.0i) 0.0-1.0i)
-(num-test (- 1 1.0 1) -1.0)
(num-test (- 1 1.0 1.0) -1.0)
-(num-test (- 1 1.0 1.0+1.0i) -1.0-1.0i)
(num-test (- 1 1.0 1/1) -1.0)
-(num-test (- 1 1.0 123.4) -123.4)
(num-test (- 1 1.0 1234) -1234.0)
-(num-test (- 1 1.0 1234/11) -112.18181818181819)
(num-test (- 1 1.0) 0.0)
-(num-test (- 1 1.0+1.0i -1.0+1.0i) 1.0-2.0i)
(num-test (- 1 1.0+1.0i 0) 0.0-1.0i)
-(num-test (- 1 1.0+1.0i 0.0) 0.0-1.0i)
(num-test (- 1 1.0+1.0i 0.0+1.0i) 0.0-2.0i)
-(num-test (- 1 1.0+1.0i 1) -1.0-1.0i)
(num-test (- 1 1.0+1.0i 1.0) -1.0-1.0i)
-(num-test (- 1 1.0+1.0i 1.0+1.0i) -1.0-2.0i)
(num-test (- 1 1.0+1.0i 1/1) -1.0-1.0i)
-(num-test (- 1 1.0+1.0i 123.4) -123.4-1.0i)
(num-test (- 1 1.0+1.0i 1234) -1234.0-1.0i)
-(num-test (- 1 1.0+1.0i 1234/11) -112.18181818181819-1.0i)
(num-test (- 1 1.0+1.0i) 0.0-1.0i)
-(num-test (- 1 1/1 -1.0+1.0i) 1.0-1.0i)
(num-test (- 1 123.4) -122.4)
-(num-test (- 1 1234) -1233)
(num-test (- 1 1234/11) -1223/11)
-(num-test (- 1.0 -1.0+1.0i -1.0+1.0i) 3.0-2.0i)
(num-test (- 1.0 -1.0+1.0i 0) 2.0-1.0i)
-(num-test (- 1.0 -1.0+1.0i 0.0) 2.0-1.0i)
(num-test (- 1.0 -1.0+1.0i 0.0+1.0i) 2.0-2.0i)
-(num-test (- 1.0 -1.0+1.0i 1) 1.0-1.0i)
(num-test (- 1.0 -1.0+1.0i 1.0) 1.0-1.0i)
-(num-test (- 1.0 -1.0+1.0i 1.0+1.0i) 1.0-2.0i)
(num-test (- 1.0 -1.0+1.0i 1/1) 1.0-1.0i)
-(num-test (- 1.0 -1.0+1.0i 123.4) -121.4-1.0i)
(num-test (- 1.0 -1.0+1.0i 1234) -1232.0-1.0i)
-(num-test (- 1.0 -1.0+1.0i 1234/11) -110.18181818181819-1.0i)
(num-test (- 1.0 -1.0+1.0i) 2.0-1.0i)
-(num-test (- 1.0 0 -1.0+1.0i) 2.0-1.0i)
(num-test (- 1.0 0 0) 1.0)
-(num-test (- 1.0 0 0.0) 1.0)
(num-test (- 1.0 0 0.0+1.0i) 1.0-1.0i)
-(num-test (- 1.0 0 1) 0.0)
(num-test (- 1.0 0 1.0) 0.0)
-(num-test (- 1.0 0 1.0+1.0i) 0.0-1.0i)
(num-test (- 1.0 0 1/1) 0.0)
-(num-test (- 1.0 0 123.4) -122.4)
(num-test (- 1.0 0 1234) -1233.0)
-(num-test (- 1.0 0 1234/11) -111.18181818181819)
(num-test (- 1.0 0) 1.0)
-(num-test (- 1.0 0.0 -1.0+1.0i) 2.0-1.0i)
(num-test (- 1.0 0.0 0) 1.0)
-(num-test (- 1.0 0.0 0.0) 1.0)
(num-test (- 1.0 0.0 0.0+1.0i) 1.0-1.0i)
-(num-test (- 1.0 0.0 1) 0.0)
(num-test (- 1.0 0.0 1.0) 0.0)
-(num-test (- 1.0 0.0 1.0+1.0i) 0.0-1.0i)
(num-test (- 1.0 0.0 1/1) 0.0)
-(num-test (- 1.0 0.0 123.4) -122.4)
(num-test (- 1.0 0.0 1234) -1233.0)
-(num-test (- 1.0 0.0 1234/11) -111.18181818181819)
(num-test (- 1.0 0.0) 1.0)
-(num-test (- 1.0 0.0+1.0i -1.0+1.0i) 2.0-2.0i)
(num-test (- 1.0 0.0+1.0i 0) 1.0-1.0i)
-(num-test (- 1.0 0.0+1.0i 0.0) 1.0-1.0i)
(num-test (- 1.0 0.0+1.0i 0.0+1.0i) 1.0-2.0i)
-(num-test (- 1.0 0.0+1.0i 1) 0.0-1.0i)
(num-test (- 1.0 0.0+1.0i 1.0) 0.0-1.0i)
-(num-test (- 1.0 0.0+1.0i 1.0+1.0i) 0.0-2.0i)
(num-test (- 1.0 0.0+1.0i 1/1) 0.0-1.0i)
-(num-test (- 1.0 0.0+1.0i 123.4) -122.4-1.0i)
(num-test (- 1.0 0.0+1.0i 1234) -1233.0-1.0i)
-(num-test (- 1.0 0.0+1.0i 1234/11) -111.18181818181819-1.0i)
(num-test (- 1.0 0.0+1.0i) 1.0-1.0i)
-(num-test (- 1.0 1 -1.0+1.0i) 1.0-1.0i)
(num-test (- 1.0 1 0) 0.0)
-(num-test (- 1.0 1 0.0) 0.0)
(num-test (- 1.0 1 0.0+1.0i) 0.0-1.0i)
-(num-test (- 1.0 1 1) -1.0)
(num-test (- 1.0 1 1.0) -1.0)
-(num-test (- 1.0 1 1.0+1.0i) -1.0-1.0i)
(num-test (- 1.0 1 1/1) -1.0)
-(num-test (- 1.0 1 123.4) -123.4)
(num-test (- 1.0 1 1234) -1234.0)
-(num-test (- 1.0 1 1234/11) -112.18181818181819)
(num-test (- 1.0 1) 0.0)
-(num-test (- 1.0 1.0 -1.0+1.0i) 1.0-1.0i)
(num-test (- 1.0 1.0 0) 0.0)
-(num-test (- 1.0 1.0 0.0) 0.0)
(num-test (- 1.0 1.0 0.0+1.0i) 0.0-1.0i)
-(num-test (- 1.0 1.0 1) -1.0)
(num-test (- 1.0 1.0 1.0) -1.0)
-(num-test (- 1.0 1.0 1.0+1.0i) -1.0-1.0i)
(num-test (- 1.0 1.0 1/1) -1.0)
-(num-test (- 1.0 1.0 123.4) -123.4)
(num-test (- 1.0 1.0 1234) -1234.0)
-(num-test (- 1.0 1.0 1234/11) -112.18181818181819)
(num-test (- 1.0 1.0) 0.0)
-(num-test (- 1.0 1.0+1.0i -1.0+1.0i) 1.0-2.0i)
(num-test (- 1.0 1.0+1.0i 0) 0.0-1.0i)
-(num-test (- 1.0 1.0+1.0i 0.0) 0.0-1.0i)
(num-test (- 1.0 1.0+1.0i 0.0+1.0i) 0.0-2.0i)
-(num-test (- 1.0 1.0+1.0i 1) -1.0-1.0i)
(num-test (- 1.0 1.0+1.0i 1.0) -1.0-1.0i)
-(num-test (- 1.0 1.0+1.0i 1.0+1.0i) -1.0-2.0i)
(num-test (- 1.0 1.0+1.0i 1/1) -1.0-1.0i)
-(num-test (- 1.0 1.0+1.0i 123.4) -123.4-1.0i)
(num-test (- 1.0 1.0+1.0i 1234) -1234.0-1.0i)
-(num-test (- 1.0 1.0+1.0i 1234/11) -112.18181818181819-1.0i)
(num-test (- 1.0 1.0+1.0i) 0.0-1.0i)
-(num-test (- 1.0 1/1 -1.0+1.0i) 1.0-1.0i)
(num-test (- 1.0 123.4 -1.0+1.0i) -121.4-1.0i)
-(num-test (- 1.0 123.4 0) -122.4)
(num-test (- 1.0 123.4 0.0) -122.4)
-(num-test (- 1.0 123.4 0.0+1.0i) -122.4-1.0i)
(num-test (- 1.0 123.4 1) -123.4)
-(num-test (- 1.0 123.4 1.0) -123.4)
(num-test (- 1.0 123.4 1.0+1.0i) -123.4-1.0i)
-(num-test (- 1.0 123.4 1/1) -123.4)
(num-test (- 1.0 123.4 123.4) -245.8)
-(num-test (- 1.0 123.4 1234) -1356.4)
(num-test (- 1.0 123.4 1234/11) -234.58181818181819)
-(num-test (- 1.0 123.4) -122.4)
(num-test (- 1.0 1234 -1.0+1.0i) -1232.0-1.0i)
-(num-test (- 1.0 1234 0) -1233.0)
(num-test (- 1.0 1234 0.0) -1233.0)
-(num-test (- 1.0 1234 0.0+1.0i) -1233.0-1.0i)
(num-test (- 1.0 1234 1) -1234.0)
-(num-test (- 1.0 1234 1.0) -1234.0)
(num-test (- 1.0 1234 1.0+1.0i) -1234.0-1.0i)
-(num-test (- 1.0 1234 1/1) -1234.0)
(num-test (- 1.0 1234 123.4) -1356.4)
-(num-test (- 1.0 1234 1234) -2467.0)
(num-test (- 1.0 1234 1234/11) -1345.18181818181824)
-(num-test (- 1.0 1234) -1233.0)
(num-test (- 1.0 1234/11 -1.0+1.0i) -110.18181818181819-1.0i)
-(num-test (- 1.0 1234/11 0) -111.18181818181819)
(num-test (- 1.0 1234/11 0.0) -111.18181818181819)
-(num-test (- 1.0 1234/11 0.0+1.0i) -111.18181818181819-1.0i)
(num-test (- 1.0 1234/11 1) -112.18181818181819)
-(num-test (- 1.0 1234/11 1.0) -112.18181818181819)
(num-test (- 1.0 1234/11 1.0+1.0i) -112.18181818181819-1.0i)
-(num-test (- 1.0 1234/11 1/1) -112.18181818181819)
(num-test (- 1.0 1234/11 123.4) -234.58181818181819)
-(num-test (- 1.0 1234/11 1234) -1345.18181818181824)
(num-test (- 1.0 1234/11 1234/11) -223.36363636363637)
-(num-test (- 1.0 1234/11) -111.18181818181819)
(num-test (- 1.0) -1.0)
-(num-test (- 1.0+1.0i -1.0+1.0i -1.0+1.0i) 3.0-1.0i)
(num-test (- 1.0+1.0i -1.0+1.0i 0) 2.0)
-(num-test (- 1.0+1.0i -1.0+1.0i 0.0) 2.0)
(num-test (- 1.0+1.0i -1.0+1.0i 0.0+1.0i) 2.0-1.0i)
-(num-test (- 1.0+1.0i -1.0+1.0i 1) 1.0)
(num-test (- 1.0+1.0i -1.0+1.0i 1.0) 1.0)
-(num-test (- 1.0+1.0i -1.0+1.0i 1.0+1.0i) 1.0-1.0i)
(num-test (- 1.0+1.0i -1.0+1.0i 1/1) 1.0)
-(num-test (- 1.0+1.0i -1.0+1.0i 123.4) -121.4)
(num-test (- 1.0+1.0i -1.0+1.0i 1234) -1232.0)
-(num-test (- 1.0+1.0i -1.0+1.0i 1234/11) -110.18181818181819)
(num-test (- 1.0+1.0i -1.0+1.0i) 2.0)
-(num-test (- 1.0+1.0i 0 -1.0+1.0i) 2.0)
(num-test (- 1.0+1.0i 0 0) 1.0+1.0i)
-(num-test (- 1.0+1.0i 0 0.0) 1.0+1.0i)
(num-test (- 1.0+1.0i 0 0.0+1.0i) 1.0)
-(num-test (- 1.0+1.0i 0 1) 0.0+1.0i)
(num-test (- 1.0+1.0i 0 1.0) 0.0+1.0i)
-(num-test (- 1.0+1.0i 0 1.0+1.0i) 0.0)
(num-test (- 1.0+1.0i 0 1/1) 0.0+1.0i)
-(num-test (- 1.0+1.0i 0 123.4) -122.4+1.0i)
(num-test (- 1.0+1.0i 0 1234) -1233.0+1.0i)
-(num-test (- 1.0+1.0i 0 1234/11) -111.18181818181819+1.0i)
(num-test (- 1.0+1.0i 0) 1.0+1.0i)
-(num-test (- 1.0+1.0i 0.0 -1.0+1.0i) 2.0)
(num-test (- 1.0+1.0i 0.0 0) 1.0+1.0i)
-(num-test (- 1.0+1.0i 0.0 0.0) 1.0+1.0i)
(num-test (- 1.0+1.0i 0.0 0.0+1.0i) 1.0)
-(num-test (- 1.0+1.0i 0.0 1) 0.0+1.0i)
(num-test (- 1.0+1.0i 0.0 1.0) 0.0+1.0i)
-(num-test (- 1.0+1.0i 0.0 1.0+1.0i) 0.0)
(num-test (- 1.0+1.0i 0.0 1/1) 0.0+1.0i)
-(num-test (- 1.0+1.0i 0.0 123.4) -122.4+1.0i)
(num-test (- 1.0+1.0i 0.0 1234) -1233.0+1.0i)
-(num-test (- 1.0+1.0i 0.0 1234/11) -111.18181818181819+1.0i)
(num-test (- 1.0+1.0i 0.0) 1.0+1.0i)
-(num-test (- 1.0+1.0i 0.0+1.0i -1.0+1.0i) 2.0-1.0i)
(num-test (- 1.0+1.0i 0.0+1.0i 0) 1.0)
-(num-test (- 1.0+1.0i 0.0+1.0i 0.0) 1.0)
(num-test (- 1.0+1.0i 0.0+1.0i 0.0+1.0i) 1.0-1.0i)
-(num-test (- 1.0+1.0i 0.0+1.0i 1) 0.0)
(num-test (- 1.0+1.0i 0.0+1.0i 1.0) 0.0)
-(num-test (- 1.0+1.0i 0.0+1.0i 1.0+1.0i) 0.0-1.0i)
(num-test (- 1.0+1.0i 0.0+1.0i 1/1) 0.0)
-(num-test (- 1.0+1.0i 0.0+1.0i 123.4) -122.4)
(num-test (- 1.0+1.0i 0.0+1.0i 1234) -1233.0)
-(num-test (- 1.0+1.0i 0.0+1.0i 1234/11) -111.18181818181819)
(num-test (- 1.0+1.0i 0.0+1.0i) 1.0)
-(num-test (- 1.0+1.0i 1 -1.0+1.0i) 1.0)
(num-test (- 1.0+1.0i 1 0) 0.0+1.0i)
-(num-test (- 1.0+1.0i 1 0.0) 0.0+1.0i)
(num-test (- 1.0+1.0i 1 0.0+1.0i) 0.0)
-(num-test (- 1.0+1.0i 1 1) -1.0+1.0i)
(num-test (- 1.0+1.0i 1 1.0) -1.0+1.0i)
-(num-test (- 1.0+1.0i 1 1.0+1.0i) -1.0)
(num-test (- 1.0+1.0i 1 1/1) -1.0+1.0i)
-(num-test (- 1.0+1.0i 1 123.4) -123.4+1.0i)
(num-test (- 1.0+1.0i 1 1234) -1234.0+1.0i)
-(num-test (- 1.0+1.0i 1 1234/11) -112.18181818181819+1.0i)
(num-test (- 1.0+1.0i 1) 0.0+1.0i)
-(num-test (- 1.0+1.0i 1.0 -1.0+1.0i) 1.0)
(num-test (- 1.0+1.0i 1.0 0) 0.0+1.0i)
-(num-test (- 1.0+1.0i 1.0 0.0) 0.0+1.0i)
(num-test (- 1.0+1.0i 1.0 0.0+1.0i) 0.0)
-(num-test (- 1.0+1.0i 1.0 1) -1.0+1.0i)
(num-test (- 1.0+1.0i 1.0 1.0) -1.0+1.0i)
-(num-test (- 1.0+1.0i 1.0 1.0+1.0i) -1.0)
(num-test (- 1.0+1.0i 1.0 1/1) -1.0+1.0i)
-(num-test (- 1.0+1.0i 1.0 123.4) -123.4+1.0i)
(num-test (- 1.0+1.0i 1.0 1234) -1234.0+1.0i)
-(num-test (- 1.0+1.0i 1.0 1234/11) -112.18181818181819+1.0i)
(num-test (- 1.0+1.0i 1.0) 0.0+1.0i)
-(num-test (- 1.0+1.0i 1.0+1.0i -1.0+1.0i) 1.0-1.0i)
(num-test (- 1.0+1.0i 1.0+1.0i 0) 0.0)
-(num-test (- 1.0+1.0i 1.0+1.0i 0.0) 0.0)
(num-test (- 1.0+1.0i 1.0+1.0i 0.0+1.0i) 0.0-1.0i)
-(num-test (- 1.0+1.0i 1.0+1.0i 1) -1.0)
(num-test (- 1.0+1.0i 1.0+1.0i 1.0) -1.0)
-(num-test (- 1.0+1.0i 1.0+1.0i 1.0+1.0i) -1.0-1.0i)
(num-test (- 1.0+1.0i 1.0+1.0i 1/1) -1.0)
-(num-test (- 1.0+1.0i 1.0+1.0i 123.4) -123.4)
(num-test (- 1.0+1.0i 1.0+1.0i 1234) -1234.0)
-(num-test (- 1.0+1.0i 1.0+1.0i 1234/11) -112.18181818181819)
(num-test (- 1.0+1.0i 1.0+1.0i) 0.0)
-(num-test (- 1.0+1.0i 1/1 -1.0+1.0i) 1.0)
(num-test (- 1.0+1.0i 123.4 -1.0+1.0i) -121.4)
-(num-test (- 1.0+1.0i 123.4 0) -122.4+1.0i)
(num-test (- 1.0+1.0i 123.4 0.0) -122.4+1.0i)
-(num-test (- 1.0+1.0i 123.4 0.0+1.0i) -122.4)
(num-test (- 1.0+1.0i 123.4 1) -123.4+1.0i)
-(num-test (- 1.0+1.0i 123.4 1.0) -123.4+1.0i)
(num-test (- 1.0+1.0i 123.4 1.0+1.0i) -123.4)
-(num-test (- 1.0+1.0i 123.4 1/1) -123.4+1.0i)
(num-test (- 1.0+1.0i 123.4 123.4) -245.8+1.0i)
-(num-test (- 1.0+1.0i 123.4 1234) -1356.4+1.0i)
(num-test (- 1.0+1.0i 123.4 1234/11) -234.58181818181819+1.0i)
-(num-test (- 1.0+1.0i 123.4) -122.4+1.0i)
(num-test (- 1.0+1.0i 1234 -1.0+1.0i) -1232.0)
-(num-test (- 1.0+1.0i 1234 0) -1233.0+1.0i)
(num-test (- 1.0+1.0i 1234 0.0) -1233.0+1.0i)
-(num-test (- 1.0+1.0i 1234 0.0+1.0i) -1233.0)
(num-test (- 1.0+1.0i 1234 1) -1234.0+1.0i)
-(num-test (- 1.0+1.0i 1234 1.0) -1234.0+1.0i)
(num-test (- 1.0+1.0i 1234 1.0+1.0i) -1234.0)
-(num-test (- 1.0+1.0i 1234 1/1) -1234.0+1.0i)
(num-test (- 1.0+1.0i 1234 123.4) -1356.4+1.0i)
-(num-test (- 1.0+1.0i 1234 1234) -2467.0+1.0i)
(num-test (- 1.0+1.0i 1234 1234/11) -1345.18181818181824+1.0i)
-(num-test (- 1.0+1.0i 1234) -1233.0+1.0i)
(num-test (- 1.0+1.0i 1234/11 -1.0+1.0i) -110.18181818181819)
-(num-test (- 1.0+1.0i 1234/11 0) -111.18181818181819+1.0i)
(num-test (- 1.0+1.0i 1234/11 0.0) -111.18181818181819+1.0i)
-(num-test (- 1.0+1.0i 1234/11 0.0+1.0i) -111.18181818181819)
(num-test (- 1.0+1.0i 1234/11 1) -112.18181818181819+1.0i)
-(num-test (- 1.0+1.0i 1234/11 1.0) -112.18181818181819+1.0i)
(num-test (- 1.0+1.0i 1234/11 1.0+1.0i) -112.18181818181819)
-(num-test (- 1.0+1.0i 1234/11 1/1) -112.18181818181819+1.0i)
(num-test (- 1.0+1.0i 1234/11 123.4) -234.58181818181819+1.0i)
-(num-test (- 1.0+1.0i 1234/11 1234) -1345.18181818181824+1.0i)
(num-test (- 1.0+1.0i 1234/11 1234/11) -223.36363636363637+1.0i)
-(num-test (- 1.0+1.0i 1234/11) -111.18181818181819+1.0i)
(num-test (- 1.0+1.0i) -1.0-1.0i)
-(num-test (- 10) -10)
(num-test (- 10/3) -10/3)
-(num-test (- 123.4 -1.0+1.0i -1.0+1.0i) 125.4-2.0i)
(num-test (- 123.4 -1.0+1.0i 0) 124.4-1.0i)
-(num-test (- 123.4 -1.0+1.0i 0.0) 124.4-1.0i)
(num-test (- 123.4 -1.0+1.0i 0.0+1.0i) 124.4-2.0i)
-(num-test (- 123.4 -1.0+1.0i 1) 123.4-1.0i)
(num-test (- 123.4 -1.0+1.0i 1.0) 123.4-1.0i)
-(num-test (- 123.4 -1.0+1.0i 1.0+1.0i) 123.4-2.0i)
(num-test (- 123.4 -1.0+1.0i 1/1) 123.4-1.0i)
-(num-test (- 123.4 -1.0+1.0i 123.4) 1.0-1.0i)
(num-test (- 123.4 -1.0+1.0i 1234) -1109.59999999999991-1.0i)
-(num-test (- 123.4 -1.0+1.0i 1234/11) 12.21818181818182-1.0i)
(num-test (- 123.4 -1.0+1.0i) 124.4-1.0i)
-(num-test (- 123.4 0 -1.0+1.0i) 124.4-1.0i)
(num-test (- 123.4 0 0) 123.4)
-(num-test (- 123.4 0 0.0) 123.4)
(num-test (- 123.4 0 0.0+1.0i) 123.4-1.0i)
-(num-test (- 123.4 0 1) 122.4)
(num-test (- 123.4 0 1.0) 122.4)
-(num-test (- 123.4 0 1.0+1.0i) 122.4-1.0i)
(num-test (- 123.4 0 1/1) 122.4)
-(num-test (- 123.4 0 123.4) 0.0)
(num-test (- 123.4 0 1234) -1110.59999999999991)
-(num-test (- 123.4 0 1234/11) 11.21818181818182)
(num-test (- 123.4 0) 123.4)
-(num-test (- 123.4 0.0 -1.0+1.0i) 124.4-1.0i)
(num-test (- 123.4 0.0 0) 123.4)
-(num-test (- 123.4 0.0 0.0) 123.4)
(num-test (- 123.4 0.0 0.0+1.0i) 123.4-1.0i)
-(num-test (- 123.4 0.0 1) 122.4)
(num-test (- 123.4 0.0 1.0) 122.4)
-(num-test (- 123.4 0.0 1.0+1.0i) 122.4-1.0i)
(num-test (- 123.4 0.0 1/1) 122.4)
-(num-test (- 123.4 0.0 123.4) 0.0)
(num-test (- 123.4 0.0 1234) -1110.59999999999991)
-(num-test (- 123.4 0.0 1234/11) 11.21818181818182)
(num-test (- 123.4 0.0) 123.4)
-(num-test (- 123.4 0.0+1.0i -1.0+1.0i) 124.4-2.0i)
(num-test (- 123.4 0.0+1.0i 0) 123.4-1.0i)
-(num-test (- 123.4 0.0+1.0i 0.0) 123.4-1.0i)
(num-test (- 123.4 0.0+1.0i 0.0+1.0i) 123.4-2.0i)
-(num-test (- 123.4 0.0+1.0i 1) 122.4-1.0i)
(num-test (- 123.4 0.0+1.0i 1.0) 122.4-1.0i)
-(num-test (- 123.4 0.0+1.0i 1.0+1.0i) 122.4-2.0i)
(num-test (- 123.4 0.0+1.0i 1/1) 122.4-1.0i)
-(num-test (- 123.4 0.0+1.0i 123.4) 0.0-1.0i)
(num-test (- 123.4 0.0+1.0i 1234) -1110.59999999999991-1.0i)
-(num-test (- 123.4 0.0+1.0i 1234/11) 11.21818181818182-1.0i)
(num-test (- 123.4 0.0+1.0i) 123.4-1.0i)
-(num-test (- 123.4 1 -1.0+1.0i) 123.4-1.0i)
(num-test (- 123.4 1 0) 122.4)
-(num-test (- 123.4 1 0.0) 122.4)
(num-test (- 123.4 1 0.0+1.0i) 122.4-1.0i)
-(num-test (- 123.4 1 1) 121.4)
(num-test (- 123.4 1 1.0) 121.4)
-(num-test (- 123.4 1 1.0+1.0i) 121.4-1.0i)
(num-test (- 123.4 1 1/1) 121.4)
-(num-test (- 123.4 1 123.4) -1.0)
(num-test (- 123.4 1 1234) -1111.59999999999991)
-(num-test (- 123.4 1 1234/11) 10.21818181818182)
(num-test (- 123.4 1) 122.4)
-(num-test (- 123.4 1.0 -1.0+1.0i) 123.4-1.0i)
(num-test (- 123.4 1.0 0) 122.4)
-(num-test (- 123.4 1.0 0.0) 122.4)
(num-test (- 123.4 1.0 0.0+1.0i) 122.4-1.0i)
-(num-test (- 123.4 1.0 1) 121.4)
(num-test (- 123.4 1.0 1.0) 121.4)
-(num-test (- 123.4 1.0 1.0+1.0i) 121.4-1.0i)
(num-test (- 123.4 1.0 1/1) 121.4)
-(num-test (- 123.4 1.0 123.4) -1.0)
(num-test (- 123.4 1.0 1234) -1111.59999999999991)
-(num-test (- 123.4 1.0 1234/11) 10.21818181818182)
(num-test (- 123.4 1.0) 122.4)
-(num-test (- 123.4 1.0+1.0i -1.0+1.0i) 123.4-2.0i)
(num-test (- 123.4 1.0+1.0i 0) 122.4-1.0i)
-(num-test (- 123.4 1.0+1.0i 0.0) 122.4-1.0i)
(num-test (- 123.4 1.0+1.0i 0.0+1.0i) 122.4-2.0i)
-(num-test (- 123.4 1.0+1.0i 1) 121.4-1.0i)
(num-test (- 123.4 1.0+1.0i 1.0) 121.4-1.0i)
-(num-test (- 123.4 1.0+1.0i 1.0+1.0i) 121.4-2.0i)
(num-test (- 123.4 1.0+1.0i 1/1) 121.4-1.0i)
-(num-test (- 123.4 1.0+1.0i 123.4) -1.0-1.0i)
(num-test (- 123.4 1.0+1.0i 1234) -1111.59999999999991-1.0i)
-(num-test (- 123.4 1.0+1.0i 1234/11) 10.21818181818182-1.0i)
(num-test (- 123.4 1.0+1.0i) 122.4-1.0i)
-(num-test (- 123.4 1/1 -1.0+1.0i) 123.4-1.0i)
(num-test (- 123.4 123.4 -1.0+1.0i) 1.0-1.0i)
-(num-test (- 123.4 123.4 0) 0.0)
(num-test (- 123.4 123.4 0.0) 0.0)
-(num-test (- 123.4 123.4 0.0+1.0i) 0.0-1.0i)
(num-test (- 123.4 123.4 1) -1.0)
-(num-test (- 123.4 123.4 1.0) -1.0)
(num-test (- 123.4 123.4 1.0+1.0i) -1.0-1.0i)
-(num-test (- 123.4 123.4 1/1) -1.0)
(num-test (- 123.4 123.4 123.4) -123.4)
-(num-test (- 123.4 123.4 1234) -1234.0)
(num-test (- 123.4 123.4 1234/11) -112.18181818181819)
-(num-test (- 123.4 123.4) 0.0)
(num-test (- 123.4 1234 -1.0+1.0i) -1109.59999999999991-1.0i)
-(num-test (- 123.4 1234 0) -1110.59999999999991)
(num-test (- 123.4 1234 0.0) -1110.59999999999991)
-(num-test (- 123.4 1234 0.0+1.0i) -1110.59999999999991-1.0i)
(num-test (- 123.4 1234 1) -1111.59999999999991)
-(num-test (- 123.4 1234 1.0) -1111.59999999999991)
(num-test (- 123.4 1234 1.0+1.0i) -1111.59999999999991-1.0i)
-(num-test (- 123.4 1234 1/1) -1111.59999999999991)
(num-test (- 123.4 1234 123.4) -1234.0)
-(num-test (- 123.4 1234 1234) -2344.59999999999991)
(num-test (- 123.4 1234 1234/11) -1222.78181818181815)
-(num-test (- 123.4 1234) -1110.59999999999991)
(num-test (- 123.4 1234/11 -1.0+1.0i) 12.21818181818182-1.0i)
-(num-test (- 123.4 1234/11 0) 11.21818181818182)
(num-test (- 123.4 1234/11 0.0) 11.21818181818182)
-(num-test (- 123.4 1234/11 0.0+1.0i) 11.21818181818182-1.0i)
(num-test (- 123.4 1234/11 1) 10.21818181818182)
-(num-test (- 123.4 1234/11 1.0) 10.21818181818182)
(num-test (- 123.4 1234/11 1.0+1.0i) 10.21818181818182-1.0i)
-(num-test (- 123.4 1234/11 1/1) 10.21818181818182)
(num-test (- 123.4 1234/11 123.4) -112.18181818181819)
-(num-test (- 123.4 1234/11 1234) -1222.78181818181815)
(num-test (- 123.4 1234/11 1234/11) -100.96363636363635)
-(num-test (- 123.4 1234/11) 11.21818181818182)
(num-test (- 1234 -1.0+1.0i) 1235.0-1.0i)
-(num-test (- 1234 0) 1234)
(num-test (- 1234 0.0) 1234.0)
-(num-test (- 1234 0.0+1.0i) 1234.0-1.0i)
(num-test (- 1234 1) 1233)
-(num-test (- 1234 1.0) 1233.0)
(num-test (- 1234 1.0+1.0i) 1233.0-1.0i)
-(num-test (- 1234 1/1) 1233)
(num-test (- 1234 123.4) 1110.59999999999991)
-(num-test (- 1234 1234) 0)
(num-test (- 1234 1234/11) 12340/11)
-(num-test (- 1234/11 -1.0+1.0i) 113.18181818181819-1.0i)
(num-test (- 1234/11 0) 1234/11)
-(num-test (- 1234/11 0.0) 112.18181818181819)
(num-test (- 1234/11 0.0+1.0i) 112.18181818181819-1.0i)
-(num-test (- 1234/11 1) 1223/11)
(num-test (- 1234/11 1.0) 111.18181818181819)
-(num-test (- 1234/11 1.0+1.0i) 111.18181818181819-1.0i)
(num-test (- 1234/11 1/1) 1223/11)
-(num-test (- 1234/11 123.4) -11.21818181818182)
(num-test (- 1234/11 1234) -12340/11)
-(num-test (- 1234/11 1234/11) 0)
(num-test (- 1234000000) -1234000000)
-(num-test (- 1234000000.0) -1234000000.0)
(num-test (- 1234000000/10) -1234000000/10)
-(num-test (- 2) -2)
(num-test (- 2/2) -2/2)
-(num-test (- 0+6i 1/4 0.5 7) -7.75+6.0i)
(num-test (- 1/2 0.5e0) 0.0e0)
-(num-test (- 100000000000000.0 100000000000001.0) -1.0)
(num-test (- 1000000000000000000/3 1000000000000000001/3) -1/3)
(num-test (- 3 0 3 5 -6) 1)
(num-test (- 3 4) -1 )
@@ -88536,395 +87810,200 @@ gmp:
(num-test (/ -10) -1/10)
(num-test (/ -10/3) -3/10)
(num-test (/ -10 3) -10/3)
-(num-test (/ -1234000000) -1/1234000000)
(num-test (/ -1234000000.0) -0.00000000081037)
-(num-test (/ -1234000000/10) -10/1234000000)
(num-test (/ -2) -1/2)
-(num-test (/ -2/2) -2/2)
(num-test (/ 0 -1.0+1.0i) 0.0)
-(num-test (/ 0 0.0+1.0i) 0.0)
(num-test (/ 0 1 -1.0+1.0i) 0.0)
-(num-test (/ 0 1 0.0+1.0i) 0.0)
(num-test (/ 0 1 1) 0)
-(num-test (/ 0 1 1.0) 0.0)
(num-test (/ 0 1 1.0+1.0i) 0.0)
-(num-test (/ 0 1 1/1) 0)
(num-test (/ 0 1 123.4) 0.0)
-(num-test (/ 0 1 1234) 0)
(num-test (/ 0 1 1234/11) 0)
-(num-test (/ 0 1) 0)
(num-test (/ 0 1.0 -1.0+1.0i) 0.0)
-(num-test (/ 0 1.0 0.0+1.0i) 0.0)
(num-test (/ 0 1.0 1) 0.0)
-(num-test (/ 0 1.0 1.0) 0.0)
(num-test (/ 0 1.0 1.0+1.0i) 0.0)
-(num-test (/ 0 1.0 1/1) 0.0)
(num-test (/ 0 1.0 123.4) 0.0)
-(num-test (/ 0 1.0 1234) 0.0)
(num-test (/ 0 1.0 1234/11) 0.0)
-(num-test (/ 0 1.0) 0.0)
(num-test (/ 0 1.0+1.0i -1.0+1.0i) 0.0)
-(num-test (/ 0 1.0+1.0i 0.0+1.0i) 0.0)
(num-test (/ 0 1.0+1.0i 1) 0.0)
-(num-test (/ 0 1.0+1.0i 1.0) 0.0)
(num-test (/ 0 1.0+1.0i 1.0+1.0i) 0.0)
-(num-test (/ 0 1.0+1.0i 1/1) 0.0)
(num-test (/ 0 1.0+1.0i 123.4) 0.0)
-(num-test (/ 0 1.0+1.0i 1234) 0.0)
(num-test (/ 0 1.0+1.0i 1234/11) 0.0)
-(num-test (/ 0 1.0+1.0i) 0.0)
(num-test (/ 0 1/1 -1.0+1.0i) 0.0)
-(num-test (/ 0 123.4) 0.0)
(num-test (/ 0 1234) 0)
-(num-test (/ 0 1234/11) 0)
(num-test (/ 0.0 -1.0+1.0i -1.0+1.0i) 0.0)
-(num-test (/ 0.0 0.0+1.0i -1.0+1.0i) 0.0)
(num-test (/ 0.0 1 -1.0+1.0i) 0.0)
-(num-test (/ 0.0 1 0.0+1.0i) 0.0)
(num-test (/ 0.0 1 1.0) 0.0)
-(num-test (/ 0.0 1 1.0+1.0i) 0.0)
(num-test (/ 0.0 1 1/1) 0.0)
-(num-test (/ 0.0 1 123.4) 0.0)
(num-test (/ 0.0 1 1234) 0.0)
-(num-test (/ 0.0 1 1234/11) 0.0)
(num-test (/ 0.0 1) 0.0)
-(num-test (/ 0.0 1.0 -1.0+1.0i) 0.0)
(num-test (/ 0.0 1.0 0.0+1.0i) 0.0)
-(num-test (/ 0.0 1.0 1) 0.0)
(num-test (/ 0.0 1.0 1.0) 0.0)
-(num-test (/ 0.0 1.0 1.0+1.0i) 0.0)
(num-test (/ 0.0 1.0 1/1) 0.0)
-(num-test (/ 0.0 1.0 123.4) 0.0)
(num-test (/ 0.0 1.0 1234) 0.0)
-(num-test (/ 0.0 1.0 1234/11) 0.0)
(num-test (/ 0.0 1.0) 0.0)
-(num-test (/ 0.0 1.0+1.0i -1.0+1.0i) 0.0)
(num-test (/ 0.0 1/1 -1.0+1.0i) 0.0)
-(num-test (/ 0.0 123.4 -1.0+1.0i) 0.0)
(num-test (/ 0.0 1234 -1.0+1.0i) 0.0)
-(num-test (/ 0.0 1234/11 -1.0+1.0i) 0.0)
(num-test (/ 0.0+0.00000001i) 0.0-100000000.0i)
-(num-test (/ 0.0+1.0i -1.0+1.0i) 0.5-0.5i)
(num-test (/ 0.0+1.0i 0.0+1.0i) 1.0)
-(num-test (/ 0.0+1.0i 1) 0.0+1.0i)
(num-test (/ 0.0+1.0i 1.0) 0.0+1.0i)
-(num-test (/ 0.0+1.0i 1.0+1.0i) 0.5+0.5i)
(num-test (/ 0.0+1.0i 1/1) 0.0+1.0i)
-(num-test (/ 0.0+1.0i 123.4) 0.0+0.00810372771475i)
(num-test (/ 0.0+1.0i 1234) 0.0+0.00081037277147i)
-(num-test (/ 0.0+1.0i 1234/11) 0.0+0.00891410048622i)
(num-test (/ 1 -1.0+1.0i) -0.5-0.5i)
-(num-test (/ 1 0.0+1.0i) 0.0-1.0i)
(num-test (/ 1 1 -1.0+1.0i) -0.5-0.5i)
-(num-test (/ 1 1 0.0+1.0i) 0.0-1.0i)
(num-test (/ 1 1 1) 1)
-(num-test (/ 1 1 1.0) 1.0)
(num-test (/ 1 1 1.0+1.0i) 0.5-0.5i)
-(num-test (/ 1 1 1/1) 1)
(num-test (/ 1 1 123.4) 0.00810372771475)
-(num-test (/ 1 1 1234) 1/1234)
(num-test (/ 1 1 1234/11) 11/1234)
-(num-test (/ 1 1) 1)
(num-test (/ 1 1.0 -1.0+1.0i) -0.5-0.5i)
-(num-test (/ 1 1.0 0.0+1.0i) 0.0-1.0i)
(num-test (/ 1 1.0 1) 1.0)
-(num-test (/ 1 1.0 1.0) 1.0)
(num-test (/ 1 1.0 1.0+1.0i) 0.5-0.5i)
-(num-test (/ 1 1.0 1/1) 1.0)
(num-test (/ 1 1.0 123.4) 0.00810372771475)
-(num-test (/ 1 1.0 1234) 0.00081037277147)
(num-test (/ 1 1.0 1234/11) 0.00891410048622)
-(num-test (/ 1 1.0) 1.0)
(num-test (/ 1 1.0+1.0i -1.0+1.0i) -0.5)
-(num-test (/ 1 1.0+1.0i 0.0+1.0i) -0.5-0.5i)
(num-test (/ 1 1.0+1.0i 1) 0.5-0.5i)
-(num-test (/ 1 1.0+1.0i 1.0) 0.5-0.5i)
(num-test (/ 1 1.0+1.0i 1.0+1.0i) 0.0-0.5i)
-(num-test (/ 1 1.0+1.0i 1/1) 0.5-0.5i)
(num-test (/ 1 1.0+1.0i 123.4) 0.00405186385737-0.00405186385737i)
-(num-test (/ 1 1.0+1.0i 1234) 0.00040518638574-0.00040518638574i)
(num-test (/ 1 1.0+1.0i 1234/11) 0.00445705024311-0.00445705024311i)
-(num-test (/ 1 1.0+1.0i) 0.5-0.5i)
(num-test (/ 1 123.4) 0.00810372771475)
-(num-test (/ 1 1234) 1/1234)
(num-test (/ 1 1234/11) 11/1234)
-(num-test (/ 1.0 -1.0+1.0i -1.0+1.0i) -0.0+0.5i)
(num-test (/ 1.0 -1.0+1.0i 0.0+1.0i) -0.5+0.5i)
-(num-test (/ 1.0 -1.0+1.0i 1) -0.5-0.5i)
(num-test (/ 1.0 -1.0+1.0i 1.0) -0.5-0.5i)
-(num-test (/ 1.0 -1.0+1.0i 1.0+1.0i) -0.5)
(num-test (/ 1.0 -1.0+1.0i 1/1) -0.5-0.5i)
-(num-test (/ 1.0 -1.0+1.0i 123.4) -0.00405186385737-0.00405186385737i)
(num-test (/ 1.0 -1.0+1.0i 1234) -0.00040518638574-0.00040518638574i)
-(num-test (/ 1.0 -1.0+1.0i 1234/11) -0.00445705024311-0.00445705024311i)
(num-test (/ 1.0 -1.0+1.0i) -0.5-0.5i)
-(num-test (/ 1.0 0.0+1.0i -1.0+1.0i) -0.5+0.5i)
(num-test (/ 1.0 0.0+1.0i 0.0+1.0i) -1.0)
-(num-test (/ 1.0 0.0+1.0i 1) 0.0-1.0i)
(num-test (/ 1.0 0.0+1.0i 1.0) 0.0-1.0i)
-(num-test (/ 1.0 0.0+1.0i 1.0+1.0i) -0.5-0.5i)
(num-test (/ 1.0 0.0+1.0i 1/1) 0.0-1.0i)
-(num-test (/ 1.0 0.0+1.0i 123.4) 0.0-0.00810372771475i)
(num-test (/ 1.0 0.0+1.0i 1234) 0.0-0.00081037277147i)
-(num-test (/ 1.0 0.0+1.0i 1234/11) 0.0-0.00891410048622i)
(num-test (/ 1.0 0.0+1.0i) 0.0-1.0i)
-(num-test (/ 1.0 1 -1.0+1.0i) -0.5-0.5i)
(num-test (/ 1.0 1 0.0+1.0i) 0.0-1.0i)
-(num-test (/ 1.0 1 1) 1.0)
(num-test (/ 1.0 1 1.0) 1.0)
-(num-test (/ 1.0 1 1.0+1.0i) 0.5-0.5i)
(num-test (/ 1.0 1 1/1) 1.0)
-(num-test (/ 1.0 1 123.4) 0.00810372771475)
(num-test (/ 1.0 1 1234) 0.00081037277147)
-(num-test (/ 1.0 1 1234/11) 0.00891410048622)
(num-test (/ 1.0 1) 1.0)
-(num-test (/ 1.0 1.0 -1.0+1.0i) -0.5-0.5i)
(num-test (/ 1.0 1.0 0.0+1.0i) 0.0-1.0i)
-(num-test (/ 1.0 1.0 1) 1.0)
(num-test (/ 1.0 1.0 1.0) 1.0)
-(num-test (/ 1.0 1.0 1.0+1.0i) 0.5-0.5i)
(num-test (/ 1.0 1.0 1/1) 1.0)
-(num-test (/ 1.0 1.0 123.4) 0.00810372771475)
(num-test (/ 1.0 1.0 1234) 0.00081037277147)
-(num-test (/ 1.0 1.0 1234/11) 0.00891410048622)
(num-test (/ 1.0 1.0) 1.0)
-(num-test (/ 1.0 1.0+1.0i -1.0+1.0i) -0.5)
(num-test (/ 1.0 1.0+1.0i 0.0+1.0i) -0.5-0.5i)
-(num-test (/ 1.0 1.0+1.0i 1) 0.5-0.5i)
(num-test (/ 1.0 1.0+1.0i 1.0) 0.5-0.5i)
-(num-test (/ 1.0 1.0+1.0i 1.0+1.0i) 0.0-0.5i)
(num-test (/ 1.0 1.0+1.0i 1/1) 0.5-0.5i)
-(num-test (/ 1.0 1.0+1.0i 123.4) 0.00405186385737-0.00405186385737i)
(num-test (/ 1.0 1.0+1.0i 1234) 0.00040518638574-0.00040518638574i)
-(num-test (/ 1.0 1.0+1.0i 1234/11) 0.00445705024311-0.00445705024311i)
(num-test (/ 1.0 1.0+1.0i) 0.5-0.5i)
-(num-test (/ 1.0 1/1 -1.0+1.0i) -0.5-0.5i)
(num-test (/ 1.0 1/1 0.0+1.0i) 0.0-1.0i)
-(num-test (/ 1.0 123.4 -1.0+1.0i) -0.00405186385737-0.00405186385737i)
(num-test (/ 1.0 123.4 0.0+1.0i) 0.0-0.00810372771475i)
-(num-test (/ 1.0 123.4 1) 0.00810372771475)
(num-test (/ 1.0 123.4 1.0) 0.00810372771475)
-(num-test (/ 1.0 123.4 1.0+1.0i) 0.00405186385737-0.00405186385737i)
(num-test (/ 1.0 123.4 1/1) 0.00810372771475)
-(num-test (/ 1.0 123.4 123.4) 0.00006567040287)
(num-test (/ 1.0 123.4 1234) 0.00000656704029)
-(num-test (/ 1.0 123.4 1234/11) 0.00007223744316)
(num-test (/ 1.0 123.4) 0.00810372771475)
-(num-test (/ 1.0 1234 -1.0+1.0i) -0.00040518638574-0.00040518638574i)
(num-test (/ 1.0 1234 0.0+1.0i) 0.0-0.00081037277147i)
-(num-test (/ 1.0 1234 1) 0.00081037277147)
(num-test (/ 1.0 1234 1.0) 0.00081037277147)
-(num-test (/ 1.0 1234 1.0+1.0i) 0.00040518638574-0.00040518638574i)
(num-test (/ 1.0 1234 1/1) 0.00081037277147)
-(num-test (/ 1.0 1234 123.4) 0.00000656704029)
(num-test (/ 1.0 1234 1234) 0.00000065670403)
-(num-test (/ 1.0 1234 1234/11) 0.00000722374432)
(num-test (/ 1.0 1234) 0.00081037277147)
-(num-test (/ 1.0 1234/11 -1.0+1.0i) -0.00445705024311-0.00445705024311i)
(num-test (/ 1.0 1234/11 0.0+1.0i) 0.0-0.00891410048622i)
-(num-test (/ 1.0 1234/11 1) 0.00891410048622)
(num-test (/ 1.0 1234/11 1.0) 0.00891410048622)
-(num-test (/ 1.0 1234/11 1.0+1.0i) 0.00445705024311-0.00445705024311i)
(num-test (/ 1.0 1234/11 1/1) 0.00891410048622)
-(num-test (/ 1.0 1234/11 123.4) 0.00007223744316)
(num-test (/ 1.0 1234/11 1234) 0.00000722374432)
-(num-test (/ 1.0 1234/11 1234/11) 0.00007946118748)
(num-test (/ 1.0 1234/11) 0.00891410048622)
-(num-test (/ 1.0) 1.0)
(num-test (/ 1.0+1.0i -1.0+1.0i -1.0+1.0i) -0.5+0.5i)
-(num-test (/ 1.0+1.0i -1.0+1.0i 0.0+1.0i) -1.0)
(num-test (/ 1.0+1.0i -1.0+1.0i 1) -0.0-1.0i)
-(num-test (/ 1.0+1.0i -1.0+1.0i 1.0) -0.0-1.0i)
(num-test (/ 1.0+1.0i -1.0+1.0i 1.0+1.0i) -0.5-0.5i)
-(num-test (/ 1.0+1.0i -1.0+1.0i 1/1) -0.0-1.0i)
(num-test (/ 1.0+1.0i -1.0+1.0i 123.4) -0.0-0.00810372771475i)
-(num-test (/ 1.0+1.0i -1.0+1.0i 1234) -0.0-0.00081037277147i)
(num-test (/ 1.0+1.0i -1.0+1.0i 1234/11) -0.0-0.00891410048622i)
-(num-test (/ 1.0+1.0i -1.0+1.0i) -0.0-1.0i)
(num-test (/ 1.0+1.0i 0.0+1.0i -1.0+1.0i) -1.0)
-(num-test (/ 1.0+1.0i 0.0+1.0i 0.0+1.0i) -1.0-1.0i)
(num-test (/ 1.0+1.0i 0.0+1.0i 1) 1.0-1.0i)
-(num-test (/ 1.0+1.0i 0.0+1.0i 1.0) 1.0-1.0i)
(num-test (/ 1.0+1.0i 0.0+1.0i 1.0+1.0i) 0.0-1.0i)
-(num-test (/ 1.0+1.0i 0.0+1.0i 1/1) 1.0-1.0i)
(num-test (/ 1.0+1.0i 0.0+1.0i 123.4) 0.00810372771475-0.00810372771475i)
-(num-test (/ 1.0+1.0i 0.0+1.0i 1234) 0.00081037277147-0.00081037277147i)
(num-test (/ 1.0+1.0i 0.0+1.0i 1234/11) 0.00891410048622-0.00891410048622i)
-(num-test (/ 1.0+1.0i 0.0+1.0i) 1.0-1.0i)
(num-test (/ 1.0+1.0i 1 -1.0+1.0i) -0.0-1.0i)
-(num-test (/ 1.0+1.0i 1 0.0+1.0i) 1.0-1.0i)
(num-test (/ 1.0+1.0i 1 1) 1.0+1.0i)
-(num-test (/ 1.0+1.0i 1 1.0) 1.0+1.0i)
(num-test (/ 1.0+1.0i 1 1.0+1.0i) 1.0)
-(num-test (/ 1.0+1.0i 1 1/1) 1.0+1.0i)
(num-test (/ 1.0+1.0i 1 123.4) 0.00810372771475+0.00810372771475i)
-(num-test (/ 1.0+1.0i 1 1234) 0.00081037277147+0.00081037277147i)
(num-test (/ 1.0+1.0i 1 1234/11) 0.00891410048622+0.00891410048622i)
-(num-test (/ 1.0+1.0i 1) 1.0+1.0i)
(num-test (/ 1.0+1.0i 1.0 -1.0+1.0i) -0.0-1.0i)
-(num-test (/ 1.0+1.0i 1.0 0.0+1.0i) 1.0-1.0i)
(num-test (/ 1.0+1.0i 1.0 1) 1.0+1.0i)
-(num-test (/ 1.0+1.0i 1.0 1.0) 1.0+1.0i)
(num-test (/ 1.0+1.0i 1.0 1.0+1.0i) 1.0)
-(num-test (/ 1.0+1.0i 1.0 1/1) 1.0+1.0i)
(num-test (/ 1.0+1.0i 1.0 123.4) 0.00810372771475+0.00810372771475i)
-(num-test (/ 1.0+1.0i 1.0 1234) 0.00081037277147+0.00081037277147i)
(num-test (/ 1.0+1.0i 1.0 1234/11) 0.00891410048622+0.00891410048622i)
-(num-test (/ 1.0+1.0i 1.0) 1.0+1.0i)
(num-test (/ 1.0+1.0i 1.0+1.0i -1.0+1.0i) -0.5-0.5i)
-(num-test (/ 1.0+1.0i 1.0+1.0i 0.0+1.0i) 0.0-1.0i)
(num-test (/ 1.0+1.0i 1.0+1.0i 1) 1.0)
-(num-test (/ 1.0+1.0i 1.0+1.0i 1.0) 1.0)
(num-test (/ 1.0+1.0i 1.0+1.0i 1.0+1.0i) 0.5-0.5i)
-(num-test (/ 1.0+1.0i 1.0+1.0i 1/1) 1.0)
(num-test (/ 1.0+1.0i 1.0+1.0i 123.4) 0.00810372771475)
-(num-test (/ 1.0+1.0i 1.0+1.0i 1234) 0.00081037277147)
(num-test (/ 1.0+1.0i 1.0+1.0i 1234/11) 0.00891410048622)
-(num-test (/ 1.0+1.0i 1.0+1.0i) 1.0)
(num-test (/ 1.0+1.0i 1/1 -1.0+1.0i) -0.0-1.0i)
-(num-test (/ 1.0+1.0i 1/1 0.0+1.0i) 1.0-1.0i)
(num-test (/ 1.0+1.0i 123.4 -1.0+1.0i) -0.0-0.00810372771475i)
-(num-test (/ 1.0+1.0i 123.4 0.0+1.0i) 0.00810372771475-0.00810372771475i)
(num-test (/ 1.0+1.0i 123.4 1) 0.00810372771475+0.00810372771475i)
-(num-test (/ 1.0+1.0i 123.4 1.0) 0.00810372771475+0.00810372771475i)
(num-test (/ 1.0+1.0i 123.4 1.0+1.0i) 0.00810372771475)
-(num-test (/ 1.0+1.0i 123.4 1/1) 0.00810372771475+0.00810372771475i)
(num-test (/ 1.0+1.0i 123.4 123.4) 0.00006567040287+0.00006567040287i)
-(num-test (/ 1.0+1.0i 123.4 1234) 0.00000656704029+0.00000656704029i)
(num-test (/ 1.0+1.0i 123.4 1234/11) 0.00007223744316+0.00007223744316i)
-(num-test (/ 1.0+1.0i 123.4) 0.00810372771475+0.00810372771475i)
(num-test (/ 1.0+1.0i 1234 -1.0+1.0i) -0.0-0.00081037277147i)
-(num-test (/ 1.0+1.0i 1234 0.0+1.0i) 0.00081037277147-0.00081037277147i)
(num-test (/ 1.0+1.0i 1234 1) 0.00081037277147+0.00081037277147i)
-(num-test (/ 1.0+1.0i 1234 1.0) 0.00081037277147+0.00081037277147i)
(num-test (/ 1.0+1.0i 1234 1.0+1.0i) 0.00081037277147)
-(num-test (/ 1.0+1.0i 1234 1/1) 0.00081037277147+0.00081037277147i)
(num-test (/ 1.0+1.0i 1234 123.4) 0.00000656704029+0.00000656704029i)
-(num-test (/ 1.0+1.0i 1234 1234) 0.00000065670403+0.00000065670403i)
(num-test (/ 1.0+1.0i 1234 1234/11) 0.00000722374432+0.00000722374432i)
-(num-test (/ 1.0+1.0i 1234) 0.00081037277147+0.00081037277147i)
(num-test (/ 1.0+1.0i 1234/11 -1.0+1.0i) -0.0-0.00891410048622i)
-(num-test (/ 1.0+1.0i 1234/11 0.0+1.0i) 0.00891410048622-0.00891410048622i)
(num-test (/ 1.0+1.0i 1234/11 1) 0.00891410048622+0.00891410048622i)
-(num-test (/ 1.0+1.0i 1234/11 1.0) 0.00891410048622+0.00891410048622i)
(num-test (/ 1.0+1.0i 1234/11 1.0+1.0i) 0.00891410048622)
-(num-test (/ 1.0+1.0i 1234/11 1/1) 0.00891410048622+0.00891410048622i)
(num-test (/ 1.0+1.0i 1234/11 123.4) 0.00007223744316+0.00007223744316i)
-(num-test (/ 1.0+1.0i 1234/11 1234) 0.00000722374432+0.00000722374432i)
(num-test (/ 1.0+1.0i 1234/11 1234/11) 0.00007946118748+0.00007946118748i)
-(num-test (/ 1.0+1.0i 1234/11) 0.00891410048622+0.00891410048622i)
(num-test (/ 1.0+1.0i) 0.5-0.5i)
-(num-test (/ 10) 1/10)
(num-test (/ 10/3) 3/10)
-(num-test (/ 10 3) 10/3)
(num-test (/ 10 -3) -10/3)
-(num-test (/ -10 -3) 10/3)
(num-test (/ 11) 1/11)
-(num-test (/ 123.4 -1.0+1.0i -1.0+1.0i) -0.0+61.7i)
(num-test (/ 123.4 -1.0+1.0i 0.0+1.0i) -61.7+61.7i)
-(num-test (/ 123.4 -1.0+1.0i 1) -61.7-61.7i)
(num-test (/ 123.4 -1.0+1.0i 1.0) -61.7-61.7i)
-(num-test (/ 123.4 -1.0+1.0i 1.0+1.0i) -61.7)
(num-test (/ 123.4 -1.0+1.0i 1/1) -61.7-61.7i)
-(num-test (/ 123.4 -1.0+1.0i 123.4) -0.5-0.5i)
(num-test (/ 123.4 -1.0+1.0i 1234) -0.05000000000000-0.05000000000000i)
-(num-test (/ 123.4 -1.0+1.0i 1234/11) -0.55000000000000-0.55000000000000i)
(num-test (/ 123.4 -1.0+1.0i) -61.7-61.7i)
-(num-test (/ 123.4 0.0+1.0i -1.0+1.0i) -61.7+61.7i)
(num-test (/ 123.4 0.0+1.0i 0.0+1.0i) -123.4)
-(num-test (/ 123.4 0.0+1.0i 1) 0.0-123.4i)
(num-test (/ 123.4 0.0+1.0i 1.0) 0.0-123.4i)
-(num-test (/ 123.4 0.0+1.0i 1.0+1.0i) -61.7-61.7i)
(num-test (/ 123.4 0.0+1.0i 1/1) 0.0-123.4i)
-(num-test (/ 123.4 0.0+1.0i 123.4) 0.0-1.0i)
(num-test (/ 123.4 0.0+1.0i 1234) 0.0-0.1i)
-(num-test (/ 123.4 0.0+1.0i 1234/11) 0.0-1.10000000000000i)
(num-test (/ 123.4 0.0+1.0i) 0.0-123.4i)
-(num-test (/ 123.4 1 -1.0+1.0i) -61.7-61.7i)
(num-test (/ 123.4 1 0.0+1.0i) 0.0-123.4i)
-(num-test (/ 123.4 1 1) 123.4)
(num-test (/ 123.4 1 1.0) 123.4)
-(num-test (/ 123.4 1 1.0+1.0i) 61.7-61.7i)
(num-test (/ 123.4 1 1/1) 123.4)
-(num-test (/ 123.4 1 123.4) 1.0)
(num-test (/ 123.4 1 1234) 0.1)
-(num-test (/ 123.4 1 1234/11) 1.10000000000000)
(num-test (/ 123.4 1) 123.4)
-(num-test (/ 123.4 1.0 -1.0+1.0i) -61.7-61.7i)
(num-test (/ 123.4 1.0 0.0+1.0i) 0.0-123.4i)
-(num-test (/ 123.4 1.0 1) 123.4)
(num-test (/ 123.4 1.0 1.0) 123.4)
-(num-test (/ 123.4 1.0 1.0+1.0i) 61.7-61.7i)
(num-test (/ 123.4 1.0 1/1) 123.4)
-(num-test (/ 123.4 1.0 123.4) 1.0)
(num-test (/ 123.4 1.0 1234) 0.1)
-(num-test (/ 123.4 1.0 1234/11) 1.10000000000000)
(num-test (/ 123.4 1.0) 123.4)
-(num-test (/ 123.4 1.0+1.0i -1.0+1.0i) -61.7)
(num-test (/ 123.4 1.0+1.0i 0.0+1.0i) -61.7-61.7i)
-(num-test (/ 123.4 1.0+1.0i 1) 61.7-61.7i)
(num-test (/ 123.4 1.0+1.0i 1.0) 61.7-61.7i)
-(num-test (/ 123.4 1.0+1.0i 1.0+1.0i) 0.0-61.7i)
(num-test (/ 123.4 1.0+1.0i 1/1) 61.7-61.7i)
-(num-test (/ 123.4 1.0+1.0i 123.4) 0.5-0.5i)
(num-test (/ 123.4 1.0+1.0i 1234) 0.05000000000000-0.05000000000000i)
-(num-test (/ 123.4 1.0+1.0i 1234/11) 0.55000000000000-0.55000000000000i)
(num-test (/ 123.4 1.0+1.0i) 61.7-61.7i)
-(num-test (/ 123.4 1/1 -1.0+1.0i) -61.7-61.7i)
(num-test (/ 123.4 1/1 0.0+1.0i) 0.0-123.4i)
-(num-test (/ 123.4 123.4 -1.0+1.0i) -0.5-0.5i)
(num-test (/ 123.4 123.4 0.0+1.0i) 0.0-1.0i)
-(num-test (/ 123.4 123.4 1) 1.0)
(num-test (/ 123.4 123.4 1.0) 1.0)
-(num-test (/ 123.4 123.4 1.0+1.0i) 0.5-0.5i)
(num-test (/ 123.4 123.4 1/1) 1.0)
-(num-test (/ 123.4 123.4 123.4) 0.00810372771475)
(num-test (/ 123.4 123.4 1234) 0.00081037277147)
-(num-test (/ 123.4 123.4 1234/11) 0.00891410048622)
(num-test (/ 123.4 123.4) 1.0)
-(num-test (/ 123.4 1234 -1.0+1.0i) -0.05000000000000-0.05000000000000i)
(num-test (/ 123.4 1234 0.0+1.0i) 0.0-0.1i)
-(num-test (/ 123.4 1234 1) 0.1)
(num-test (/ 123.4 1234 1.0) 0.1)
-(num-test (/ 123.4 1234 1.0+1.0i) 0.05000000000000-0.05000000000000i)
(num-test (/ 123.4 1234 1/1) 0.1)
-(num-test (/ 123.4 1234 123.4) 0.00081037277147)
(num-test (/ 123.4 1234 1234) 0.00008103727715)
-(num-test (/ 123.4 1234 1234/11) 0.00089141004862)
(num-test (/ 123.4 1234) 0.1)
-(num-test (/ 123.4 1234/11 -1.0+1.0i) -0.55000000000000-0.55000000000000i)
(num-test (/ 123.4 1234/11 0.0+1.0i) 0.0-1.10000000000000i)
-(num-test (/ 123.4 1234/11 1) 1.10000000000000)
(num-test (/ 123.4 1234/11 1.0) 1.10000000000000)
-(num-test (/ 123.4 1234/11 1.0+1.0i) 0.55000000000000-0.55000000000000i)
(num-test (/ 123.4 1234/11 1/1) 1.10000000000000)
-(num-test (/ 123.4 1234/11 123.4) 0.00891410048622)
(num-test (/ 123.4 1234/11 1234) 0.00089141004862)
-(num-test (/ 123.4 1234/11 1234/11) 0.00980551053485)
(num-test (/ 123.4 1234/11) 1.10000000000000)
-(num-test (/ 1234 -1.0+1.0i) -617.0-617.0i)
(num-test (/ 1234 0.0+1.0i) 0.0-1234.0i)
-(num-test (/ 1234 1) 1234)
(num-test (/ 1234 1.0) 1234.0)
-(num-test (/ 1234 1.0+1.0i) 617.0-617.0i)
(num-test (/ 1234 1/1) 1234)
-(num-test (/ 1234 123.4) 10.0)
(num-test (/ 1234 1234) 1)
-(num-test (/ 1234 1234/11) 11)
(num-test (/ 1234/11 -1.0+1.0i) -56.09090909090909-56.09090909090909i)
-(num-test (/ 1234/11 0.0+1.0i) 0.0-112.18181818181819i)
(num-test (/ 1234/11 1) 1234/11)
-(num-test (/ 1234/11 1.0) 112.18181818181819)
(num-test (/ 1234/11 1.0+1.0i) 56.09090909090909-56.09090909090909i)
-(num-test (/ 1234/11 1/1) 1234/11)
(num-test (/ 1234/11 123.4) 0.90909090909091)
-(num-test (/ 1234/11 1234) 1/11)
(num-test (/ 1234/11 1234/11) 1)
-(num-test (/ 1234000000) 1/1234000000)
(num-test (/ 1234000000.0) 0.00000000081037)
-(num-test (/ 1234000000/10) 10/1234000000)
(num-test (/ 2) 1/2)
-(num-test (/ 2.71828182845905+3.14159265358979i) 0.15750247989732-0.18202992367723i)
(num-test (/ 2/2) 2/2)
(num-test (/ 1/2 1+i 1-i) 0.25)
@@ -96205,7 +95284,7 @@ etc
(format *stderr* "*pretty-print-spacing*: ~A~%" ((funclet pretty-print) '*pretty-print-spacing*)))
(test (pretty-print (hash-table 'a 2.0) (open-output-function (lambda (a) (values a (+ a 1))))) 'error) ; test of function output char mv check
- (let () ; op_safe_c_sp_mv followed later by cdr of value picking up uncleared mv bit
+ (let () ; op_safe_c_sp_mv followed later by cdr of value picking up uncleared mv bit
(define (_f8_ x) (let-temporarily ((x (+ x 1))) (values x x)))
(define (func) (let ((x #f)) (do ((i 0 (+ i 1))) ((= i 1)) (pretty-print (list-values #t (_f8_ 1)) #f))))
(test (func) #t)) ; #t = do loop value
@@ -96218,7 +95297,7 @@ etc
(test (string-wi=? (pp (list '#_define 'x 32)) "(#_define x 32)") #t)
(test (string-wi=? (pp (list 'define 'x 32)) "(define x 32)") #t)
(test (string-wi=? (pp (list #_unless (list '< 2 1) (list 'display 'ok) #f)) "(#_unless (< 2 1) (display ok) #f)") #t)
- (test (string-wi=? (pp (list 'when (list '< 2 1) (list 'display 'ok))) "(when (< 2 1) (display ok))") #t)
+ (test (string-wi=? (pp (list 'when (list '< 2 1) (list 'display 'ok))) "(when (< 2 1) (display ok))") #t)
(test (string-wi=? (pp (list #_letrec (list (list 'i 32) (list 'j 12)) (list '+ 'i 'j))) "(#_letrec ((i 32) (j 12)) (+ i j))") #t)
(test (string-wi=? (pp (list #_let* 'loop (list (list 'i 10) (list 'j 12)) (list '+ 'i 'j))) "(#_let* loop ((i 10) (j 12)) (+ i j))") #t)
(test (string-wi=? (pp (list #_and (list 'or #t) #f)) "(#_and (or #t) #f)") #t)
@@ -99173,6 +98252,7 @@ etc
(when full-s7test
(let ()
(load "write.scm")
+
(define mock-number (*mock-number* 'mock-number))
(define-constant bigrat 1/2)
(define-constant bigcmp 1+2i)
@@ -99221,7 +98301,7 @@ etc
(let ()
(let-temporarily ((x 1234))
(call/cc (lambda (goto) (goto 1)))
- (c-object? 1)
+ (c-object? 1)
(lambda sym-args sym-args)
#i2d((101 201) (3 4))
(begin (ow!) #f)
@@ -99264,15 +98344,13 @@ etc
(if (> (random 10) 5) (f))
(if (> (random 10) 5) (f1))
(if (> (random 10) 5) (f2))
- (if (> (random 10) 5) (f3))
- ))
- (g)))
-
- ) ; mockery.scm
+ (if (> (random 10) 5) (f3))))
+ (g)))) ; mockery.scm
;(let () (define (f1) (with-let (inlet '+ (lambda args (apply * args))) (+ 1 2 3 4))) (test (with-let (inlet '+ (lambda args (apply * args))) (+ 1 2 3 4)) (f1)))
;as elsewhere stated, this is documented -- not sure it needs to be fixed
+(set! (*s7* 'print-length) 123123)
(when (and (not with-bignums)
(not pure-s7))
(let ()
@@ -102871,7 +101949,7 @@ etc
(case* x
((a b) 'a-or-b)
((1 2/3 3.0) => (lambda (a) (* a 2)))
- ((#_pi) 1 123)
+ ((pi) 1 123)
(("string1" "string2"))
((#<symbol?>) 'symbol!)
(((+ x #<symbol?>)) 'got-list)
@@ -102888,7 +101966,7 @@ etc
(else 'oops)))
(test (scase 3.0) 6.0)
- (test (scase pi) 123)
+ (test (scase 'pi) 123)
(test (scase "string1") "string1")
(test (scase "string3") 'oops)
(test (scase 'a) 'a-or-b)
@@ -103621,7 +102699,7 @@ etc
(lint-test "(- (+ x z w) x y 1)" " -: perhaps (- (+ x z w) x y 1) -> (- (+ w z) y 1)")
(lint-test "(- (+ x z) x y)" " -: perhaps (- (+ x z) x y) -> (- z y)")
(lint-test "(- (+ x z w) x y)" " -: perhaps (- (+ x z w) x y) -> (- (+ w z) y)")
- (lint-test "(- -9223372036854775808)"
+ (lint-test "(- -9223372036854775808)"
"- argument, -9223372036854775808, is out of range (most-negative-fixnum can't be negated)
-: perhaps (- -9223372036854775808) -> +nan.0")
(lint-test "(- (*s7* 'most-negative-fixnum))"
@@ -109334,7 +108412,7 @@ etc
" f208: perhaps (define (f208 b . opt) (let* ((ip (if (null? opt) #f (car opt))) (op... -> (define* (f208 b ip) (let* ((op (port? ip)) (op2 op)) ...))
f208: perhaps (if (null? opt) #f (car opt)) -> (and (not (null? opt)) (car opt))
f208: op2 not used, initially: op from let*
- f208: perhaps restrict op which is not used in the let* body
+ f208: perhaps restrict op which is not used in the let* body
(let* ((ip (if (null? opt) #f (car opt))) (op (port? ip)) (op2 op)) (read ip)) ->
(let* ((ip (if (null? opt) #f (car opt))) (op2 (let ((op (port? ip))) op))) ...)")
(lint-test "(define (f210 b . opt) (let ((ip (if (null? opt) 0 (car opt)))) (g ip) (f ip)))"
@@ -110817,15 +109895,15 @@ etc
(test (ho) #<unspecified>))
(when with-block ; optimize_safe_c_func_three_args[71842]: overwrite has_fx: opt2_sym (fvset1 '((x 1)) imh111)
- (let ()
+ (let ()
(define (func)
- (do ()
- ((not #f)
- (make-string 3 #\space)
- (with-let (block)
+ (do ()
+ ((not #f)
+ (make-string 3 #\space)
+ (with-let (block)
(let ((fvset1 float-vector-set!))
(define-constant imh111 (hash-table))
- (subsequence fvset1 `((x 1)) imh111))))))
+ (subsequence fvset1 `((x 1)) imh111))))))
(test (func) 'error)))
(let ()
@@ -111261,8 +110339,8 @@ etc
(when full-s7test
(let ((port (open-input-string (format #f "~W" (let->list (rootlet))))))
- (let ((res (read port)))
- (close-input-port port)
+ (let ((res (read port)))
+ (close-input-port port)
res))) ;read-error if string trouble
#|
@@ -111449,12 +110527,7 @@ largest fp integer with a predecessor 2+53 - 1 = 9,007,199,254,740,991
((eq? form #<eof>))
(eval form)))))
-;; this takes too long
(when full-s7test
- (let-temporarily ((*#readers* ()))
- (require lint.scm)
- (lint "s7test.scm" #f))
-
(for-each
(lambda (s)
(if (and (setter s)
diff --git a/snd.h b/snd.h
index 6bf51c5..1c79d26 100644
--- a/snd.h
+++ b/snd.h
@@ -47,11 +47,11 @@
#include "snd-strings.h"
-#define SND_DATE "2-Feb-24"
+#define SND_DATE "12-Mar-24"
#ifndef SND_VERSION
-#define SND_VERSION "24.1"
+#define SND_VERSION "24.2"
#endif
#define SND_MAJOR_VERSION "24"
-#define SND_MINOR_VERSION "1"
+#define SND_MINOR_VERSION "2"
#endif
diff --git a/stuff.scm b/stuff.scm
index 6d4fd4d..68215e9 100644
--- a/stuff.scm
+++ b/stuff.scm
@@ -76,12 +76,9 @@
(set! lines (cons (and (pair? (car x)) (pair-line-number (car x))) lines))
(set! files (cons (and (pair? (car x)) (pair-filename (car x))) files)))))
- ;; show the enclosing contexts
- (let ((old-print-length (*s7* 'print-length)))
- (set! (*s7* 'print-length) 8)
+ (let-temporarily (((*s7* 'print-length) 8))
(do ((e (outlet ow) (outlet e)))
- ((memq e elist)
- (set! (*s7* 'print-length) old-print-length))
+ ((memq e elist))
(if (and (number? (length e)) ; with-let + mock-data + length method?
(> (length e) 0))
(format p "~%~{~A~| ~}~%" e)
@@ -1277,7 +1274,6 @@ Unlike full-find-if, safe-find-if can handle any circularity in the sequences.")
|#
;; ideally this would simply vanish, and make no change in the run-time state, but (values) here returns #<unspecified>
;; (let ((a 1) (b 2)) (list (set! a 3) (reflective-probe) b)) -> '(3 2) not '(3 #<unspecified> 2)
-;; I was too timid when I started s7 and thought (then) that (abs -1 (values)) should be an error
;; perhaps if we want it to disappear:
(define-bacro (reflective-probe . body)
diff --git a/tools/auto-tester.scm b/tools/auto-tester.scm
index 8456a3d..543b55b 100644
--- a/tools/auto-tester.scm
+++ b/tools/auto-tester.scm
@@ -33,6 +33,18 @@
;(when (provided? 'profiling) (load "profile.scm"))
;(set! (hook-functions *load-hook*) (list (lambda (hook) (format () "loading ~S...~%" (hook 'name)))))
+(define-constant %features% (copy *features*))
+
+(define (daytime)
+ (with-let (sublet *libc*)
+ (let ((timestr (make-string 64))
+ (p #f))
+ (let ((len (strftime timestr 64 "%H:%M"
+ (localtime
+ (set! p (time.make (time (c-pointer 0 'time_t*))))))))
+ (time.free p)
+ (substring timestr 0 len)))))
+
(define (cycler size)
(let ((cp-lst (make-list 3 #f))
(it-lst (make-list 3 #f)))
@@ -88,12 +100,6 @@
(require case.scm)
(define match? ((funclet 'case*) 'case*-match?))
-#|
-(when (provided? 'pure-s7)
- (define (set-current-input-port port) (set! (current-input-port) port))
- (define (set-current-output-port port) (set! (current-output-port) port)))
-|#
-
(when with-mock-data
(load "mockery.scm")
(define-constant mock-number (*mock-number* 'mock-number))
@@ -144,7 +150,7 @@
(define error-code "")
(define false #f)
(define-constant _undef_ (car (with-input-from-string "(#_asdf 1 2)" read)))
-(define kar car)
+(define (kar x) (car x)) ; not the same as (define kar car) -- subsequent setter below affects car in the latter case
(set! (setter kar) (lambda (sym e) (error 'oops "kar not settable: ~A" ostr)))
(define-constant _1234_ 1234)
(define-constant _dilambda_ (dilambda (lambda (x) (+ x 1)) (lambda (x y) (+ x y))))
@@ -516,20 +522,6 @@
(define-expansion (t725-comment . strs) (values)) ; this must be at the top-level, "comment" used as local var in lint.scm
-#|
-;; infinite loop if cyclic
-(define lint-no-read-error #t)
-(define linter (let ()
- (let-temporarily (((*s7* 'autoloading?) #t))
- (load "lint.scm"))
- (lambda (str)
- (call-with-output-string
- (lambda (op)
- (call-with-input-string str
- (lambda (ip)
- (lint ip op))))))))
-|#
-
(define-expansion (_dw_ . args)
`(dynamic-wind #f (lambda () ,@args) #f))
@@ -651,42 +643,6 @@
(object->string (car (list ,@args)))
read-line))
-#|
-(define-expansion (_rd7_ . args)
- `(with-input-from-file "/home/bil/cl/all-lg-results"
- (lambda ()
- ,@args)))
-
-(define-expansion (_rd8_ . args)
- `(let ((old-port (current-input-port)))
- (dynamic-wind
- (lambda ()
- (set! (current-input-port) (open-input-file "/home/bil/cl/all-lg-results")))
- (lambda ()
- ,@args)
- (lambda ()
- (unless (port-closed? (current-input-port))
- (close-input-port (current-input-port)))
- (set! (current-input-port) old-port)))))
-|#
-#|
-(define-expansion (_wr1_ . args)
- `(let ((port #f))
- (dynamic-wind
- (lambda ()
- (set! port (open-output-string)))
- (lambda ()
- (format port "~S" (car (list ,@args)))
- (get-output-string port #t))
- (lambda ()
- (close-output-port port)))))
-
-(define-expansion (_wr2_ . args)
- `(call-with-output-string
- (lambda (port)
- (write (car (list ,@args)) port))))
-|#
-
(define-expansion (_wr3_ . args)
`(format #f "~W" (car (list ,@args))))
@@ -732,48 +688,6 @@
(lambda (t i)
'error)))
-#|
-(define-expansion (_fe1_ . args)
- `(for-each (lambda (n) (n 0)) (list ,@args)))
-
-(define-expansion (_fe2_ . args)
- `(do ((x (list ,@args) (cdr x)))
- ((null? x) #unspscified>)
- ((car x) 0)))
-
-(define-expansion (_fe3_ . args)
- `(for-each (lambda (n) (set! (n) 0)) (list ,@args)))
-
-(define-expansion (_fe4_ . args)
- `(do ((x (list ,@args) (cdr x)))
- ((null? x) #unspscified>)
- (set! ((car x)) 0)))
-
-(define-macro (trace f)
- (let ((old-f (gensym "trace")))
- `(define ,f
- (let ((,old-f ,f))
- (apply lambda 'args
- `((format () "(~S ~{~S~^ ~}) -> " ',',f args)
- (let ((val (apply ,,old-f args)))
- (format () "~S~%" val)
- val)))))))
-
-(define-expansion (_tr1_ . args)
- `(with-output-to-string
- (lambda ()
- (define (tracy . pars) pars)
- (trace tracy)
- (apply tracy ,@args ()))))
-
-(define-expansion (_tr2_ . args)
- `(with-output-to-string
- (lambda ()
- ((lambda pars
- (format () "(tracy ~{~S~^ ~}) -> ~S~%" pars pars))
- ,@args))))
-|#
-
(define last-stable-f #f)
(define-constant (_stable1_ . args)
(let ((f (stable (random stable-len))))
@@ -934,7 +848,7 @@
'vector-fill! 'vector-typer 'hash-table-key-typer 'hash-table-value-typer
'peek-char
'make-hash-table 'make-weak-hash-table 'weak-hash-table?
- 'hash-code
+ ;'hash-code ; too many uninteresting diffs
'macro?
'quasiquote
'immutable? 'char-position 'string-position
@@ -1076,6 +990,7 @@
'block 'make-block 'block? 'block-ref 'block-set!
'blocks 'unsafe-blocks 'blocks1 'unsafe-blocks1 'blocks3 'unsafe-blocks3 'blocks4 'unsafe-blocks4 'blocks5
+ 'values2 'unsafe-values2
'block-reverse! 'subblock 'block-append 'block-let
;'simple-block? 'make-simple-block ;'make-c-tag ; -- uninteresting diffs
'make-cycle
@@ -1159,6 +1074,7 @@
"(values 1 2)" "(values)" "(values #\\c 3 1.2)" "(values \"ho\")" "(values 1 2 3 4 5 6 7 8 9 10)" "(values (define b1 3))"
"(apply values (make-list 128 1/2))"
"(values 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65)"
+ "(values (values 1 2 3))"
"0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24"
"(log 1.0) (log 2.0)"
"(log 1.0) (log 2.0) (log 3.0)"
@@ -1219,11 +1135,12 @@
(lambda (p) (return 'oops))))))"))
"#<eof>" "#<undefined>" "#<unspecified>" "#unknown" "___lst" "#<bignum: 3>"
- "#<>" "#<label:>" "#<...>" "..."
+ "#<>" "#<label:>" "#<...>" "..." "(cons #_quote call-with-exit)" ; "(#_quote . call-with-exit)"
"#_and" "'#_or" "#_abs" "#_+"
"#o123" "#b101" "#\\newline" "#\\alarm" "#\\delete" "#_cons" "#x123.123" "#\\x65"
"#i(60 0 0 0 0 1 0 0 0 1 1 0 0 1 0 1 0 0 1 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 1 1)"
"#r(0.000000 0.303100 0.261228 0.917131 0.691793 -0.677124 0.027342 -0.014801 1.166154 0.416979 0.851167 1.410955 0.139409 -0.306122 1.416862 1.054300 0.792442 0.062922 1.507148 0.118287 1.375215 1.459904 1.620963 0.828106 -0.237368 0.987982 0.753194 0.096604 1.712227 1.239483 0.673351 0.871862 0.125962 0.260000 0.626286 0.147473 0.131774 0.201212 -0.194457 0.538798 0.418147 1.292448 0.871870 0.794549 0.988888 1.131816 -0.166311 0.052304 0.543793 -0.229410 0.113585 0.733683 0.271039 1.008427 1.788452 0.654055 0.106430 0.828086 0.097436 0.376461)"
+ "(let ((x 0.0) (y 1.0)) (do ((.i 0 (#_+ .i 1))) ((#_= .i 2) (set! x (#_+ x y))) (set! x (#_* .i .1))))" ; if = is -, infinite loop
"(call-with-exit (lambda (goto) goto))"
"(symbol->string 'x)" "(symbol \"a b\")" "(symbol \"(\\\")\")"
@@ -1268,7 +1185,8 @@
"(let ((a 1)) (set! (setter 'a) integer?) (curlet))"
"bigi0" "bigi1" "bigi2" "bigrat" "bigflt" "bigcmp" "bigf2" "Hk"
- "(ims 1)" "(imbv 1)" "(imv 1)" "(imb 1)" "(imh 'a)" "V_1" "V_2" "H_1" "H_2" "H_3" "H_4" "H_5" "H_6" "L_6"
+ "(ims 1)" "(imbv 1)" "(imv 1)" "(imb 1)" "(imh 'a)" "(imi 'a)"
+ "V_1" "V_2" "H_1" "H_2" "H_3" "H_4" "H_5" "H_6" "L_6"
"(make-iterator (block 1 2 3))"
"(vector-dimensions (block))"
@@ -1382,7 +1300,7 @@
"(let loop ((i 2)) (if (> i 0) (loop (- i 1)) i))"
;"(rootlet)" ; why was this commented out? -- very verbose useless diffs
- "(unlet)"
+ ;"(unlet)"
"(let? (curlet))"
;"*s7*" ;variable
@@ -1457,6 +1375,8 @@
(lambda (s) (string-append "(let ((v (vector 0))) (set! (v 0) " s "))")))
(list (lambda (s) (string-append "(let ((x 1)) (immutable! 'x) (begin " s "))"))
(lambda (s) (string-append "((lambda* ((x 1)) (immutable! 'x) " s "))")))
+ (list (lambda (s) (string-append "(let ((f (lambda* (a (b 1)) (+ a b)))) (f :a " s "))"))
+ (lambda (s) (string-append "(let ((f (lambda* (a (b 1)) (+ a b)))) (f a: " s "))")))
(list (lambda (s) (string-append "(do ((i 0 (+ i 1))) ((= i 1)) (do ((j 0 (+ j 1))) ((= j 1)) (with-immutable (i j) " s ")))"))
(lambda (s) (string-append "(do ((i 0 (+ i 1))) ((= i 1)) (let ((j 0)) (with-immutable (i j) " s ")))")))
(list (lambda (s) (string-append "(or (_cop1_ " s "))"))
@@ -1697,7 +1617,8 @@
(let ((tree (catch #t
(lambda () ; try to catch read errors
- (eval-string (string-append "'" str))) ;(with-input-from-string str read) -- causes missing close paren troubles with eval-time reader-cond (read error not caught)
+ (eval-string (string-append "'" str)))
+ ;;(with-input-from-string str read) -- causes missing close paren troubles with eval-time reader-cond (read error not caught)
(lambda (t i)
()))))
(let walker ((p tree))
@@ -1955,9 +1876,7 @@
(set! last-func outer-funcs))
;(unless (output-port? imfo) (format *stderr* "(new) imfo ~S -> ~S~%" estr imfo) (abort)) ; with-mock-data
-; (when (infinite? (length *features*))
-; (format *stderr* "*features*: ~S, estr: ~A~%" *features* estr)
-; (abort))
+ (set! *features* (copy %features%))
(set! error-info #f)
(set! error-type 'no-error)
(set! error-code "")
@@ -1972,19 +1891,19 @@
(when (string-position "H_6" str) (fill! H_6 #f) (hash-table-set! H_6 'a H_6)))
)
- (define dots (vector "." "-" "+" "-"))
+ (define dots (vector "." "-" "+" "-" "." "-" "+" "-"))
(define (test-it)
(do ((m 0 (+ m 1))
- (n 0)
- ;(p 0 (+ p 1))
- )
- (#f ;(= p fuzzies)
+ (n 0))
+ (#f
(format *stderr* "reached end of loop??~%"))
(when (= m 100000)
(set! m 0)
(set! n (+ n 1))
- (if (= n 4) (set! n 0))
+ (when (= n 8)
+ (set! n 0)
+ (format *stderr* " ~A " (daytime)))
(format *stderr* "~A" (vector-ref dots n)))
(catch #t
@@ -1992,19 +1911,8 @@
(try-both (make-expr (+ 1 (random both-ran))))) ; min 1 here not 0, was 6
(lambda (type info)
(apply format *stderr* info)
- ))
- ))
-#|
- (define (vmemq f v)
- (call-with-exit
- (lambda (g)
- (do ((i 0 (+ i 1)))
- ((= i (length v)))
- (if (eq? (v i) 'call/cc)
- (g #t)))
- #f)))
- (display "call: " *stderr*) (display (vmemq 'call/cc functions) *stderr*) (newline *stderr*)
-|#
+ ))))
+
(test-it)))
)
diff --git a/tools/compare-calls.scm b/tools/compare-calls.scm
index 61162f3..a58c9c3 100644
--- a/tools/compare-calls.scm
+++ b/tools/compare-calls.scm
@@ -318,6 +318,8 @@
("tsort.scm" . "/home/bil/motif-snd/v-sort85")
("tlet.scm" . "/home/bil/motif-snd/v-let85")
("thash.scm" . "/home/bil/motif-snd/v-hash85")
+ ("tmap-hash.scm" . "/home/bil/motif-snd/v-map-hash85")
+ ("tmv.scm" . "/home/bil/motif-snd/v-mv85")
("tgen.scm" . "/home/bil/motif-snd/v-gen85")
("tall.scm" . "/home/bil/motif-snd/v-all85")
("snd-test.scm" . "/home/bil/motif-snd/v-call85")
diff --git a/tools/t101.scm b/tools/t101.scm
index ba98fc3..26a565b 100644
--- a/tools/t101.scm
+++ b/tools/t101.scm
@@ -151,8 +151,8 @@
)))
-(format *stderr* "~%~NC lint ~NC~%" 20 #\- 20 #\-)
-(catch #t (lambda () (lint "snd-test.scm" #f)) (lambda (type info) (apply format #t info)))
+;(format *stderr* "~%~NC lint ~NC~%" 20 #\- 20 #\-)
+;(catch #t (lambda () (lint "snd-test.scm" #f)) (lambda (type info) (apply format #t info)))
;(format *stderr* "~%~NC local s7test ~NC~%" 20 #\- 20 #\-)
;(system "./snd -e '(let () (catch #t (lambda () (load \"s7test.scm\" (curlet))) (lambda args #f)) (exit))'")
@@ -172,9 +172,15 @@
(format *stderr* "~NC tmap ~NC~%" 20 #\- 20 #\-)
(system "./repl tmap.scm")
+(format *stderr* "~NC tmv ~NC~%" 20 #\- 20 #\-)
+(system "./repl tmv.scm")
+
(format *stderr* "~NC tmat ~NC~%" 20 #\- 20 #\-)
(system "./repl tmat.scm")
+(format *stderr* "~NC tobj ~NC~%" 20 #\- 20 #\-)
+(system "./repl tobj.scm")
+
(format *stderr* "~NC tmac ~NC~%" 20 #\- 20 #\-)
(system "./repl tmac.scm")
@@ -193,6 +199,9 @@
(format *stderr* "~%~NC thash ~NC~%" 20 #\- 20 #\-)
(system "./repl thash.scm")
+(format *stderr* "~%~NC tmap-hash ~NC~%" 20 #\- 20 #\-)
+(system "./repl tmap-hash.scm")
+
(format *stderr* "~NC tauto ~NC~%" 20 #\- 20 #\-)
(system "./repl tauto.scm")
@@ -290,10 +299,12 @@
(system "./repl full-s7test.scm")
(format *stderr* "~NC full s7test ~NC~%" 20 #\- 20 #\-)
-(system "gcc -o trepl trepl.c s7.o -O -Wl,-export-dynamic -lm -I. -ldl")
+(system "gcc -o trepl ~/cl/trepl.c s7.o -O -Wl,-export-dynamic -lm -I. -ldl")
(system "trepl")
(format *stderr* "~NC valgrind leak check ~NC~%" 20 #\- 20 #\-)
(system "valgrind --leak-check=full --show-reachable=no --suppressions=/home/bil/cl/free.supp ./repl s7test.scm")
+(format *stderr* "all done\n")
+
(exit)
diff --git a/tools/tests7 b/tools/tests7
index 9062735..06e93b8 100755
--- a/tools/tests7
+++ b/tools/tests7
@@ -12,6 +12,7 @@ cp ~/cl/full-s7test.scm .
cp ~/cl/lt.scm .
cp ~/cl/peak-phases.scm .
cp ~/cl/arbtest.scm .
+cp ~/cl/threads.c .
echo ' '
echo '-------- base case --------'
@@ -184,3 +185,10 @@ repl s7test.scm
#
# -fsanitize=leak
# -fsanitize=undefined
+
+echo ' '
+echo '-------- threads --------'
+echo ' '
+gcc s7.c -c -I. -g3 -ldl -lm -Wl,-export-dynamic
+gcc -o threads threads.c s7.o -O -g -Wl,-export-dynamic -pthread -lm -I. -ldl
+threads
diff --git a/tools/timp.scm b/tools/timp.scm
index 0bd29b3..36b4a0f 100644
--- a/tools/timp.scm
+++ b/tools/timp.scm
@@ -175,16 +175,16 @@
(unless (= (table3 'b 1) 23.0) (format *stderr* "[18]"))
(s4444 table3 1 23.0)
(unless (= (table3 'b 1) 23.0) (format *stderr* "[19]"))
-#|
- (s4 table4 23.0) ; set_implicit_closure -- now an error
- (unless (= (table4 'b 1) 23.0) (format *stderr* "[20]"))
- (s44 table4 23.0)
- (unless (= (table4 'b 1) 23.0) (format *stderr* "[21]"))
- (s444 table4 '(23.0))
- (unless (= (table4 'b 1) 23.0) (format *stderr* "[22]"))
- (s4444 table4 1 23.0)
- (unless (= (table4 'b 1) 23.0) (format *stderr* "[23]"))
-|#
+
+; (s4 table4 23.0) ; set_implicit_closure -- now an error
+; (unless (= (table4 'b 1) 23.0) (format *stderr* "[20]"))
+; (s44 table4 23.0)
+; (unless (= (table4 'b 1) 23.0) (format *stderr* "[21]"))
+; (s444 table4 '(23.0))
+; (unless (= (table4 'b 1) 23.0) (format *stderr* "[22]"))
+; (s4444 table4 1 23.0)
+; (unless (= (table4 'b 1) 23.0) (format *stderr* "[23]"))
+
(s5 table2 #\a) ; set_implicit_vector
(unless (char=? (table2 0 1) #\a) (format *stderr* "[24]"))
(s55 table2 #\a)
@@ -232,4 +232,256 @@
(stest)
+
+(define len 1000000)
+
+(define H (hash-table 'abs *))
+(define (fabsH x)
+ ((H 'abs) x 0.0001))
+
+(define (f6) ; [719] -> [515 if func_one_arg handles hash] -> [508]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabsH i))))))
+
+(f6)
+
+
+(define P (list + * -))
+(define (fabsP x)
+ ((P 1) x 0.0001))
+
+(define (f8) ; [700] -> [524 fx_implicit]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabsP i))))))
+
+(f8)
+
+
+(define V (vector + * -))
+(define (fabsV x)
+ ((V 1) x 0.0001))
+
+(define (f9) ; [685] -> [512 fx_implicit]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabsV i))))))
+
+(f9)
+
+
+(define C (make-cycle *))
+(define (fabsC x)
+ ((C) x 0.0001))
+
+(define (f10) ; [681] (there is no op_implicit_c_object_ref)
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabsC i))))))
+
+(f10)
+
+
+;;; implicit arg cases (also included elsewhere)
+(define B (block .001 .0001 .00001)) ; C-object as arg
+(define (fabsB x)
+ (* x (B 1)))
+
+(define (f11) ; [591] no fx_*_ref?? block_ref_p_pp -> [519] fx_implicit_c_object_ref_a -- why not opt?
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabsB i))))))
+
+(f11)
+
+
+(define P2 (list (list + * -) (list .001 .0001 .00001)))
+(define (fabsP2 x)
+ ((P2 0 1) x 0.0001))
+
+(define (f12) ; [797]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabsP2 i))))))
+
+(f12)
+
+
+(define V2 #2d((#_+ #_* #_-) (.001 .0001 .00001)))
+(define (fabsV2 x)
+ ((V2 0 1) x 0.0001))
+
+(define (f13) ; [778]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabsV2 i))))))
+
+(f13)
+
+
+(define (f14) ; [492]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (* i (P2 1 1)))))))
+
+(f14)
+
+
+(define (f15) ; [185] -- [738] if (vector (vector ...))
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (* i (V2 1 1)))))))
+
+(f15)
+
+
+(define H2 (hash-table 'a .0001))
+(define (f16) ; [169] -- this is fully optimized!? -> [160] p_pp_sf_href!
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (* i (H2 'a)))))))
+
+(f16)
+
+
+(define L2 (inlet 'a .0001))
+(define (f17) ; [173] (no lref) -> [167] lref
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (* i (L2 'a)))))))
+
+(f17)
+
+
+(define V3 (vector .0001))
+(define (f18) ; [148] (opt_p_pi_sc(t_vector_ref_p_pi_unchecked))
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (* i (V3 0)))))))
+
+(f18)
+
+
+(define P3 (list .0001))
+(define (f19) ; [157] opt_p_pi_sc(list_ref_p_pi_unchecked)
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (* i (P3 0)))))))
+
+(f19)
+
+
+(define B3 (block .0001))
+(define (f20) ; [114] d_7pi_sf(block_ref_d_7pi)
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (* i (B3 0)))))))
+
+(f20)
+
+
+(define V4 #2d((.0001)))
+(define (f21) ; [185] opt_p_pii_sff(vector_ref_p_pii_direct)
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (* i (V4 0 0)))))))
+
+(f21)
+
+
+;;; let cases
+(define L (inlet 'abs *))
+(define L_abs (L 'abs))
+
+(define (fabs x)
+ ((L 'abs) x 0.0001))
+ ;((if (integer? x) * /) x 0.0001))
+
+(define (fLabs x)
+ (L_abs x 0.0001))
+
+(define (frefabs x)
+ ((let-ref L 'abs) x 0.0001))
+
+
+(define (f1) ; [729] -> [507 fx_implicit_let_ref_c]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabs i))))))
+
+(f1)
+
+
+(define (f2) ; [298]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fLabs i))))))
+
+(f2)
+
+
+(define (f3) ; [510]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (frefabs i))))))
+
+(f3)
+
+
+(define f4 ; [559]
+ (let ((L (openlet (inlet '+ (lambda (arg obj)
+ (#_+ arg (obj 'value)))
+ 'value 3))))
+ (lambda ()
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ 1 L 2) 6)
+ (display "f4 oops\n"))))))
+
+(f4)
+
+
+(define (fabsL x)
+ ((L 'abs) x 0.0001))
+
+(define (f5) ; [512, 723 if set L to H in the loop, 693 if int *??] -> [503?]
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabsL i))))))
+
+(f5)
+
+
+(define (fabs:L x)
+ ((L :abs) x 0.0001))
+
+(define (f22) ; [721] -> [504] (added keyword check)
+ (let ((sum 0.0))
+ (do ((i 0 (+ i 1)))
+ ((= i len) sum)
+ (set! sum (+ sum (fabs:L i))))))
+
+(f22)
+
+
(exit)
diff --git a/tools/tlet.scm b/tools/tlet.scm
index 8f724ef..22f36a9 100644
--- a/tools/tlet.scm
+++ b/tools/tlet.scm
@@ -46,7 +46,7 @@
(sum2 0.0)
(sum3 0.0)
(inc 0.0))
- (do ((i 0 (#_+ i 1)))
+ (do ((i 0 (#_+ i 1))) ; these #_'s make this much faster despite random->g_random rather than random_i_7i -- why? c_function_is_ok! lookup do_step1 eval [global]
((#_= i size))
(set! inc (#_symbol->value (#_vector-ref symbols i)))
(set! sum1 (#_+ sum1 inc))
@@ -55,6 +55,22 @@
(format *stderr* "~A ~A ~A ~A~%" (/ (- (* size size) size) 2) sum1 sum2 sum3))))
(in-e)
+#|
+without the with-let vs with it (without is slower!):
+total: 55.001
+ 98.000 (0.000 98.000) s7.c:fx_c_opssq_s
+ 65.000 (0.000 65.000) s7.c:fx_c_s_opsq
+ 50.000 (0.000 50.000) s7.c:fx_c_as
+ 34.715 (0.000 34.715) s7.c:g_random_1
+ 14.000 (0.000 14.000) s7.c:s7_symbol_local_value
+ 14.000 (32.000 46.000) s7.c:g_symbol_to_value
+-10.000 (10.000 0.000) s7.c:fx_unsafe_s
+-17.000 (17.000 0.000) s7.c:fx_c_a
+-42.000 (42.000 0.000) s7.c:s7_symbol_value
+-48.000 (48.000 0.000) s7.c:fx_c_opssq
+-49.000 (49.000 0.000) s7.c:fx_c_s_opaq
+-54.715 (54.715 0.000) s7.c:g_random
+|#
(define (with-biglet)
(let ((biglet (inlet)))
diff --git a/tools/tmap-hash.scm b/tools/tmap-hash.scm
new file mode 100644
index 0000000..7e3278f
--- /dev/null
+++ b/tools/tmap-hash.scm
@@ -0,0 +1,542 @@
+;;; hash map timings
+
+(define debugging (provided? 'debugging))
+
+(define chars-upper "#$%&'()*+,-.0123456789:<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûü")
+(define chars-lower "abcdefghijklmnopqrstuvwxyz-?=") ; more schemish?
+
+(define ok 1000000)
+(define bad 10000)
+
+(define (make-strings chr)
+ (let* ((num-keys 10000)
+ (keys (make-vector num-keys))
+ (num-chars (length chr)))
+ (do ((i 0 (+ i 1)))
+ ((= i num-keys)
+ keys)
+ (let* ((len (+ 4 (random 12)))
+ (str (make-string len)))
+ (do ((j 0 (+ j 1)))
+ ((= j len))
+ (string-set! str j (string-ref chr (random num-chars))))
+ (vector-set! keys i str)))))
+
+
+(define (ref-int) ; [92, 28 in fx_random_i, 17 in hash_int]
+ (let ((H (make-hash-table 1024)))
+ (do ((i 0 (+ i 1))
+ (int (random 10000) (random 10000)))
+ ((= i ok))
+ (unless (hash-table-ref H int)
+ (hash-table-set! H int int)))
+ (when debugging (format *stderr* "ref-int: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-int: (6384 10000 0 0 1)
+
+;(ref-int)
+
+
+(define (ref-rat) ; [4821, 4546 hash_equal_ratio] this is a worst case -- 0..1 mostly and default-hash-table-float-epsilon constrains our options
+ (let ((H (make-hash-table 1024)))
+ (let ((rats (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (/ (+ (random 99) 1) (+ 1 (random 99))))))))
+ (do ((i 0 (+ i 1))
+ (rat (vector-ref rats (random 10000)) (vector-ref rats (random 10000))))
+ ((= i bad))
+ (unless (hash-table-ref H rat)
+ (hash-table-set! H rat rat)))
+ (when debugging (format *stderr* "ref-rat: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-rat: (16308 36 9 31 2128)
+
+;(ref-rat)
+
+
+(define (ref-rat1) ; [288, 73 eval]
+ (let ((H (make-hash-table 1024)))
+ (let ((rats (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (/ (+ (random 99999) 1) (+ 1 (random 99))))))))
+ (do ((i 0 (+ i 1))
+ (rat (vector-ref rats (random 10000)) (vector-ref rats (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H rat)
+ (hash-table-set! H rat rat)))
+ (when debugging (format *stderr* "ref-rat1: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-rat1: (12516 1849 637 1382 14)
+
+;(ref-rat1)
+
+
+(define (ref-float) ; [320, 73 eval, 72 hash_float]
+ (let ((H (make-hash-table 1024)))
+ (let ((floats (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (random 1000.0))))))
+ (do ((i 0 (+ i 1))
+ (float (vector-ref floats (random 10000)) (vector-ref floats (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H float)
+ (hash-table-set! H float float)))
+ (when debugging (format *stderr* "ref-float: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-float: (15384 2 2 996 21)
+
+;(ref-float)
+
+
+(define (ref-complex) ; [1133, 945 in hash_float]
+ (let ((H (make-hash-table 1024)))
+ (let ((cs (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (complex (random 1000.0) (random 1000.0)))))))
+ (do ((i 0 (+ i 1))
+ (c (vector-ref cs (random 10000)) (vector-ref cs (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H c)
+ (hash-table-set! H c c)))
+ (when debugging (format *stderr* "ref-complex: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-complex: (16374 0 0 10 1065), (14685 199 202 1298 25)
+
+;(ref-complex)
+
+
+(define (ref-string) ; [356 (counting make-strings), 74 eval, 62 for hash_string]
+ (let ((H (make-hash-table 1024 string=?))
+ (strings (make-strings chars-lower)))
+ (do ((i 0 (+ i 1))
+ (str (vector-ref strings (random 10000)) (vector-ref strings (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H str)
+ (hash-table-set! H str str)))
+ (when debugging (format *stderr* "ref-string: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-string: (12795 1412 686 1491 18)
+
+;(ref-string)
+
+
+(define (ref-string1) ; [349, 74 eval, 53 hash_string]
+ (let ((H (make-hash-table 1024 string=?))
+ (strings (make-strings chars-upper)))
+ (do ((i 0 (+ i 1))
+ (str (vector-ref strings (random 10000)) (vector-ref strings (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H str)
+ (hash-table-set! H str str)))
+ (when debugging (format *stderr* "ref-string1: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-string1: (9114 5128 1663 479 6)
+
+;(ref-string1)
+
+
+(define (ref-string2) ; [3915, 3400 hash_string, 80+73 number_to_string]
+ (let ((H (make-hash-table 1024 string=?)))
+ (do ((i 0 (+ i 1))
+ (str (string-append "w" (number->string (random 10000))) (string-append "w" (number->string (random 10000)))))
+ ((= i bad))
+ (unless (hash-table-ref H str)
+ (hash-table-set! H str str)))
+ (when debugging (format *stderr* "ref-string2: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-string2: (16374 1 0 9 1111)
+
+;(ref-string2)
+
+
+(define (ref-string3) ; [344, 73 eval]
+ (let* ((syms (symbol-table))
+ (len (length syms)) ; ca 675
+ (strs (make-vector len)))
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (vector-set! strs i (symbol->string (vector-ref syms i))))
+ (let ((H (make-hash-table 1024)))
+ (do ((i 0 (+ i 1))
+ (str (vector-ref strs (random len)) (vector-ref strs (random len))))
+ ((= i ok))
+ (unless (hash-table-ref H str)
+ (hash-table-set! H str 1)))
+ (when debugging (format *stderr* "ref-string3: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-string3: (785 112 47 80 26): (675 786 111 48 79 26)
+
+;(ref-string3)
+
+
+(define (ref-ci-string) ; [856, 586 hash_ci_string]
+ (let ((H (make-hash-table 1024 string-ci=?))
+ (strings (make-strings chars-lower)))
+ (do ((i 0 (+ i 1))
+ (str (vector-ref strings (random 10000)) (vector-ref strings (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H str)
+ (hash-table-set! H str str)))
+ (when debugging (format *stderr* "ref-ci-string: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-ci-string: (16036 0 0 348 42)
+
+;(ref-ci-string)
+
+
+(define (ref-sym) ; [288, 74 eval]
+ (let ((H (make-hash-table 1024))
+ (syms (let ((V (make-vector 10000))
+ (strs (make-strings chars-lower)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (string->symbol (vector-ref strs i)))))))
+ (do ((i 0 (+ i 1))
+ (sym (vector-ref syms (random 10000)) (vector-ref syms (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H sym)
+ (hash-table-set! H sym sym)))
+ (when debugging (format *stderr* "ref-sym: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-sym: (6412 9945 27 0 2)
+
+;(ref-sym)
+
+
+(define (ref-sym1) ; [266, 73 eval]
+ (let* ((st (symbol-table))
+ (len (length st)))
+ (let ((H (make-hash-table 1024)))
+ (do ((i 0 (+ i 1))
+ (sym (vector-ref st (random len)) (vector-ref st (random len))))
+ ((= i ok))
+ (unless (hash-table-ref H sym)
+ (hash-table-set! H sym 1)))
+ (when debugging (format *stderr* "ref-sym1: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-sym1: (493 409 111 11 3)
+
+;(ref-sym1)
+
+
+(define (ref-pair) ; [4574, 2936 in pair_equal, 803 integer_equal, 634 hash_equal_any] -> [2495, 1570 pair_equal] -> [659, 172 pair_equal, 76 hash_map_pair]
+ (let ((H (make-hash-table 1024)))
+ (let ((lsts (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (cons (random 1000) (random 1000)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref lsts (random 10000)) (vector-ref lsts (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-pair: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))))
+ ;; ref-pair: (16284 0 0 100 100): (10000 16185 2 2 195 100): (9953 14600 212 177 1395 21)
+
+;(ref-pair)
+
+
+(define (ref-pair1) ; [812, 274 hash_map_pair, 150 pair_equal]
+ (let ((H (make-hash-table 1024)))
+ (let ((lsts (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (make-list (random 100) (random 1000)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref lsts (random 10000)) (vector-ref lsts (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-pair1: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-pair1: (9404 9039 5561 1529 255 5)
+
+;(ref-pair1)
+
+
+(define (ref-iv) ; [442]
+ (let ((H (make-hash-table 1024)))
+ (let ((ivs (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (make-int-vector (random 100) (random 1000)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref ivs (random 10000)) (vector-ref ivs (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-iv: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-iv: (9407 14335 121 210 1718 12)
+
+;(ref-iv)
+
+
+(define (ref-bv) ; [616]
+ (let ((H (make-hash-table 1024)))
+ (let ((bvs (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (make-byte-vector (random 100) (random 250)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref bvs (random 10000)) (vector-ref bvs (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-bv: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-bv: (8156 15794 11 8 571 25)
+
+;(ref-bv)
+
+
+(define (ref-v) ; [614]
+ (let ((H (make-hash-table 1024)))
+ (let ((vs (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (make-vector (random 100) (random 1000)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref vs (random 10000)) (vector-ref vs (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-v: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-v: (9433 14334 111 229 1710 13)
+
+;(ref-v)
+
+
+(define (ref-fv) ; [446]
+ (let ((H (make-hash-table 1024)))
+ (let ((floats (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (make-float-vector (random 100) (random 1000.0)))))))
+ (do ((i 0 (+ i 1))
+ (float (vector-ref floats (random 10000)) (vector-ref floats (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H float)
+ (hash-table-set! H float float)))
+ (when debugging (format *stderr* "ref-fv: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-fv: (9895 14340 113 172 1759 14)
+
+;(ref-fv)
+
+
+(define (ref-let) ; [452, 167 let_equal_1, 65 simple_inlet] -- let_equal checks outlet chains! called from hash_equal_any
+ (let ((H (make-hash-table 1024)))
+ (do ((i 0 (+ i 1))
+ (p (inlet 'a (random 10000)) (inlet 'a (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-let: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-let: (6384 10000 0 0 1)
+
+;(ref-let)
+
+
+(define (ref-let1) ; [1153, 626 let_equal_1]
+ (let ((H (make-hash-table 1024)))
+ (let ((lets (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (inlet 'a (random 1000) 'b (random 1000)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref lets (random 10000)) (vector-ref lets (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-let1: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-let1: (14573 208 204 1399 19)
+
+;(ref-let1)
+
+
+(define (ref-char) ; [114, 26 g_random_i, 12 hash_char, 12 integer_to_char]
+ (let ((H (make-hash-table 256 char=?)))
+ (do ((i 0 (+ i 1))
+ (c (integer->char (random 256)) (integer->char (random 256))))
+ ((= i ok))
+ (unless (hash-table-ref H c)
+ (hash-table-set! H c c)))
+ (when debugging (format *stderr* "ref-char: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; (768 256 0 0 1)
+
+;(ref-char)
+
+
+(define (ref-hash) ;[525] slow if hash has > 2 entries
+ (let ((H (make-hash-table 1024)))
+ (let ((tabs (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (hash-table 'a (random 10000)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref tabs (random 10000)) (vector-ref tabs (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-hash: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-hash: (16383 0 0 1 6317): (6350 10034 6350 0 0 1)
+
+;(ref-hash)
+
+
+(define (ref-hash1) ; [555]
+ (let ((H (make-hash-table 1024)))
+ (let ((tabs (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (hash-table 'a (random 10000) 'b (random 10000)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref tabs (random 10000)) (vector-ref tabs (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-hash1: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-hash1: (16383 0 0 1 6282): (10000 9135 5105 1657 487 8)
+
+;(ref-hash1)
+
+
+(define (ref-c-pointer) ; [352]
+ (let ((H (make-hash-table 1024)))
+ (let ((ptrs (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (c-pointer (random 4000000)))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref ptrs (random 10000)) (vector-ref ptrs (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-c-pointer: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-c-pointer: (12794 778 962 1850 10): (9994 9033 5222 1696 433 6)
+
+;(ref-c-pointer)
+
+
+(define (ref-iterator) ; [2882, 887 vector_equal, 705 iterator_equal 216 hash_equal_any]
+ (let ((H (make-hash-table 1024)))
+ (let ((ptrs (let ((V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (make-iterator (case (modulo i 6)
+ ((0) (make-list (+ (random 100) 1) (random 10000)))
+ ((1) (vector (random 100) (random 100) (random 100)))
+ ((2) (float-vector (random 100) (random 100) (random 100)))
+ ((3) (int-vector (random 100) (random 100) (random 100)))
+ ((4) (byte-vector (random 100) (random 100) (random 100)))
+ ((5) (string (integer->char (+ (random 50) 32))
+ (integer->char (+ (random 50) 32))
+ (integer->char (+ (random 50) 32)))))))))))
+ (do ((i 0 (+ i 1))
+ (p (vector-ref ptrs (random 10000)) (vector-ref ptrs (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H p)
+ (hash-table-set! H p p)))
+ (when debugging (format *stderr* "ref-iterator: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-iterator: (9982 13546 2146 395 297 87)
+
+;(ref-iterator)
+
+
+(define (ref-undefined) ; [25262, 9641 undefined_equal, 9393 strcmp, 5065 hash_equal_any (3 hash_map_undefined)]
+ ; [ 2040, 1666 hash_equal_any, 76 eval (18 hash_map_undefined]
+ ; [ 450, 76 eval, 71 hash_equal_any (24 hash_map_undefined]
+ (let ((H (make-hash-table 1024))
+ (strings (let ((strs (make-strings chars-lower))
+ (V (make-vector 10000)))
+ (do ((i 0 (+ i 1)))
+ ((= i 10000) V)
+ (vector-set! V i (eval-string (string-append "#a" (vector-ref strs i)))))))) ;slightly faster than with-input-from-string + read
+ (do ((i 0 (+ i 1))
+ (str (vector-ref strings (random 10000)) (vector-ref strings (random 10000))))
+ ((= i ok))
+ (unless (hash-table-ref H str)
+ (hash-table-set! H str str)))
+ (when debugging (format *stderr* "ref-undefined: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-undefined: (10000 16372 0 0 12 862): (9999 15542 3 5 834 2443)
+
+;(ref-undefined)
+
+
+(define (ref-c-func) ; [2004, 1271 hash_equal_any, 411 eq_equal, 73 eval]
+ ; [340]
+ (let* ((st (symbol-table))
+ (len (length st)))
+ (let ((H (make-hash-table 1024))
+ (fncs (let ((V (make-vector len #f))
+ (i 0))
+ (for-each (lambda (sym)
+ (let ((f (symbol->value sym)))
+ (when (procedure? f)
+ (vector-set! V i f)
+ (set! i (+ i 1)))))
+ st)
+ (set! len i)
+ V)))
+ (do ((i 0 (+ i 1))
+ (f (vector-ref fncs (random len)) (vector-ref fncs (random len))))
+ ((= i ok))
+ (unless (hash-table-ref H f)
+ (hash-table-set! H f 1)))
+ (when debugging (format *stderr* "ref-c-func: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max)))))) ; ref-c-func: (442 632 342 50 0 2)
+
+;(ref-c-func)
+
+
+(when (provided? 'gmp)
+ (define (ref-big-int) ; [1170]
+ (let ((H (make-hash-table 1024)))
+ (do ((i 0 (+ i 1))
+ (int (+ 1000000000000000000000000 (random (bignum 10000))) (+ 1000000000000000000000000 (random (bignum 10000)))))
+ ((= i ok))
+ (unless (hash-table-ref H int)
+ (hash-table-set! H int int)))
+ (when debugging (format *stderr* "ref-big-int: (~A ~{~A~^ ~})~%"
+ (hash-table-entries H) ((object->let H) 'stats:0|1|2|n|max))))) ; ref-big-int: (10000 6384 10000 0 0 1)
+
+ ;(ref-big-int)
+ )
+
+
+
+(define (all-cases)
+ (ref-int)
+ (ref-rat)
+ (ref-rat1)
+ (ref-float)
+ (ref-complex)
+ (ref-string)
+ (ref-string1)
+ (ref-string2)
+ (ref-string3)
+ (ref-ci-string)
+ (ref-sym1)
+ (ref-sym)
+ (ref-pair)
+ (ref-pair1)
+ (ref-iv)
+ (ref-bv)
+ (ref-fv)
+ (ref-v)
+ (ref-let)
+ (ref-let1)
+ (ref-char)
+ (ref-hash)
+ (ref-hash1)
+ (ref-c-pointer)
+ (ref-iterator)
+ (ref-undefined)
+ (ref-c-func)
+ (when (provided? 'gmp)
+ (ref-big-int))
+ )
+
+(all-cases)
+
+#|
+
+all-cases 4.1 secs
+24.0: 584
+23.0: 665
+22.0: 606
+21.0: 472
+20.9 498
+|#
+
+(exit)
diff --git a/tools/tmisc.scm b/tools/tmisc.scm
index 407417e..b72006e 100644
--- a/tools/tmisc.scm
+++ b/tools/tmisc.scm
@@ -228,76 +228,6 @@
(wtest)
-;;; -------- multiple values --------
-(define (mv1)
- (+ (values 1 2 3)))
-(define (mv2)
- (+ 1 (values 2 3)))
-(define (mv3)
- (+ (values 1 2) 3))
-(define (mv4 x)
- (+ x (values x x)))
-(define (mv5 x)
- (+ (values x x) x))
-(define (mv-clo1 x y)
- (+ x y))
-(define (mv6 x)
- (mv-clo1 (values x 1)))
-(define (mv-clo2 . args)
- (apply + args))
-(define (mv7 x)
- (mv-clo2 (values x 1)))
-(define (mv8)
- (+ (values 1 2 3) (values 3 -2 -1)))
-(define (mv9)
- (+ 1 (values 2 3 4) -4))
-(define (mv10)
- (+ (values 1 2 3)))
-(define (mv11)
- (+ 1 (values -1 2 4)))
-(define (mv12 x y)
- (+ x y (values 2 3 4)))
-
-;;; pair_sym: (mv-clo (values x 1)), h_c_aa: (values x 1), splice_eval_args2 ([i] 1), eval_arg2->apply mv-clo! (loop below is safe_dotimes_step_p
-;;; not enough args for mv-clo1?
-;;; mv-clo2: closure_s_p -> pair_sym ->h_c_aa etc as above!
-;;; perhaps apply_[safe_]closure?
-
-(define (mvtest)
- (unless (= (mv1) 6) (format *stderr* "mv1: ~S~%" (mv1)))
- (unless (= (mv2) 6) (format *stderr* "mv2: ~S~%" (mv2)))
- (unless (= (mv3) 6) (format *stderr* "mv3: ~S~%" (mv3)))
- (unless (= (mv4 2) 6) (format *stderr* "(mv4 2): ~S~%" (mv4 2)))
- (unless (= (mv5 2) 6) (format *stderr* "(mv5 2): ~S~%" (mv5 2)))
- (unless (= (mv6 5) 6) (format *stderr* "(mv6 5): ~S~%" (mv6 5)))
- (unless (= (mv7 5) 6) (format *stderr* "(mv7 5): ~S~%" (mv7 5)))
- (unless (= (mv8) 6) (format *stderr* "mv8: ~S~%" (mv8)))
- (unless (= (mv9) 6) (format *stderr* "mv9: ~S~%" (mv9)))
- (unless (= (mv10) 6) (format *stderr* "mv10: ~S~%" (mv10)))
- (unless (= (mv11) 6) (format *stderr* "mv11: ~S~%" (mv11)))
- (unless (= (mv12 -1 -2) 6) (format *stderr* "(mv12 -1 -2): ~S~%" (mv12 -1 -2)))
- (do ((i 0 (+ i 1)))
- ((= i 50000))
- (mv1)
- (mv2)
- (mv3)
- (mv4 i)
- (mv5 i)
- (mv6 i)
- (mv7 i)
- (mv8)
- (mv9)
- (mv10)
- (mv11)
- (mv12 -2 -1)
- ))
-
-(mvtest)
-
-(when (> (*s7* 'profile) 0)
- (show-profile 200))
-
-
;;; -------- typers --------
(let ()
(define (10-or-12? val)
diff --git a/tools/tmv.scm b/tools/tmv.scm
new file mode 100644
index 0000000..824a908
--- /dev/null
+++ b/tools/tmv.scm
@@ -0,0 +1,307 @@
+;;; multiple-values timing tests
+
+#|
+(define (ok? otst ola oexp)
+ (let ((result (catch #t ola
+ (lambda (type info)
+ (if (not (eq? oexp 'error))
+ (begin (apply format #t info) (newline)))
+ 'error))))
+ (if (not (equal? result oexp))
+ (format #t "~A: ~A got ~S but expected ~S~%~%" (port-line-number) otst result oexp))))
+
+(define-macro (test tst expected) `(ok? ',tst (#_let () (define (_s7_) ,tst)) ,expected))
+|#
+
+
+;;; -------- multiple values from tmisc --------
+(define (mv1)
+ (+ (values 1 2 3)))
+(define (mv2)
+ (+ 1 (values 2 3)))
+(define (mv3)
+ (+ (values 1 2) 3))
+(define (mv4 x)
+ (+ x (values x x)))
+(define (mv5 x)
+ (+ (values x x) x))
+(define (mv-clo1 x y)
+ (+ x y))
+(define (mv6 x)
+ (mv-clo1 (values x 1)))
+(define (mv-clo2 . args)
+ (apply + args))
+(define (mv7 x)
+ (mv-clo2 (values x 1)))
+(define (mv8)
+ (+ (values 1 2 3) (values 3 -2 -1)))
+(define (mv9)
+ (+ 1 (values 2 3 4) -4))
+(define (mv11)
+ (+ 1 (values -1 2 4)))
+(define (mv12 x y)
+ (+ x y (values 2 3 4)))
+
+;;; pair_sym: (mv-clo (values x 1)), h_c_aa: (values x 1), splice_eval_args2 ([i] 1), eval_arg2->apply mv-clo! (loop below is safe_dotimes_step_p
+;;; not enough args for mv-clo1?
+;;; mv-clo2: closure_s_p -> pair_sym ->h_c_aa etc as above!
+;;; perhaps apply_[safe_]closure?
+
+(define (mvtest)
+ (unless (= (mv1) 6) (format *stderr* "mv1: ~S~%" (mv1)))
+ (unless (= (mv2) 6) (format *stderr* "mv2: ~S~%" (mv2)))
+ (unless (= (mv3) 6) (format *stderr* "mv3: ~S~%" (mv3)))
+ (unless (= (mv4 2) 6) (format *stderr* "(mv4 2): ~S~%" (mv4 2)))
+ (unless (= (mv5 2) 6) (format *stderr* "(mv5 2): ~S~%" (mv5 2)))
+ (unless (= (mv6 5) 6) (format *stderr* "(mv6 5): ~S~%" (mv6 5)))
+ (unless (= (mv7 5) 6) (format *stderr* "(mv7 5): ~S~%" (mv7 5)))
+ (unless (= (mv8) 6) (format *stderr* "mv8: ~S~%" (mv8))) ; op_safe_c_pp_3|6_mv
+ (unless (= (mv9) 6) (format *stderr* "mv9: ~S~%" (mv9))) ; op_safe_c_3p_2|3_mv
+ (unless (= (mv11) 6) (format *stderr* "mv11: ~S~%" (mv11)))
+ (unless (= (mv12 -1 -2) 6) (format *stderr* "(mv12 -1 -2): ~S~%" (mv12 -1 -2)))
+ (do ((i 0 (+ i 1)))
+ ((= i 100000))
+ (mv1)
+ (mv2)
+ (mv3)
+ (mv4 i)
+ (mv5 i)
+ (mv6 i)
+ (mv7 i)
+ (mv8)
+ (mv9)
+ (mv11)
+ (mv12 -2 -1)
+ ))
+
+;(mvtest) ; [642] -> [578] -> [562] -> [492]
+
+
+(define len 1000000)
+
+(define (faddc) ; [607] -> [508 (no pair_append)] -> [384]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (values 1 2 3) 4) 10)
+ (display "faddc oops\n" *stderr*))))
+
+;(faddc)
+
+
+(define (fadds) ; [620] -> [523] -> [396]
+ (let ((arg 4))
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (values 1 2 3) arg) 10)
+ (display "fadds oops\n" *stderr*)))))
+
+;(fadds)
+
+
+;(let () (define (func) (do ((x 0.0 (+ x 0.1)) (i 0 (+ i 1))) ((>= x 0.1) (#_with-baffle (inlet (values 1 2) (symbol? x)))))) (func)) */
+
+(define (fadda) ; [626] -> [554] -> [415]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (values 1 2 3) (if (integer? i) 4 0)) 10) ; safe_c_pa_mv
+ (display "fadda oops\n" *stderr*))))
+
+;(fadda)
+
+
+(define (fadd1) ; [834] -> [736 (no pair_append)] -> [718]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (values i (+ i 1) (+ i 2)) 4) (+ 7 (* i 3)))
+ (display "fadd1 oops\n" *stderr*))))
+
+;(fadd1)
+
+
+(define (fadda6) ; [1127 gc copy_proper_list make_list op_safe_c_pa_mv fx_c_opcsq_c] -> [1041] -> [1010]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (values i (+ i 1) 2 3 4 5) (* 2 3)) (+ (* 2 i) 21)) ; op_safe_c_pa_mv > 3 mv vals
+ (display "fadda6 oops\n" *stderr*))))
+
+;(fadda6)
+
+
+(define (fadds6) ; [1010 after] -> [990]
+ (let ((three 3))
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (values i (+ i 1) 2 3 4 5) three) (+ (* 2 i) 18))
+ (display "fadds6 oops\n" *stderr*)))))
+
+;(fadds6)
+
+
+(define (faddc6) ; [997 after] -> [978]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (values i (+ i 1) 2 3 4 5) 3) (+ (* 2 i) 18))
+ (display "faddc6 oops\n" *stderr*))))
+
+;(faddc6)
+
+
+(define (fadd2-mv) (values 1 2 3))
+(define (fadd2) ; [649] -> [550 (no pair_append)] -> [546 if no goto] -> [425]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (fadd2-mv) 4) 10)
+ (display "fadd2 oops\n" *stderr*)))) ; op_c_na calls make_list (op_c_nc?) [op_safe_c_pc_mv? so the make_list can be side-stepped?]
+
+;(fadd2)
+
+
+(define (faddc0) ; [509] -> [504 plist_4 (lose for extra if, gain in gc)] -> [383]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ 4 (values 1 2 3)) 10) ; safe_c_cp -> safe_c_sp_mv which uses cons(args, value)
+ (display "faddc0 oops\n" *stderr*))))
+
+;(faddc0)
+
+
+(define (fadds02) ; [422 plist_3] -> [409] -> [357 aa->nc]
+ (let ((four 4))
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ four (values 1 2)) 7) ; to sp_mv
+ (display "fadds02 oops\n" *stderr*)))))
+
+;(fadds02)
+
+
+(define (fadds0) ; [522] -> [516 plist_4 -- still has make_list] -> [395]
+ (let ((four 4))
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ four (values 1 2 3)) 10) ; to sp_mv
+ (display "fadds0 oops\n" *stderr*)))))
+
+;(fadds0)
+
+
+(define (fadda0) ; [559] -> [552 plist_4] -> [431]
+ (let ((four 2))
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (* 2 four) (values 1 2 3)) 10) ; also goes to sp_mv
+ (display "fadda0 oops\n" *stderr*)))))
+
+;(fadda0)
+
+
+(define (strv)
+ ;; [611 op_safe_c_p -> op_c_p_mv? (copied)] -> [525 (uncopied -- buggy)] ->
+ ;; [679 if safe_list_is_possible (no cancellation)] -> [547 if direct safe_list] ->
+ ;; [567 checked safe_list used direct] -> [574 if in_use set] -> [563 if no goto apply]
+ ;; [540 if plist] -> [434]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (string=? (string (values #\a #\b #\c)) "abc")
+ (display "strv oops\n" *stderr*))))
+
+;(strv)
+
+
+(define (faddssp2) ; [485] -> [478 if plist] -> [456] -> [403 aa->nc]
+ (let ((four 4))
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ four four (values 1 2)) 11)
+ (display "faddssp2 oops\n" *stderr*)))))
+
+;(faddssp2)
+
+
+(define (faddssp3) ; [573] -> [454]
+ (let ((four 4))
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ four four (values 1 2 3)) 14)
+ (display "faddssp3 oops\n" *stderr*)))))
+
+;(faddssp3)
+
+
+(define (faddp) ; [662] -> [653]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (apply (values + '(1 2))) 3) ; op_c_p_mv + op_c_aa
+ (display "faddp oops\n" *stderr*))))
+
+;(faddp)
+
+
+(define (faddap) ; [524] -> [506]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (apply + (values 5 '(1 2))) 8) ; op_c_ap_mv + op_c_aa
+ (display "faddap oops\n" *stderr*))))
+
+;(faddap)
+
+
+(define (faddpp) ; [625] -> [519 aa->nc]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ (values 1 2) (values 3 4)) 10) ; op_safe_c_pp_3|6_mv, also (+ (values 1 2 3) (values 3 -2 -1))
+ (display "faddpp oops\n" *stderr*))))
+
+;(faddpp)
+
+
+(define (fadd3p) ; [784] -> [676 no make_list op_c_nc]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (+ 1 (values 2 3 4) -4) 6) ; op_safe_c_3p_2|3_mv
+ (display "fadd3p oops\n" *stderr*))))
+
+;(fadd3p)
+
+
+(define (faddnp) ; [964]
+ (do ((i 0 (+ i 1)))
+ ((= i len))
+ (unless (= (apply (values + 1 2) '(3)) 6) ; op_any_c_mv (and op_c_na)
+ (display "faddnp oops\n" *stderr*))))
+
+;(faddnp)
+
+
+
+(define (all-tests)
+ (mvtest)
+ (faddc)
+ (fadds)
+ (fadda)
+ (fadd1)
+ (fadd2)
+ (faddc6)
+ (fadds6)
+ (fadda6)
+ (faddc0)
+ (fadds02)
+ (fadds0)
+ (fadda0)
+ (strv)
+ (faddssp2)
+ (faddssp3)
+ (faddp)
+ (faddap)
+ (faddpp)
+ (fadd3p)
+ (faddnp)
+ )
+
+(all-tests)
+
+(when (provided? 'debugging)
+ (display ((*s7* 'memory-usage) 'safe-lists))
+ (newline))
+
+(exit)
diff --git a/tools/tread.scm b/tools/tread.scm
index 24aab9e..6d2b760 100644
--- a/tools/tread.scm
+++ b/tools/tread.scm
@@ -5,82 +5,88 @@
(set! (*s7* 'default-hash-table-length) 4)
;(set! (*s7* 'heap-size) (* 10 1024000))
+(define (all-copy v1 v2)
+ (do ((i 0 (+ i 1)))
+ ((= i 7))
+ (vector-set! v2 i (copy (vector-ref v1 i)))))
+
(define (tester)
- (do ((baddies 0)
- (size 3 (+ size 1)))
- ((= size 4))
- (format *stderr* "~%-------- ~D --------~%" size)
-
- (do ((tries (* 2000 (expt 3 size)))
- (k 0 (+ k 1)))
- ((or (= k tries)
- (> baddies 1)))
-
- (let ((cp-lst (make-list 3 #f))
- (it-lst (make-list 3 #f)))
- (let ((bases (vector (make-list 3 #f)
+ (let ((base-vector (vector (make-list 3 #f)
(make-vector 3 #f)
(make-cycle #f)
(hash-table 'a 1 'b 2 'c 3)
(inlet 'a 1 'b 2 'c 3)
- (make-iterator it-lst)
- (c-pointer 1 cp-lst)))
- (sets ())
- (b1 0)
- (b2 0))
-
- (do ((i 0 (+ i 1))
- (r1 (random 7) (random 7))
- (r2 (random 7) (random 7))
- (loc (random 3) (random 3)))
- ((= i size))
- (set! b1 (bases r1))
- (set! b2 (bases r2))
- (case (type-of b1)
- ((pair?)
- (if (> (random 10) 3)
- (begin
- (set! (b1 loc) b2)
- (set! sets (cons (list r1 loc r2) sets)))
- (begin
- (set-cdr! (cddr b1) (case loc ((0) b1) ((1) (cdr b1)) (else (cddr b1))))
- (set! sets (cons (list r1 (+ loc 3) r2) sets)))))
-
- ((vector?)
- (set! (b1 loc) b2)
- (set! sets (cons (list r1 loc r2) sets)))
-
- ((c-object?)
- (set! (b1 0) b2)
- (set! sets (cons (list r1 0 r2) sets)))
-
- ((hash-table? let?)
- (let ((key (#(a b c) loc)))
- (set! (b1 key) b2)
- (set! sets (cons (list r1 key r2) sets))))
-
- ((c-pointer?)
- (set! (cp-lst loc) b2)
- (set! sets (cons (list r1 loc r2) sets)))
-
- ((iterator?)
- (set! (it-lst loc) b2)
- (set! sets (cons (list r1 loc r2) sets)))))
-
- (let ((bi 0))
- (for-each
- (lambda (x)
- (let ((str (object->string x :readable)))
- (unless (equal? x (eval-string str))
- (set! baddies (+ baddies 1))
- (format *stderr* "x: ~S~%" x)
- (format *stderr* "ex: ~S~%" (eval-string str))
- (format *stderr* "sets: ~S~%" (reverse sets))
- (format *stderr* "str: ~S~%" str)
- (pretty-print (with-input-from-string str read) *stderr* 0)
- (format *stderr* "~%~%")
-
- (format *stderr* "
+ (make-iterator (make-list 3 #f))
+ (c-pointer 1 (make-list 3 #f)))))
+ (do ((baddies 0)
+ (size 3 (+ size 1)))
+ ((= size 4))
+ (format *stderr* "~%-------- ~D --------~%" size)
+
+ (do ((tries (* 2000 (expt 3 size)))
+ (k 0 (+ k 1)))
+ ((or (= k tries)
+ (> baddies 1)))
+
+ (let ((cp-lst (make-list 3 #f))
+ (it-lst (make-list 3 #f)))
+ (let ((bases (make-vector 7))
+ (sets ())
+ (b1 0)
+ (b2 0))
+ (all-copy base-vector bases)
+ (do ((i 0 (+ i 1))
+ (r1 (random 7) (random 7))
+ (r2 (random 7) (random 7))
+ (loc (random 3) (random 3)))
+ ((= i size))
+ (set! b1 (bases r1))
+ (set! b2 (bases r2))
+ (case (type-of b1)
+ ((pair?)
+ (if (> (random 10) 3)
+ (begin
+ (set! (b1 loc) b2)
+ (set! sets (cons (list r1 loc r2) sets)))
+ (begin
+ (set-cdr! (cddr b1) (case loc ((0) b1) ((1) (cdr b1)) (else (cddr b1))))
+ (set! sets (cons (list r1 (+ loc 3) r2) sets)))))
+
+ ((vector?)
+ (set! (b1 loc) b2)
+ (set! sets (cons (list r1 loc r2) sets)))
+
+ ((c-object?)
+ (set! (b1 0) b2)
+ (set! sets (cons (list r1 0 r2) sets)))
+
+ ((hash-table? let?)
+ (let ((key (#(a b c) loc)))
+ (set! (b1 key) b2)
+ (set! sets (cons (list r1 key r2) sets))))
+
+ ((c-pointer?)
+ (set! (cp-lst loc) b2)
+ (set! sets (cons (list r1 loc r2) sets)))
+
+ ((iterator?)
+ (set! (it-lst loc) b2)
+ (set! sets (cons (list r1 loc r2) sets)))))
+
+ (let ((bi 0))
+ (for-each
+ (lambda (x)
+ (let ((str (object->string x :readable)))
+ (unless (equal? x (eval-string str))
+ (set! baddies (+ baddies 1))
+ (format *stderr* "x: ~S~%" x)
+ (format *stderr* "ex: ~S~%" (eval-string str))
+ (format *stderr* "sets: ~S~%" (reverse sets))
+ (format *stderr* "str: ~S~%" str)
+ (pretty-print (with-input-from-string str read) *stderr* 0)
+ (format *stderr* "~%~%")
+
+ (format *stderr* "
(let ((p (make-list 3 #f))
(v (make-vector 3 #f))
(cy (make-cycle #f))
@@ -89,32 +95,32 @@
(it (make-iterator (make-list 3 #f)))
(cp (c-pointer 1 (make-list 3 #f))))
")
- (for-each
- (lambda (set)
- (cond ((and (zero? (car set))
- (> (cadr set) 2))
- (format *stderr* " (set-cdr! (list-tail p 2) ~A)~%"
- (#("p" "(cdr p)" "(cddr p)") (- (cadr set) 3))))
- ((< (car set) 5)
- (format *stderr* " (set! (~A ~A) ~A)~%"
- (#(p v cy h e) (car set))
- (case (car set)
- ((0 1) (cadr set))
- ((2) 0)
- ((3) (format #f "~W" (cadr set)))
- ((4) (symbol->keyword (cadr set))))
- (#(p v cy h e it cp) (caddr set))))
- ((= (car set) 5)
- (format *stderr* " (set! ((iterator-sequence it) ~A) ~A)~%"
- (cadr set)
- (#(p v cy h e it cp) (caddr set))))
- (else (format *stderr* " (set! (((object->let cp) 'c-type) ~A) ~A)~%"
- (cadr set)
- (#(p v cy h e it cp) (caddr set))))))
- sets)
- (format *stderr* " ~A)~%" (#(p v cy h e it cp) bi)))
- (set! bi (+ bi 1))))
- bases)))))))
+ (for-each
+ (lambda (set)
+ (cond ((and (zero? (car set))
+ (> (cadr set) 2))
+ (format *stderr* " (set-cdr! (list-tail p 2) ~A)~%"
+ (#("p" "(cdr p)" "(cddr p)") (- (cadr set) 3))))
+ ((< (car set) 5)
+ (format *stderr* " (set! (~A ~A) ~A)~%"
+ (#(p v cy h e) (car set))
+ (case (car set)
+ ((0 1) (cadr set))
+ ((2) 0)
+ ((3) (format #f "~W" (cadr set)))
+ ((4) (symbol->keyword (cadr set))))
+ (#(p v cy h e it cp) (caddr set))))
+ ((= (car set) 5)
+ (format *stderr* " (set! ((iterator-sequence it) ~A) ~A)~%"
+ (cadr set)
+ (#(p v cy h e it cp) (caddr set))))
+ (else (format *stderr* " (set! (((object->let cp) 'c-type) ~A) ~A)~%"
+ (cadr set)
+ (#(p v cy h e it cp) (caddr set))))))
+ sets)
+ (format *stderr* " ~A)~%" (#(p v cy h e it cp) bi)))
+ (set! bi (+ bi 1))))
+ bases))))))))
(tester)
diff --git a/tools/valcall.scm b/tools/valcall.scm
index 45b6183..e0c3a3c 100644
--- a/tools/valcall.scm
+++ b/tools/valcall.scm
@@ -20,6 +20,7 @@
("tsort.scm" . "v-sort")
("tlet.scm" . "v-let")
("thash.scm" . "v-hash")
+ ("tmap-hash.scm" . "v-map-hash")
("tgen.scm" . "v-gen")
("tall.scm" . "v-all")
("snd-test.scm" . "v-call")
@@ -51,6 +52,7 @@
("tlamb.scm" . "v-lamb")
("thook.scm" . "v-hook")
("tstar.scm" . "v-star")
+ ("tmv.scm" . "v-mv")
))
(define (last-callg)
@@ -89,7 +91,6 @@
(list "repl" "tmock.scm")
(list "repl" "tvect.scm")
(list "repl" "tauto.scm")
- (list "repl" "timp.scm")
(list "repl" "texit.scm")
(list "repl" "s7test.scm")
(list "repl" "lt.scm")
@@ -97,8 +98,8 @@
(list "repl" "dup.scm")
(list "repl" "tcopy.scm")
(list "repl" "tread.scm")
- (list "repl" "trclo.scm")
(list "repl" "titer.scm")
+ (list "repl" "trclo.scm")
(list "repl" "tload.scm")
(list "repl" "fbench.scm")
(list "repl" "tmat.scm")
@@ -107,12 +108,12 @@
(list "repl" "teq.scm")
(list "repl" "tio.scm")
(list "repl" "tmac.scm")
+ (list "repl" "tclo.scm")
(list "repl" "tcase.scm")
(list "repl" "tlet.scm")
- (list "repl" "tclo.scm")
(list "repl" "tfft.scm")
- (list "repl" "tstar.scm")
(list "repl" "tmap.scm")
+ (list "repl" "tstar.scm")
(list "repl" "tshoot.scm")
(list "repl" "tform.scm")
(list "repl" "concordance.scm")
@@ -123,11 +124,14 @@
(list "repl" "tset.scm")
(list "repl" "trec.scm")
(list "repl" "tleft.scm")
+ (list "repl" "tmisc.scm")
(list "repl" "tlamb.scm")
(list "repl" "tgc.scm")
- (list "repl" "tmisc.scm")
(list "repl" "thash.scm")
(list "repl" "cb.scm")
+ (list "repl" "tmap-hash.scm")
+ (list "repl" "timp.scm")
+ (list "repl" "tmv.scm")
(list "snd -noinit" "tgen.scm") ; repl here + cload sndlib was slower
(list "snd -noinit" "tall.scm")
(list "snd -l" "snd-test.scm")
diff --git a/write.scm b/write.scm
index f5833f5..20cdad5 100644
--- a/write.scm
+++ b/write.scm
@@ -399,7 +399,7 @@
(hash-table-set! h 'dynamic-wind (lambda (obj port col) (w-dynwind obj port col "dynamic-wind")))
(hash-table-set! h 'call-with-values (lambda (obj port col) (w-dynwind obj port col "call-with-values")))
(hash-table-set! h #_dynamic-wind (lambda (obj port col) (w-dynwind obj port col "#_dynamic-wind")))
- (hash-table-set! h #_call-with-values (lambda (obj port col) (w-dynwind obj port col "#_call-with-values")))
+ ;(hash-table-set! h #_call-with-values (lambda (obj port col) (w-dynwind obj port col "#_call-with-values")))
;; -------- lambda etc
(define (w-lambda obj port column str)
diff --git a/xm-enved.scm b/xm-enved.scm
index 1bd2b36..65ceed1 100644
--- a/xm-enved.scm
+++ b/xm-enved.scm
@@ -10,13 +10,23 @@
(load "snd-motif.scm"))
(define xe-envelope
- (dilambda
- (lambda (editor)
- (or (car editor)
- (map (editor 3) '(0 1 2 3)))) ; bounds
- (lambda (editor new-env)
- (set! (editor 0) new-env)
- (xe-redraw editor))))
+ (let ((check-x (lambda (coords) ; make sure time marches forward (8-Feb-24)
+ (if (not (pair? coords))
+ coords
+ (let ((x0 (car coords)))
+ (do ((x (cddr coords) (cddr x)))
+ ((null? x) coords)
+ (let ((x1 (car x)))
+ (if (<= x1 x0)
+ (set-car! x (+ x0 1.0e-8)))
+ (set! x0 (car x)))))))))
+ (dilambda
+ (lambda (editor)
+ (or (check-x (car editor))
+ (map (editor 3) '(0 1 2 3)))) ; bounds
+ (lambda (editor new-env)
+ (set! (editor 0) new-env)
+ (xe-redraw editor)))))
(define xe-create-enved
(let ((xe-ungrfy (lambda (editor y)