diff --git a/lib/c3/0.1/c3.facts b/lib/c3/0.1/c3.facts
index 91a112e..93c1c35 100644
--- a/lib/c3/0.1/c3.facts
+++ b/lib/c3/0.1/c3.facts
@@ -1,7 +1,7 @@
%{module: C3.Facts.Dump,
version: 0x0000000000000001,
count: 0x000000000000000A}
-{C3, :is-a, :module}
+{C3, :is_a, :module}
{C3, :name, "C3"}
{C3, :path, "c3.facts"}
{C3, :symbol, C3.+}
diff --git a/libc3/buf_parse.c b/libc3/buf_parse.c
index 83dba84..ec17510 100644
--- a/libc3/buf_parse.c
+++ b/libc3/buf_parse.c
@@ -187,10 +187,10 @@ sw buf_parse_call_op (s_buf *buf, s_call *dest)
buf_save_init(buf, &save);
left = tag_new();
if ((r = buf_parse_tag(buf, left)) <= 0)
- return r;
+ goto clean;
result += r;
- if ((r = buf_parse_call_op_precedence(buf, dest, left, 0)) < 0)
- return r;
+ if ((r = buf_parse_call_op_rec(buf, dest, left, 0)) < 0)
+ goto restore;
result += r;
r = result;
goto clean;
@@ -201,8 +201,8 @@ sw buf_parse_call_op (s_buf *buf, s_call *dest)
return r;
}
-sw buf_parse_call_op_precedence (s_buf *buf, s_call *dest, s_tag *left,
- u8 min_precedence)
+sw buf_parse_call_op_rec (s_buf *buf, s_call *dest, s_tag *left,
+ u8 min_precedence)
{
s_ident op;
sw r;
diff --git a/libc3/buf_parse.h b/libc3/buf_parse.h
index 579c04c..b6263ea 100644
--- a/libc3/buf_parse.h
+++ b/libc3/buf_parse.h
@@ -48,8 +48,8 @@ sw buf_parse_fn_pattern (s_buf *buf, s_list **dest);
sw buf_parse_call (s_buf *buf, s_call *dest);
sw buf_parse_call_args_paren (s_buf *buf, s_call *dest);
sw buf_parse_call_op (s_buf *buf, s_call *dest);
-sw buf_parse_call_op_precedence (s_buf *buf, s_call *dest, s_tag *left,
- u8 min_precedence);
+sw buf_parse_call_op_rec (s_buf *buf, s_call *dest, s_tag *left,
+ u8 min_precedence);
sw buf_parse_comments (s_buf *buf);
sw buf_parse_integer (s_buf *buf, s_integer *dest);
sw buf_parse_integer_unsigned_bin (s_buf *buf, s_integer *dest);
diff --git a/libc3/env.c b/libc3/env.c
index ab7ccbd..eae4ffd 100644
--- a/libc3/env.c
+++ b/libc3/env.c
@@ -93,7 +93,7 @@ bool env_eval_call (s_env *env, const s_call *call, s_tag *dest)
ident_resolve_module(&c.ident, env);
tag_init_1( &tag_fn, ":fn");
tag_init_ident(&tag_ident, &c.ident);
- tag_init_1( &tag_is_a, ":is-a");
+ tag_init_1( &tag_is_a, ":is_a");
tag_init_1( &tag_macro, ":macro");
tag_init_1( &tag_module, ":module");
tag_init_sym( &tag_module_name, c.ident.module_name);
@@ -486,6 +486,33 @@ s_module * env_module_load (s_env *env, s_module *module,
return module;
}
+s8 env_operator_precedence (const s_env *env, const s_ident *op)
+{
+ s_facts_with_cursor cursor;
+ s_tag tag_ident;
+ s_tag tag_operator_precedence;
+ s_tag tag_var;
+ assert(env);
+ assert(call);
+ assert(dest);
+ ident_resolve_module(op, env);
+ tag_init_ident(&tag_ident, op);
+ tag_init_1( &tag_operator_precedence, ":operator_precedence");
+ tag_init_var( &tag_var);
+ facts_with(&env->facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_operator_precedence, &tag_var,
+ NULL, NULL });
+ if (! facts_with_cursor_next(&cursor))
+ errx(1, "operator %s not found in module %s",
+ op->sym->str.ptr.ps8,
+ op->module_name->str.ptr.ps8);
+ if (tag_var.type.type != TAG_U8)
+ errx(1, "%s.%s: invalid operator_precedence type",
+ op->module_name->str.ptr.ps8,
+ op->sym->str.ptr.ps8);
+ return tag_var.data.u8;
+}
+
void env_pop_error_handler (s_env *env)
{
if (env->error_handler)
diff --git a/libc3/env.h b/libc3/env.h
index 8ebe4c2..48b57b4 100644
--- a/libc3/env.h
+++ b/libc3/env.h
@@ -45,6 +45,8 @@ bool env_eval_progn (s_env *env, const s_list *program,
bool env_eval_tag (s_env *env, const s_tag *tag, s_tag *dest);
s_module * env_module_load (s_env *env, s_module *module,
const s_sym *name, s_facts *facts);
+s8 env_operator_precedence (const s_env *env,
+ const s_ident *op);
/* control structures */
void env_error_f (s_env *env, const char *fmt, ...);
diff --git a/libc3/operator.c b/libc3/operator.c
new file mode 100644
index 0000000..6ee57aa
--- /dev/null
+++ b/libc3/operator.c
@@ -0,0 +1,20 @@
+/* c3
+ * Copyright 2022,2023 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software excepted
+ * on Apple computers granted the above copyright notice and
+ * this permission paragraph are included in all copies and
+ * substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+#include <assert.h>
+#include "types.h"
+
+s8 operator_precedence (const s_ident *op)
+{
+ return env_operator_precedence(&g_c3_env, op);
+}
diff --git a/libc3/operator.h b/libc3/operator.h
new file mode 100644
index 0000000..89a6b65
--- /dev/null
+++ b/libc3/operator.h
@@ -0,0 +1,22 @@
+/* c3
+ * Copyright 2022,2023 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software excepted
+ * on Apple computers granted the above copyright notice and
+ * this permission paragraph are included in all copies and
+ * substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+#ifndef BOOL_H
+#define BOOL_H
+
+#include "types.h"
+
+/* Observers */
+s8 operator_precedence (const s_ident *op);
+
+#endif /* SYM_H */
diff --git a/libc3/sources.mk b/libc3/sources.mk
index 1933266..74fe502 100644
--- a/libc3/sources.mk
+++ b/libc3/sources.mk
@@ -36,6 +36,7 @@ HEADERS = \
list.h \
log.h \
module.h \
+ operator.h \
quote.h \
set__fact.h \
set__tag.h \
@@ -88,6 +89,7 @@ SOURCES = \
list.c \
log.c \
module.c \
+ operator.c \
quote.c \
set__fact.c \
set__tag.c \
@@ -138,6 +140,7 @@ LO_SOURCES = \
list.c \
log.c \
module.c \
+ operator.c \
quote.c \
set__fact.c \
set__tag.c \
diff --git a/libc3/sources.sh b/libc3/sources.sh
index eb2f7de..e3d1cb5 100644
--- a/libc3/sources.sh
+++ b/libc3/sources.sh
@@ -1,4 +1,4 @@
# sources.sh generated by update_sources
-HEADERS='arg.h binding.h bool.h buf.h buf_file.h buf_inspect.h buf_parse.h buf_parse_c.h buf_save.h c3.h c_types.h call.h cfn.h character.h compare.h config.h env.h error.h error_handler.h eval.h fact.h facts.h facts_cursor.h facts_spec.h facts_spec_cursor.h facts_with.h facts_with_cursor.h fn.h frame.h hash.h ident.h integer.h io.h list.h log.h module.h quote.h set__fact.h set__tag.h set_cursor__fact.h set_cursor__tag.h set_item__fact.h set_item__tag.h sha1.h skiplist__fact.h skiplist_node__fact.h str.h sym.h tag.h tuple.h types.h ucd.h '
-SOURCES='arg.c binding.c bool.c buf.c buf_file.c buf_inspect.c buf_parse.c buf_parse_c.c buf_save.c c3.c call.c cfn.c character.c compare.c env.c error.c error_handler.c eval.c fact.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c fn.c frame.c hash.c ident.c integer.c io.c list.c log.c module.c quote.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c skiplist__fact.c skiplist_node__fact.c str.c sym.c tag.c tuple.c ucd.c '
-LO_SOURCES='arg.c binding.c bool.c buf.c buf_file.c buf_inspect.c buf_parse.c buf_parse_c.c buf_save.c c3.c call.c cfn.c character.c compare.c env.c error.c error_handler.c eval.c fact.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c fn.c frame.c hash.c ident.c integer.c io.c list.c log.c module.c quote.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c skiplist__fact.c skiplist_node__fact.c str.c sym.c tag.c tuple.c ucd.c ../libtommath/bn_cutoffs.c ../libtommath/bn_mp_2expt.c ../libtommath/bn_mp_abs.c ../libtommath/bn_mp_add.c ../libtommath/bn_mp_add_d.c ../libtommath/bn_mp_and.c ../libtommath/bn_mp_clamp.c ../libtommath/bn_mp_clear.c ../libtommath/bn_mp_clear_multi.c ../libtommath/bn_mp_cmp.c ../libtommath/bn_mp_cmp_d.c ../libtommath/bn_mp_cmp_mag.c ../libtommath/bn_mp_cnt_lsb.c ../libtommath/bn_mp_complement.c ../libtommath/bn_mp_copy.c ../libtommath/bn_mp_count_bits.c ../libtommath/bn_mp_div.c ../libtommath/bn_mp_div_2.c ../libtommath/bn_mp_div_2d.c ../libtommath/bn_mp_div_3.c ../libtommath/bn_mp_div_d.c ../libtommath/bn_mp_dr_is_modulus.c ../libtommath/bn_mp_dr_reduce.c ../libtommath/bn_mp_dr_setup.c ../libtommath/bn_mp_error_to_string.c ../libtommath/bn_mp_exch.c ../libtommath/bn_mp_exptmod.c ../libtommath/bn_mp_gcd.c ../libtommath/bn_mp_get_i32.c ../libtommath/bn_mp_get_i64.c ../libtommath/bn_mp_get_mag_u32.c ../libtommath/bn_mp_get_mag_u64.c ../libtommath/bn_mp_grow.c ../libtommath/bn_mp_init.c ../libtommath/bn_mp_init_copy.c ../libtommath/bn_mp_init_multi.c ../libtommath/bn_mp_init_size.c ../libtommath/bn_mp_invmod.c ../libtommath/bn_mp_lcm.c ../libtommath/bn_mp_lshd.c ../libtommath/bn_mp_mod.c ../libtommath/bn_mp_mod_2d.c ../libtommath/bn_mp_montgomery_calc_normalization.c ../libtommath/bn_mp_montgomery_reduce.c ../libtommath/bn_mp_montgomery_setup.c ../libtommath/bn_mp_mul.c ../libtommath/bn_mp_mul_2.c ../libtommath/bn_mp_mul_2d.c ../libtommath/bn_mp_mul_d.c ../libtommath/bn_mp_mulmod.c ../libtommath/bn_mp_neg.c ../libtommath/bn_mp_or.c ../libtommath/bn_mp_radix_size.c ../libtommath/bn_mp_reduce.c ../libtommath/bn_mp_reduce_2k.c ../libtommath/bn_mp_reduce_2k_l.c ../libtommath/bn_mp_reduce_2k_setup.c ../libtommath/bn_mp_reduce_2k_setup_l.c ../libtommath/bn_mp_reduce_is_2k.c ../libtommath/bn_mp_reduce_is_2k_l.c ../libtommath/bn_mp_reduce_setup.c ../libtommath/bn_mp_rshd.c ../libtommath/bn_mp_set.c ../libtommath/bn_mp_sqr.c ../libtommath/bn_mp_sqrt.c ../libtommath/bn_mp_sub.c ../libtommath/bn_mp_sub_d.c ../libtommath/bn_mp_xor.c ../libtommath/bn_mp_zero.c ../libtommath/bn_s_mp_add.c ../libtommath/bn_s_mp_balance_mul.c ../libtommath/bn_s_mp_exptmod.c ../libtommath/bn_s_mp_exptmod_fast.c ../libtommath/bn_s_mp_invmod_fast.c ../libtommath/bn_s_mp_invmod_slow.c ../libtommath/bn_s_mp_karatsuba_mul.c ../libtommath/bn_s_mp_karatsuba_sqr.c ../libtommath/bn_s_mp_montgomery_reduce_fast.c ../libtommath/bn_s_mp_mul_digs.c ../libtommath/bn_s_mp_mul_digs_fast.c ../libtommath/bn_s_mp_mul_high_digs.c ../libtommath/bn_s_mp_mul_high_digs_fast.c ../libtommath/bn_s_mp_rand_platform.c ../libtommath/bn_s_mp_sqr.c ../libtommath/bn_s_mp_sqr_fast.c ../libtommath/bn_s_mp_sub.c ../libtommath/bn_s_mp_toom_mul.c ../libtommath/bn_s_mp_toom_sqr.c '
+HEADERS='arg.h binding.h bool.h buf.h buf_file.h buf_inspect.h buf_parse.h buf_parse_c.h buf_save.h c3.h c_types.h call.h cfn.h character.h compare.h config.h env.h error.h error_handler.h eval.h fact.h facts.h facts_cursor.h facts_spec.h facts_spec_cursor.h facts_with.h facts_with_cursor.h fn.h frame.h hash.h ident.h integer.h io.h list.h log.h module.h operator.h quote.h set__fact.h set__tag.h set_cursor__fact.h set_cursor__tag.h set_item__fact.h set_item__tag.h sha1.h skiplist__fact.h skiplist_node__fact.h str.h sym.h tag.h tuple.h types.h ucd.h '
+SOURCES='arg.c binding.c bool.c buf.c buf_file.c buf_inspect.c buf_parse.c buf_parse_c.c buf_save.c c3.c call.c cfn.c character.c compare.c env.c error.c error_handler.c eval.c fact.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c fn.c frame.c hash.c ident.c integer.c io.c list.c log.c module.c operator.c quote.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c skiplist__fact.c skiplist_node__fact.c str.c sym.c tag.c tuple.c ucd.c '
+LO_SOURCES='arg.c binding.c bool.c buf.c buf_file.c buf_inspect.c buf_parse.c buf_parse_c.c buf_save.c c3.c call.c cfn.c character.c compare.c env.c error.c error_handler.c eval.c fact.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c fn.c frame.c hash.c ident.c integer.c io.c list.c log.c module.c operator.c quote.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c skiplist__fact.c skiplist_node__fact.c str.c sym.c tag.c tuple.c ucd.c ../libtommath/bn_cutoffs.c ../libtommath/bn_mp_2expt.c ../libtommath/bn_mp_abs.c ../libtommath/bn_mp_add.c ../libtommath/bn_mp_add_d.c ../libtommath/bn_mp_and.c ../libtommath/bn_mp_clamp.c ../libtommath/bn_mp_clear.c ../libtommath/bn_mp_clear_multi.c ../libtommath/bn_mp_cmp.c ../libtommath/bn_mp_cmp_d.c ../libtommath/bn_mp_cmp_mag.c ../libtommath/bn_mp_cnt_lsb.c ../libtommath/bn_mp_complement.c ../libtommath/bn_mp_copy.c ../libtommath/bn_mp_count_bits.c ../libtommath/bn_mp_div.c ../libtommath/bn_mp_div_2.c ../libtommath/bn_mp_div_2d.c ../libtommath/bn_mp_div_3.c ../libtommath/bn_mp_div_d.c ../libtommath/bn_mp_dr_is_modulus.c ../libtommath/bn_mp_dr_reduce.c ../libtommath/bn_mp_dr_setup.c ../libtommath/bn_mp_error_to_string.c ../libtommath/bn_mp_exch.c ../libtommath/bn_mp_exptmod.c ../libtommath/bn_mp_gcd.c ../libtommath/bn_mp_get_i32.c ../libtommath/bn_mp_get_i64.c ../libtommath/bn_mp_get_mag_u32.c ../libtommath/bn_mp_get_mag_u64.c ../libtommath/bn_mp_grow.c ../libtommath/bn_mp_init.c ../libtommath/bn_mp_init_copy.c ../libtommath/bn_mp_init_multi.c ../libtommath/bn_mp_init_size.c ../libtommath/bn_mp_invmod.c ../libtommath/bn_mp_lcm.c ../libtommath/bn_mp_lshd.c ../libtommath/bn_mp_mod.c ../libtommath/bn_mp_mod_2d.c ../libtommath/bn_mp_montgomery_calc_normalization.c ../libtommath/bn_mp_montgomery_reduce.c ../libtommath/bn_mp_montgomery_setup.c ../libtommath/bn_mp_mul.c ../libtommath/bn_mp_mul_2.c ../libtommath/bn_mp_mul_2d.c ../libtommath/bn_mp_mul_d.c ../libtommath/bn_mp_mulmod.c ../libtommath/bn_mp_neg.c ../libtommath/bn_mp_or.c ../libtommath/bn_mp_radix_size.c ../libtommath/bn_mp_reduce.c ../libtommath/bn_mp_reduce_2k.c ../libtommath/bn_mp_reduce_2k_l.c ../libtommath/bn_mp_reduce_2k_setup.c ../libtommath/bn_mp_reduce_2k_setup_l.c ../libtommath/bn_mp_reduce_is_2k.c ../libtommath/bn_mp_reduce_is_2k_l.c ../libtommath/bn_mp_reduce_setup.c ../libtommath/bn_mp_rshd.c ../libtommath/bn_mp_set.c ../libtommath/bn_mp_sqr.c ../libtommath/bn_mp_sqrt.c ../libtommath/bn_mp_sub.c ../libtommath/bn_mp_sub_d.c ../libtommath/bn_mp_xor.c ../libtommath/bn_mp_zero.c ../libtommath/bn_s_mp_add.c ../libtommath/bn_s_mp_balance_mul.c ../libtommath/bn_s_mp_exptmod.c ../libtommath/bn_s_mp_exptmod_fast.c ../libtommath/bn_s_mp_invmod_fast.c ../libtommath/bn_s_mp_invmod_slow.c ../libtommath/bn_s_mp_karatsuba_mul.c ../libtommath/bn_s_mp_karatsuba_sqr.c ../libtommath/bn_s_mp_montgomery_reduce_fast.c ../libtommath/bn_s_mp_mul_digs.c ../libtommath/bn_s_mp_mul_digs_fast.c ../libtommath/bn_s_mp_mul_high_digs.c ../libtommath/bn_s_mp_mul_high_digs_fast.c ../libtommath/bn_s_mp_rand_platform.c ../libtommath/bn_s_mp_sqr.c ../libtommath/bn_s_mp_sqr_fast.c ../libtommath/bn_s_mp_sub.c ../libtommath/bn_s_mp_toom_mul.c ../libtommath/bn_s_mp_toom_sqr.c '
diff --git a/sources.mk b/sources.mk
index 85e6bb7..e1a5d32 100644
--- a/sources.mk
+++ b/sources.mk
@@ -35,6 +35,7 @@ C3_C_SOURCES = \
ic3/linenoise.c \
libc3/set__tag.c \
libc3/set_item__tag.c \
+ libc3/cfn.c \
libc3/arg.c \
libc3/arg.h \
libc3/skiplist_node__fact.c \
@@ -62,8 +63,8 @@ C3_C_SOURCES = \
libc3/buf_parse_c.c \
libc3/buf_parse_c.h \
libc3/buf_save.c \
- libc3/buf_parse.c \
libc3/buf_parse.h \
+ libc3/compare.c \
libc3/buf_save.h \
libc3/fact.h \
libc3/c_types.h \
@@ -72,9 +73,9 @@ C3_C_SOURCES = \
libc3/bool.h \
libc3/c3.h \
libc3/character.h \
- libc3/compare.c \
libc3/compare.h \
libc3/env.c \
+ libc3/operator.h \
libc3/ident.c \
libc3/error.c \
libc3/error.h \
@@ -91,7 +92,7 @@ C3_C_SOURCES = \
libc3/fn.h \
libc3/types.h \
libc3/call.c \
- libc3/cfn.c \
+ libc3/buf_parse.c \
libc3/facts_cursor.h \
libc3/facts_spec.c \
libc3/frame.h \
@@ -126,6 +127,7 @@ C3_C_SOURCES = \
libc3/set_cursor__fact.h \
libc3/set_cursor__tag.h \
libc3/set.h.in \
+ libc3/operator.c \
libc3/set_cursor.c.in \
libc3/str.h \
libc3/tuple.h \
diff --git a/sources.sh b/sources.sh
index 74566be..d4658e8 100644
--- a/sources.sh
+++ b/sources.sh
@@ -1,4 +1,4 @@
# sources.sh generated by update_sources
C3_CONFIGURES='c3c/configure c3s/configure c3s/update_sources ic3/configure ic3/update_sources libc3/configure libc3/update_sources libtommath/configure libtommath/update_sources test/update_sources test/configure ucd2c/configure '
C3_MAKEFILES='c3c/Makefile c3s/Makefile ic3/Makefile libc3/Makefile libc3/gen.mk libtommath/logs/Makefile libtommath/Makefile test/Makefile ucd2c/Makefile '
-C3_C_SOURCES='c3c/c3c.c c3s/buf_readline.c c3s/c3s.c c3s/buf_readline.h ic3/buf_linenoise.c ic3/ic3.c ic3/buf_linenoise.h ic3/linenoise.c libc3/set__tag.c libc3/set_item__tag.c libc3/arg.c libc3/arg.h libc3/skiplist_node__fact.c libc3/set_cursor__tag.c libc3/binding.c libc3/binding.h libc3/set__tag.h libc3/set_item__tag.h libc3/skiplist_node__fact.h libc3/facts.c libc3/skiplist__fact.c libc3/skiplist__fact.h libc3/set_item__fact.h libc3/facts_with_cursor.c libc3/set_item__fact.c libc3/set__fact.c libc3/set_cursor__fact.c libc3/set__fact.h libc3/buf_file.c libc3/buf_file.h libc3/bool.c libc3/io.h libc3/call.h libc3/io.c libc3/buf_parse_c.c libc3/buf_parse_c.h libc3/buf_save.c libc3/buf_parse.c libc3/buf_parse.h libc3/buf_save.h libc3/fact.h libc3/c_types.h libc3/list.h libc3/buf_inspect.h libc3/bool.h libc3/c3.h libc3/character.h libc3/compare.c libc3/compare.h libc3/env.c libc3/ident.c libc3/error.c libc3/error.h libc3/error_handler.c libc3/buf.c libc3/env.h libc3/frame.c libc3/error_handler.h libc3/eval.c libc3/eval.h libc3/fact.c libc3/facts.h libc3/facts_cursor.c libc3/fn.h libc3/types.h libc3/call.c libc3/cfn.c libc3/facts_cursor.h libc3/facts_spec.c libc3/frame.h libc3/facts_spec.h libc3/facts_spec_cursor.c libc3/hash.c libc3/facts_spec_cursor.h libc3/facts_with.c libc3/facts_with.h libc3/hash.h libc3/buf.h libc3/cfn.h libc3/facts_with_cursor.h libc3/ident.h libc3/str.c libc3/c3.c libc3/integer.c libc3/list.c libc3/log.c libc3/log.h libc3/sym.h libc3/tag.c libc3/module.c libc3/quote.c libc3/quote.h libc3/integer.h libc3/character.c libc3/fn.c libc3/module.h libc3/set.c.in libc3/buf_inspect.c libc3/set_cursor__fact.h libc3/set_cursor__tag.h libc3/set.h.in libc3/set_cursor.c.in libc3/str.h libc3/tuple.h libc3/sym.c libc3/set_cursor.h.in libc3/ucd.c libc3/ucd.h libc3/set_item.c.in libc3/set_item.h.in libc3/sha1.h libc3/skiplist.c.in libc3/skiplist.h.in libc3/skiplist_node.c.in libc3/skiplist_node.h.in libc3/tag.h libc3/tuple.c test/bool_test.c test/buf_file_test.c test/buf_parse_test.c test/character_test.c test/facts_test.c test/buf_inspect_test.c test/test.c test/tag_test.c test/env_test.c test/fact_test.c test/compare_test.h test/fact_test.h test/str_test.c test/list_test.c test/facts_with_test.c test/test.h test/call_test.c test/ident_test.c test/libc3_test.c test/skiplist__fact_test.c test/set__fact_test.c test/set__tag_test.c test/facts_cursor_test.c test/tag_test.h test/sym_test.c test/hash_test.c test/tuple_test.c test/types_test.c test/buf_test.c test/compare_test.c ucd2c/ucd.h ucd2c/ucd2c.c '
+C3_C_SOURCES='c3c/c3c.c c3s/buf_readline.c c3s/c3s.c c3s/buf_readline.h ic3/buf_linenoise.c ic3/ic3.c ic3/buf_linenoise.h ic3/linenoise.c libc3/set__tag.c libc3/set_item__tag.c libc3/cfn.c libc3/arg.c libc3/arg.h libc3/skiplist_node__fact.c libc3/set_cursor__tag.c libc3/binding.c libc3/binding.h libc3/set__tag.h libc3/set_item__tag.h libc3/skiplist_node__fact.h libc3/facts.c libc3/skiplist__fact.c libc3/skiplist__fact.h libc3/set_item__fact.h libc3/facts_with_cursor.c libc3/set_item__fact.c libc3/set__fact.c libc3/set_cursor__fact.c libc3/set__fact.h libc3/buf_file.c libc3/buf_file.h libc3/bool.c libc3/io.h libc3/call.h libc3/io.c libc3/buf_parse_c.c libc3/buf_parse_c.h libc3/buf_save.c libc3/buf_parse.h libc3/compare.c libc3/buf_save.h libc3/fact.h libc3/c_types.h libc3/list.h libc3/buf_inspect.h libc3/bool.h libc3/c3.h libc3/character.h libc3/compare.h libc3/env.c libc3/operator.h libc3/ident.c libc3/error.c libc3/error.h libc3/error_handler.c libc3/buf.c libc3/env.h libc3/frame.c libc3/error_handler.h libc3/eval.c libc3/eval.h libc3/fact.c libc3/facts.h libc3/facts_cursor.c libc3/fn.h libc3/types.h libc3/call.c libc3/buf_parse.c libc3/facts_cursor.h libc3/facts_spec.c libc3/frame.h libc3/facts_spec.h libc3/facts_spec_cursor.c libc3/hash.c libc3/facts_spec_cursor.h libc3/facts_with.c libc3/facts_with.h libc3/hash.h libc3/buf.h libc3/cfn.h libc3/facts_with_cursor.h libc3/ident.h libc3/str.c libc3/c3.c libc3/integer.c libc3/list.c libc3/log.c libc3/log.h libc3/sym.h libc3/tag.c libc3/module.c libc3/quote.c libc3/quote.h libc3/integer.h libc3/character.c libc3/fn.c libc3/module.h libc3/set.c.in libc3/buf_inspect.c libc3/set_cursor__fact.h libc3/set_cursor__tag.h libc3/set.h.in libc3/operator.c libc3/set_cursor.c.in libc3/str.h libc3/tuple.h libc3/sym.c libc3/set_cursor.h.in libc3/ucd.c libc3/ucd.h libc3/set_item.c.in libc3/set_item.h.in libc3/sha1.h libc3/skiplist.c.in libc3/skiplist.h.in libc3/skiplist_node.c.in libc3/skiplist_node.h.in libc3/tag.h libc3/tuple.c test/bool_test.c test/buf_file_test.c test/buf_parse_test.c test/character_test.c test/facts_test.c test/buf_inspect_test.c test/test.c test/tag_test.c test/env_test.c test/fact_test.c test/compare_test.h test/fact_test.h test/str_test.c test/list_test.c test/facts_with_test.c test/test.h test/call_test.c test/ident_test.c test/libc3_test.c test/skiplist__fact_test.c test/set__fact_test.c test/set__tag_test.c test/facts_cursor_test.c test/tag_test.h test/sym_test.c test/hash_test.c test/tuple_test.c test/types_test.c test/buf_test.c test/compare_test.c ucd2c/ucd.h ucd2c/ucd2c.c '