diff options
author | IOhannes m zmölnig <zmoelnig@umlautT.umlaeute.mur.at> | 2024-03-18 14:29:52 +0100 |
---|---|---|
committer | IOhannes m zmölnig <zmoelnig@umlautT.umlaeute.mur.at> | 2024-03-18 14:29:52 +0100 |
commit | 0b463bd347a2f0bf5a6980a03b4070d48a62860d (patch) | |
tree | fe1683c3adeff7eedf4885ae82c1994eae9c0796 | |
parent | 780055c393aadacd178cee2222ed9cb06e79f7d7 (diff) |
New upstream version 24.2
-rw-r--r-- | HISTORY.Snd | 2 | ||||
-rw-r--r-- | NEWS | 9 | ||||
-rw-r--r-- | case.scm | 4 | ||||
-rwxr-xr-x | configure | 20 | ||||
-rw-r--r-- | configure.ac | 4 | ||||
-rw-r--r-- | s7.c | 1673 | ||||
-rw-r--r-- | s7.h | 2 | ||||
-rw-r--r-- | s7test.scm | 1493 | ||||
-rw-r--r-- | snd.h | 6 | ||||
-rw-r--r-- | stuff.scm | 8 | ||||
-rw-r--r-- | tools/auto-tester.scm | 160 | ||||
-rw-r--r-- | tools/compare-calls.scm | 2 | ||||
-rw-r--r-- | tools/t101.scm | 17 | ||||
-rwxr-xr-x | tools/tests7 | 8 | ||||
-rw-r--r-- | tools/timp.scm | 272 | ||||
-rw-r--r-- | tools/tlet.scm | 18 | ||||
-rw-r--r-- | tools/tmap-hash.scm | 542 | ||||
-rw-r--r-- | tools/tmisc.scm | 70 | ||||
-rw-r--r-- | tools/tmv.scm | 307 | ||||
-rw-r--r-- | tools/tread.scm | 200 | ||||
-rw-r--r-- | tools/valcall.scm | 14 | ||||
-rw-r--r-- | write.scm | 2 | ||||
-rw-r--r-- | xm-enved.scm | 24 |
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. @@ -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 @@ -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) @@ -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 @@ -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 */ @@ -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 @@ -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) @@ -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 @@ -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") @@ -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) |