diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2018-04-04 23:41:07 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2018-04-04 23:41:07 -0700 |
commit | 999d8e65b03023d1af7b9d5654c4f0477673d112 (patch) | |
tree | ba3cc7b3f4142ae4a5db005cbb1ec304ca495ac5 /eval.c | |
parent | 3e2af73a078ff12bb847d3f8f61b99d77dc3bf09 (diff) | |
download | txr-999d8e65b03023d1af7b9d5654c4f0477673d112.tar.gz txr-999d8e65b03023d1af7b9d5654c4f0477673d112.tar.bz2 txr-999d8e65b03023d1af7b9d5654c4f0477673d112.zip |
compiler: bugfix: quasilit cannot use append.
append is too generic, and produces nil sometimes. Let's use a
custom run-time support function sys:fmt-join.
* eval.c (fmt_join): New function.
(eval_init): Intern sys:fmt-join.
* share/txr/stdlib/compiler.tl (expand-quasi): Generate a
sys:fmt-join call to combine the pieces rather than append.
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -2717,6 +2717,11 @@ static val fmt_flex(val obj, val plist, struct args *args) return do_format_field(fmt_tostring(obj), n, sep, range_ix, plist, nil); } +static val fmt_join(struct args *args) +{ + return cat_str(args_get_list(args), lit("")); +} + val subst_vars(val forms, val env, val filter) { list_collect_decl(out, iter); @@ -6432,6 +6437,7 @@ void eval_init(void) reg_fun(intern(lit("fmt-simple"), system_package), func_n5(fmt_simple)); reg_fun(intern(lit("fmt-flex"), system_package), func_n2v(fmt_flex)); + reg_fun(intern(lit("fmt-join"), system_package), func_n0v(fmt_join)); reg_varl(user_package_s = intern(lit("user-package"), user_package_var), user_package_var); |