summaryrefslogtreecommitdiffstats
path: root/lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib.c')
-rw-r--r--lib.c38
1 files changed, 26 insertions, 12 deletions
diff --git a/lib.c b/lib.c
index 18764ad7..57ea4128 100644
--- a/lib.c
+++ b/lib.c
@@ -11526,20 +11526,34 @@ val obj_print_impl(val obj, val out, val pretty, struct strm_ctx *ctx)
obj_print_impl(second(obj), out, pretty, ctx);
put_string(lit(".."), out);
obj_print_impl(third(obj), out, pretty, ctx);
- } else if (sym == qref_s && simple_qref_args_p(cdr(obj), zero)) {
- val iter, next;
- for (iter = cdr(obj); iter; iter = next) {
- next = cdr(iter);
- obj_print_impl(car(iter), out, pretty, ctx);
- if (next)
+ } else if ((sym == uref_s || sym == qref_s) &&
+ simple_qref_args_p(cdr(obj), if3(sym == uref_s, zero, one)))
+ {
+ val iter = cdr(obj), next;
+
+ if (sym == uref_s) {
+ if (car(iter) == t) {
+ put_string(lit(".?"), out);
+ iter = cdr(iter);
+ } else {
put_char(chr('.'), out);
- iter = next;
+ }
}
- } else if (sym == uref_s && simple_qref_args_p(cdr(obj), one)) {
- val iter;
- for (iter = cdr(obj); iter; iter = cdr(iter)) {
- put_char(chr('.'), out);
- obj_print_impl(car(iter), out, pretty, ctx);
+
+ for (; iter; iter = next) {
+ val el = car(iter);
+ val qmark = nil;
+ next = cdr(iter);
+ if (next && consp(el) && car(el) == t && consp(cdr(el)) && !cddr(el)) {
+ el = cadr(el);
+ qmark = t;
+ }
+ obj_print_impl(el, out, pretty, ctx);
+ if (next) {
+ put_char(chr('.'), out);
+ if (qmark)
+ put_char(chr('?'), out);
+ }
}
} else if (sym == quasi_s && consp(cdr(obj))) {
put_char(chr('`'), out);