ref: 1b6ccc7c82c2700ef8c98e97bf1f231850f51c10
parent: 8cbff5917e6bd61564716b10062219aa0f3f83e3
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Apr 24 22:41:59 EDT 2025
*print-length*: fix misbehavior Fixes: https://todo.sr.ht/~ft/sl/72
--- a/src/print.c
+++ b/src/print.c
@@ -317,7 +317,7 @@
int n_unindented = 1;
while(1){
cd = cdr_(v);
- if(sl.print_length >= 0 && n >= sl.print_length && cd != sl_nil){
+ if(sl.print_length >= 0 && n >= sl.print_length){
outsc(f, "...)");
break;
}
@@ -494,14 +494,11 @@
if(!sl.print_princ && print_circle_prefix(f, v))
break;
if(isvec(v)){
- if(isstruct(v))
- outs(f, "#S(");
- else
- outs(f, "#(");
+ outs(f, isstruct(v) ? "#S(" : "#(");
int newindent = sl.hpos, est;
int i, sz = vec_size(v);
for(i = 0; i < sz; i++){
- if(sl.print_length >= 0 && i >= sl.print_length && i < sz-1){
+ if(sl.print_length >= 0 && i >= sl.print_length){
outsc(f, "...");
break;
}
--- a/test/unittest.sl
+++ b/test/unittest.sl
@@ -624,10 +624,27 @@
(with-output-to b (for-each print "йцукен"))
(assert (equal? (io->str b) "#\\й#\\ц#\\у#\\к#\\е#\\н")))
-(let ((b (buffer)))
+(let {[b (buffer)]}
(write "a\x0a\x09\\\x07\x08\x1b\x0c\x0d\x0b" b)
(assert (equal? (io->str b) «"a\n\t\\\a\b\e\f\r\v"»)))
+(defmacro (print-with-length n . args)
+ `(with-bindings ((*print-length* ,n))
+ (print-to-str ,@args)))
+
+(assert (equal? (print-with-length 2 '(1)) "(1)"))
+(assert (equal? (print-with-length 2 '(1 2)) "(1 2)"))
+(assert (equal? (print-with-length 2 '(1 2 3)) "(1 2 ...)"))
+(assert (equal? (print-with-length 2 '(1 2 3 4)) "(1 2 ...)"))
+(assert (equal? (print-with-length 2 #(1)) "#(1)"))
+(assert (equal? (print-with-length 2 #(1 2)) "#(1 2)"))
+(assert (equal? (print-with-length 2 #(1 2 3)) "#(1 2 ...)"))
+(assert (equal? (print-with-length 2 #(1 2 3 4)) "#(1 2 ...)"))
+(assert (equal? (print-with-length 2 (arr 'u8 1)) "#vu8(1)"))
+(assert (equal? (print-with-length 2 (arr 'u8 1 2)) "#vu8(1 2)"))
+(assert (equal? (print-with-length 2 (arr 'u8 1 2 3)) "#vu8(1 2 ...)"))
+(assert (equal? (print-with-length 2 (arr 'u8 1 2 3 4)) "#vu8(1 2 ...)"))
+
(assert (= 10 (str-width s)))
(assert (= 0 (str-width "")))
(assert (= 1 (str-width #\q)))
@@ -811,9 +828,12 @@
(assert-fail (table 1))
(assert-fail (table 1 2 3))
(def ta (table 1 2 "3" 4 'foo 'bar))
-(let ((b (buffer)))
- (write ta b)
- (assert (equal? (io->str b) "#table(1 2 \"3\" 4 foo bar)")))
+(def (with-output-to-str nada thunk)
+ (let ((b (buffer)))
+ (with-output-to b (thunk))
+ (io->str b)))
+(assert (equal? (with-output-to-str NIL (λ () (write ta)))
+ "#table(1 2 \"3\" 4 foo bar)"))
(assert (table? ta))
(assert (not (table? "nope")))
(assert-fail (get ta 3))