summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c20
1 files changed, 18 insertions, 2 deletions
diff --git a/lib.c b/lib.c
index c443d9b6..dd599d22 100644
--- a/lib.c
+++ b/lib.c
@@ -9514,6 +9514,15 @@ INLINE int circle_print_eligible(val obj)
return is_ptr(obj) && (!symbolp(obj) || !symbol_package(obj));
}
+static int unquote_star_check(val obj, val pretty)
+{
+ if (!obj || !symbolp(obj))
+ return 0;
+ if (car(obj->s.name) != chr('*'))
+ return 0;
+ return pretty || symbol_present(cur_package, obj);
+}
+
val obj_print_impl(val obj, val out, val pretty, struct strm_ctx *ctx)
{
val ret = obj;
@@ -9556,7 +9565,10 @@ val obj_print_impl(val obj, val out, val pretty, struct strm_ctx *ctx)
put_char(chr('^'), out);
obj_print_impl(second(obj), out, pretty, ctx);
} else if (sym == sys_unquote_s && two_elem) {
+ val arg = second(obj);
put_char(chr(','), out);
+ if (unquote_star_check(arg, pretty))
+ put_char(chr(' '), out);
obj_print_impl(second(obj), out, pretty, ctx);
} else if (sym == sys_splice_s && two_elem) {
put_string(lit(",*"), out);
@@ -9660,10 +9672,14 @@ val obj_print_impl(val obj, val out, val pretty, struct strm_ctx *ctx)
unq = lit(". ,*");
if (unq) {
- d = cdr(iter);
+ val d = cdr(iter);
+ val ad = car(d);
+
if (consp(d) && !cdr(d)) {
put_string(unq, out);
- obj_print_impl(car(d), out, pretty, ctx);
+ if (a == sys_unquote_s && unquote_star_check(ad, pretty))
+ put_char(chr(' '), out);
+ obj_print_impl(ad, out, pretty, ctx);
put_char(closepar, out);
break;
}