shithub: sl

Download patch

ref: 1087dc1c5655914ea33507733bff7bd4535597e2
parent: 2541b6d5353b03df793fabfe1a51ad2fe484ee75
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Mon Apr 7 01:12:43 EDT 2025

(return): void

Fixes: https://todo.sr.ht/~ft/sl/54

--- a/boot/sl.boot
+++ b/boot/sl.boot
@@ -193,15 +193,15 @@
   box-vars compile-in ret values #fn(fn) encode-byte-code const-to-idx-vec) compile-f-)
             compile-if #fn("n420502050205083T718351728351B3;0738351@30q8;DC=07401828<64:8;J=07401828=64:7401q8;89554750268953475027885347401828<544823<07502852@;0750298:53475027895347401828=544750278:63:" #(#fn(gensym)
   caddr cdddr cadddr compile-in emit brn label ret jmp) compile-if)
-            compile-in #fn("\x8740005000W4000J60q?4483R3<0700183D64:83H3\x97083EC:07102262:83KC:07102362:83DC:07102462:83J:07102562:7683513:07102762:7883513<0710298363:7102:8363:83<2;C<07<0183=63:83<RS;JD0483<Z;J;047=83<1523=07>01828364:83<892?CS07@83T513>07A018283T64:7102:83T63:892BC=07C01828364:892DC>07E018283=64:892FC;07G018363:892HCD07I2J183>22K01>262:892LC@07M018283=8465:892NC>07O018283=64:892PCE07Q0183T2D7R8351P64:892SCE07A01D83T5447102T62:892UC\x91083T7V7R8351518;<<8;=8:R360q@807W2X5148<3Y07Y8:8<8=<B;3F048=<<2HQ;3:047Z8=<5153@30q47[018:8=<64:892\\Cp07A01q2Hq83Te35447]7^835151360q@807W2_5147A01q7^83515447102\\62:7>01828364:" #(compile-sym
+            compile-in #fn("\x8740005000W4000J60q?4483R3<0700183D64:83H3\x97083EC:07102262:83KC:07102362:83DC:07102462:83J:07102562:7683513:07102762:7883513<0710298363:7102:8363:83<2;C<07<0183=63:83<RS;JD0483<Z;J;047=83<1523=07>01828364:83<892?CS07@83T513>07A018283T64:7102:83T63:892BC=07C01828364:892DC>07E018283=64:892FC;07G018363:892HCD07I2J183>22K01>262:892LC@07M018283=8465:892NC>07O018283=64:892PCE07Q0183T2D7R8351P64:892SCS07A01D83=B38083T@607T505447102U62:892VC\x91083T7W7R8351518;<<8;=8:R360q@807X2Y5148<3Y07Z8:8<8=<B;3F048=<<2HQ;3:047[8=<5153@30q47\\018:8=<64:892]Cp07A01q2Hq83Te35447^7_835151360q@807X2`5147A01q7_83515447102]62:7>01828364:" #(compile-sym
   emit load0 load1 loadt loadnil void? loadvoid fits-i8 loadi8 loadv aset! compile-aset! in-env?
   compile-app quote self-evaluating? compile-in if compile-if begin compile-begin prog1
   compile-prog1 λ call-with-values #fn("n070AF62:" #(compile-f-))
   #fn("n270A21053413K02223AF>2152470A242515163:q:" #(emit loadv #fn(for-each)
                                                      #fn("n170AF0q64:" #(compile-sym)) closure #fn(length)))
-  and compile-and or compile-or while compile-while cddr return ret set! separate-doc-from-body
-  error "set!: name must be a symbol" sym-set-doc lambda:vars compile-set! trycatch 1arg-lambda?
-  caddr "trycatch: second form must be a 1-argument lambda") compile-in)
+  and compile-and or compile-or while compile-while cddr return void ret set!
+  separate-doc-from-body error "set!: name must be a symbol" sym-set-doc lambda:vars compile-set!
+  trycatch 1arg-lambda? caddr "trycatch: second form must be a 1-argument lambda") compile-in)
             compile-let #fn("n483<83=0r4G88T70018953718;727388518;528:537408=524258=1<521=P7608>827388515440r40r4G8<UMp4E8<L23A082J<0770288<63:q:" #(compile-arglist
   vars-to-env complex-bindings caddr box-vars #fn(nconc) compile-in emit shift) compile-let)
             compile-or #fn("n470018283q21q67:" #(compile-short-circuit brnn) compile-or)
--- a/src/compiler.sl
+++ b/src/compiler.sl
@@ -502,7 +502,9 @@
            (and      (compile-and g env tail? (cdr x) outl))
            (or       (compile-or  g env tail? (cdr x)))
            (while    (compile-while g env (cadr x) (cons 'begin (cddr x))))
-           (return   (compile-in g env T (cadr x))
+           (return   (compile-in g env T (if (cons? (cdr x))
+                                             (cadr x)
+                                             (void)))
                      (emit g 'ret))
            (set!     (let* ((name (cadr x))
                             (doc+value (separate-doc-from-body (cddr x)))
--- a/test/unittest.sl
+++ b/test/unittest.sl
@@ -4,6 +4,14 @@
                                  `(eq? (car e) ',(car what))
                                  T)))))
 
+; (return)
+(def (fr) 1 (return) 0)
+(assert (void? (fr)))
+(def (fr) 1 (return 2) 0)
+(assert (eq? 2 (fr)))
+(def (fr) 1 (return NIL) 0)
+(assert (not (fr)))
+
 (def (every-int n)
   (list (fixnum n) (s8 n) (u8 n) (s16 n) (u16 n) (s32 n) (u32 n)
         (s64 n) (u64 n) (float n) (double n) (bignum n)))
@@ -771,5 +779,3 @@
 
 (assert (equal? '(1 (2 3)) (f (g 3))))
 
-(princ "all tests pass")
-(newline)