shithub: sl

Download patch

ref: 73ca7a98305c1a1fe6be661a876827da5160f5ec
parent: b0ffe77e8eb8b5928a052bef7b2ec9d6923af4c2
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Sat Apr 12 22:11:31 EDT 2025

defstruct: include field names in the vector instances

--- a/boot/sl.boot
+++ b/boot/sl.boot
@@ -78,7 +78,7 @@
   #fn(get) *properties* :kind *doc-extra* filter #fn("n10<20Q:" #(:doc-fmt))
   #fn("n10<20Q:" #(:doc-see)) princ foldl #fn("n20=161:") newline "See also:" #fn("n1A<0=700=21522263:" #(getprop
   *formals-list* "    ")) "Members:" #fn("n1A<070021522263:" #(getprop *formals-list* "    ")) void
-  "no help for " #fn(str) " " "" " (undefined)"))  defstruct #fn("O10005000*///W1000J7071?14W2000J60D?24W3000J60D?34W4000J60q?44W5000J60D?54z6IIb;228;230>1_5142224?<5147586518=<8==268?5127288?528<8?512912:5285;3E0485DC<02902:52@408583;3\\0483H;3M0483DQ;3:04292;052;J504838BP;J5048382;36040e184;J:042<02=52I222>18F8E848508?>7?H5148>3G07?02@8>2A8HPe15252@30q42B2Ce18D3z02D8D2Ee22F8C2Ee22G2H2I8Fe2e22J2K2EEe32I0e2e3e32L2M2Ee2268F518@Me3e4e3@30qe18E3X02D8E2B1e12B2Ie12N8F5152e12N8A5153e3@30qe12N7O2P8;8B8A8G8D8F0>78@525164:" #(#(:constructor
+  "no help for " #fn(str) " " "" " (undefined)"))  defstruct #fn("O10005000*///W1000J7071?14W2000J60D?24W3000J60D?34W4000J60q?44W5000J60D?54z6IIb;228;230>1_5142224?<5147586518=<8==268?5127288?528<8?512912:5285;3E0485DC<02902:52@408583;3\\0483H;3M0483DQ;3:04292;052;J504838BP;J5048382;36040e184;J:042<02=52I222>18F8E848508?>7?H5148>3G07?02@8>2A8HPe15252@30q42B2Ce18D3\x8902D8D2Ee22F8C2Ee22G2H2I8Fe2e22J2K2EEe32I0e2e3e32L2M2Ee2268F5112NC708@@80r28@i2Me3e4e3@30qe18E3j02D8E2B1e12B2Ie12O8F5152e12O12NC708A@;07P2Qq8A535153e3@30qe12O7R2S8;8B8A8G18D8F0>88@525164:" #(#(:constructor
   2 :predicate 4 NIL NIL :type 0 :named 1 :conc-name 3 NIL NIL) vec #0#
   #fn("n17005121220A>28552485:" #(cddr #fn(for-each)
                                   #fn("n17002152340q:722324A<25F2605661:" #(member (:read-only)
@@ -89,9 +89,10 @@
   #fn(map) #fn("n10B3500<:0:") #fn(sym) #\? "make-" #fn(str) "-" #fn("n12002152853=0220E8553@300853<02208552@40232486252627e1A78C60q@7029Ae2F360q@702:Fe292360q@802;92e2933;02<93e2@30q94S;J80494DQS;39042=94e29596P578764:" #(#fn(str-find)
   "\n\n" #fn(str-sub) "" #fn(str) "\n\n    " #fn(append) defstruct vec :type :named :constructor
   :conc-name :predicate) fmt) sym-set-doc #fn(append) :doc-fmt #fn(nconc) begin def s and or not
-  quote eq? aref = length #fn(copy-list) map-int #fn("n1A<70F0525170920522193865222872324Ie2e3943?0259423e2e2@30q262724e228232995510Me37:2;85523O02<2=2>2?86e22@2?96e22Ae6e2@B02B232995510M24e4e4e4:" #(list-ref
-  #fn(sym) def s v assert if void? aref #fn(length) member :read-only error str "slot " quote " in struct "
-  " is :read-only" aset!))))  bcode:ctable #fn("n1200Ke3:" #(aref))  with-output-to #fn("z12021e1220e2e1e12315163:" #(#fn(nconc)
+  quote eq? aref = length list #fn(copy-list) foldr #fn("n2202105201PP:" #(#fn(sym) ":")) map-int
+  #fn("n1A<70F052517092052219386529422C600@90r20i2KM23872425Ie2e3953?0269524e2e2@30q272825e229242:965188Me37;2<85523O02=2>2?2@86e22A2@97e22Be6e2@C02C242:965188M25e4e4e4:" #(list-ref
+  #fn(sym) list def s v assert if void? aref #fn(length) member :read-only error str "slot " quote
+  " in struct " " is :read-only" aset!))))  bcode:ctable #fn("n1200Ke3:" #(aref))  with-output-to #fn("z12021e1220e2e1e12315163:" #(#fn(nconc)
   with-bindings *io-out* #fn(copy-list)))  catch #fn("n22012122e123242522e2262722e22829e2e3262:22e20e3e42;22e22<22e2e4e3e3:" #(trycatch
   λ #:g429 if and cons? eq? car quote thrown-value cadr caddr raise))  let* #fn("z10H3E02021e1qe12215153e1:2021e173051e1e1220=B3H02024e10=e12215153e1@301515375051e2:" #(#fn(nconc)
   λ #fn(copy-list) caar let* cadar))  letrec #fn("z1202021e12273052e122240522515154e1227605262:" #(#fn(nconc)
--- a/src/system.sl
+++ b/src/system.sl
@@ -1168,21 +1168,30 @@
       ,(when is? `(def (,is? s)
                     (and [,type? s]
                          [or (not ',named) (eq? (aref s 0) ',name)]
-                         [= (length s) ,(+ (length named) num-slots)])))
+                         [= (length s) ,(+ (length named) (if (eq? type 'list)
+                                                              num-slots
+                                                              (* 2 num-slots)))])))
       ; constructor
       ,(when constructor `(def ,constructor
-                            (,type ',@named ,@slots-car)))
+                            (,type
+                              ',@named
+                              ,@(if (eq? type 'list)
+                                    slots-car
+                                    (foldr (λ (s z) (cons (sym ":" s) (cons s z)))
+                                           NIL
+                                           slots-car)))))
       ; accessor per slot
       ,@(map-int (λ (i) [let* {[opts (slot-opts (list-ref slots-kw i))]
                                [fld (list-ref slots-car i)]
-                               [fun (sym access fld)]}
+                               [fun (sym access fld)]
+                               [iv (if (eq? type 'list) i (+ (* 2 i) 1))]}
                           `(def (,fun s (v #.(void)))
                              ,(when is? `(assert (,is? s)))
                              (if (void? v)
-                                 (aref s ,[+ (length named) i])
+                                 (aref s ,[+ (length named) iv])
                                  ,(if (member :read-only opts)
                                       `(error (str "slot " ',fld " in struct " ',name " is :read-only"))
-                                      `(aset! s ,[+ (length named) i] v))))])
+                                      `(aset! s ,[+ (length named) iv] v))))])
                  num-slots))))
 
 (doc-for (defstruct name