shithub: sl

Download patch

ref: 5f4222d94139033dcb4fff025ed647dfb14a50c3
parent: d45ce3691d4cb85aa9c047b5e498a9aa601dcd94
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Tue Mar 25 00:15:51 EDT 2025

help: print "see also"

--- a/boot/sl.boot
+++ b/boot/sl.boot
@@ -49,21 +49,22 @@
   (:doc-group . builtin))  io? ((:doc-group . io))  eof-object? ((:doc-group . io))  list ((:doc-group . builtin))  apply ((:doc-group . builtin))  help ((:doc-group . doc))  rand-u32 ((:doc-group . rand))  = ((:doc-group . compare)
   (:doc-group . builtin))  rand-u64 ((:doc-group . rand))  not ((:doc-group . builtin))  NIL ((:doc-see . T))  set-cdr! ((:doc-group . list)
   (:doc-group . builtin))  separate-doc-from-body ((:doc-group . doc))  fn? ((:doc-group . builtin))  help-print-header ((:doc-group . doc))  lz-pack ((:doc-group . compress))  arg-counts ((:doc-group . builtin))  eq? ((:doc-group . compare)
-  (:doc-group . builtin))  getprop ((:doc-group . prop))  vm-stats ((:doc-group . vm))  * ((:doc-group . builtin))  putprop ((:doc-group . prop))  io->str ((:doc-group . io))))
+  (:doc-group . builtin))  getprop ((:doc-group . prop) (:doc-see . putprop))  vm-stats ((:doc-group . vm))  * ((:doc-group . builtin))  putprop ((:doc-group . prop)
+  (:doc-see . getprop))  io->str ((:doc-group . io))))
             *syntax-environment* #table(bcode:nconst #fn("n1200r2e3:" #(aref))  doc-for #fn("z10B86;35040<;J404086;35040=70151<863I0212287e22289e22288e2e4:212287e22289e2e3:" #(separate-doc-from-body
   sym-set-doc quote))  with-input-from #fn("z12021e1220e2e1e12315163:" #(#fn(nconc) with-bindings
                                                                          *io-in* #fn(copy-list)))  unless #fn("z1200q211Pe4:" #(if
   begin))  defmacro #fn("z17015186<86=873?0710<870=53@30q42223240<e22526e10=e127885153e3e2:" #(separate-doc-from-body
   sym-set-doc void set-syntax! quote #fn(nconc) λ #fn(copy-list)))  time #fn("n1202122e1e2e123024252622e121e32728e5e3e3:" #(let
-  #:g431 time-now prog1 princ "Elapsed time: " - " seconds" *linefeed*))  cond #fn("z0Ib520852185>1_51485<061:" #(#0=#fn("z0I:" #() void)
+  #:g434 time-now prog1 princ "Elapsed time: " - " seconds" *linefeed*))  cond #fn("z0Ib520852185>1_51485<061:" #(#0=#fn("z0I:" #() void)
   #fn("n10H340q:0<85<20Q;J80485<DQ3C085=J6085<:2185=P:85=J@02285<A<0=51e3:85T23C\x94074758551513c07675855151278685<e2e12886217975855151PA<0=51e4e3:272:85<e2e1282:7585512:e2A<0=51e4e3:2885<2185=PA<0=51e4:" #(else
   begin or => 1arg-lambda? caddr caadr let if cddr #:g19) cond-clauses->if)))  do #fn("z21<2071052207205220230522425268827872829e12:1=51522829e12:82512825e18:52e153e4e3e2e12825e18952e3:" #(#fn(map)
-  car cadr #fn("n170051B38071061:0<:" #(cddr caddr)) letrec #:g403 λ if #fn(nconc) begin #fn(copy-list)))  mark-label #fn("n22002122e21e4:" #(emit
+  car cadr #fn("n170051B38071061:0<:" #(cddr caddr)) letrec #:g406 λ if #fn(nconc) begin #fn(copy-list)))  mark-label #fn("n22002122e21e4:" #(emit
   quote label))  with-bindings #fn("z12071052207205220230522425e12076888653e12720288687535129242:e12715152242:e127202;8688535152e3e164:" #(#fn(map)
   car cadr #fn("n12060:" #(#fn(gensym))) #fn(nconc) let list #fn(copy-list)
   #fn("n22001e3:" #(set!)) unwind-protect begin #fn("n22001e3:" #(set!))))  let #fn("z1q0R3B00?641<?041=?1@30q42021e12223052e124151532225052863C0268687e2e186e3@408788P:" #(#fn(nconc)
   λ #fn(map) #fn("n10B3500<:0:") #fn(copy-list) #fn("n10B3500T:7060:" #(void)) letrec))  bcode:code #fn("n1200Ee3:" #(aref))  make-label #fn("n120e1:" #(gensym))  bcode:cenv #fn("n1200r3e3:" #(aref))  quasiquote #fn("n1700E62:" #(bq-process))  > #fn("z12021e1721510e163:" #(#fn(nconc)
-  < reverse))  when #fn("z1200211Pqe4:" #(if begin))  help #fn("O100010003000W1000J60q?14W2000J7071?24Ib7228723_514024CG0252687>12778295252@\x08013;02:10e3@3007;8829527;882<q531;3<042=2>1520P2?89;J5048:3\x8d082888:2@1544893@07A895147B50@30q413_07B5047A2C5147B504252D8;8<>2277829525247B50@30q47E50@g07A2F13<02G12H52@402I05341JE00R3@00ZJ;07A2J51@30q47B50^1^1^1^1^147E60:" #(#(:print-header
+  < reverse))  when #fn("z1200211Pqe4:" #(if begin))  help #fn("O100010003000W1000J60q?14W2000J7071?24Ib7228723_514024CG0252687>12778295252@H113;02:10e3@3007;8829527;882<q531;3<042=2>1520P2?89;J5048:3\xcd082888:2@1544893@07A895147B50@30q47;882C527D2E8=528>3W07B5047A2F5147B504252G8<>18>5247B50@30q^1^1413_07B5047A2H5147B504252I8;8<>2277829525247B50@30q47J50@g07A2K13<02L12M52@402N05341JE00R3@00ZJ;07A2O51@30q47B50^1^1^1^1^147J60:" #(#(:print-header
   0) help-print-header #0# #fn("n12002152853;0220E8563:0:" #(#fn(str-find) "\n" #fn(str-sub)) first-line)
   groups #fn(for-each) #fn("n20B3\\00<20CU00T21CN0727305124A<7502652515347760:q:" #(doc group princ
                                                                                     caddr ": "
@@ -70,9 +71,13 @@
                                                                                     getprop *doc*
                                                                                     newline))
   #fn(get) *properties* *doc* doc getprop *formals-list* #fn(sym) ":doc-" #fn("n313?02021820>2162:72504738251474061:" #(#fn(for-each)
-  #fn("n17050471A51472F0P61:" #(newline princ print)) newline princ print)) :kind princ newline "Members:"
-  #fn("n20H3P070A7102252523A0F071023q532463:q:" #(member getprop *doc-extra* *formals-list* "    "))
-  void "no help for " #fn(str) " " "" " (undefined)"))  defstruct #fn("O10005000*///W1000J7071?14W2000J60D?24W3000J60D?34W4000J60q?44W5000J60q?54z6IIb;228;230>1_5142224?<5147586518=<8==268?5127288?528<8?512912:5285;J:042902:5283;3\\0483H;3M0483DQ;3:04292;052;J504838BP;J5048382;36040e184;J:042<02=528>3<07>08>52@30q42?2@e12A8D2Be22C8C2Be22D2E2F8Fe2e22G2H2BEe32F0e2e3e32I2J2Be2268F518@Me3e4e3e18E3X02A8E2?1e12?2Fe12K8F5152e12K8A5153e3@30qe12K7L2M8;8B8A8G8D8F0>78@525164:" #(#(NIL
+  #fn("n17050471A51472F0P61:" #(newline princ print)) newline princ print)) :kind princ newline
+  *doc-extra* filter #fn("n10<20Q:" #(:doc-see)) "See also:" #fn("n1A0=700=21q532263:" #(getprop
+  *formals-list* "    ")) "Members:" #fn("n20H3P070A7102252523A0F071023q532463:q:" #(member getprop
+                                                                                     *doc-extra*
+                                                                                     *formals-list*
+                                                                                     "    ")) void
+  "no help for " #fn(str) " " "" " (undefined)"))  defstruct #fn("O10005000*///W1000J7071?14W2000J60D?24W3000J60D?34W4000J60q?44W5000J60q?54z6IIb;228;230>1_5142224?<5147586518=<8==268?5127288?528<8?512912:5285;J:042902:5283;3\\0483H;3M0483DQ;3:04292;052;J504838BP;J5048382;36040e184;J:042<02=528>3<07>08>52@30q42?2@e12A8D2Be22C8C2Be22D2E2F8Fe2e22G2H2BEe32F0e2e3e32I2J2Be2268F518@Me3e4e3e18E3X02A8E2?1e12?2Fe12K8F5152e12K8A5153e3@30qe12K7L2M8;8B8A8G8D8F0>78@525164:" #(#(NIL
   NIL :named 1 :conc-name 3 :type 0 NIL NIL NIL NIL NIL NIL :predicate 4 NIL NIL NIL NIL NIL NIL
   :constructor 2) vec #0# #fn("n17005121220A>28552485:" #(cddr #fn(for-each)
                                                           #fn("n17002152340q:722324A<25F2605661:" #(member
@@ -85,7 +90,7 @@
   #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)
   with-bindings *io-out* #fn(copy-list)))  catch #fn("n22012122e123242522e2262722e22829e2e3262:22e20e3e42;22e22<22e2e4e3e3:" #(trycatch
-  λ #:g426 if and cons? eq? car quote thrown-value cadr caddr raise))  let* #fn("z10H3E02021e1qe12215153e1:2021e173051e1e1220=B3H02024e10=e12215153e1@301515375051e2:" #(#fn(nconc)
+  λ #: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)
   λ #fn(map) car #fn("n12021e12205162:" #(#fn(nconc) set! #fn(copy-list)))
   #fn(copy-list) void))  bcode:sp #fn("n1200r4e3:" #(aref))  bcode:stack #fn("n2200r421220e21e3e4:" #(aset!
@@ -96,7 +101,7 @@
   sym-set-doc list quote doc group))  receive #fn("z22021q1e32221e10e123825153e3:" #(call-with-values
                                                                                      λ #fn(nconc)
                                                                                      #fn(copy-list)))  unwind-protect #fn("n2202122q1e3e2e1232402225e121e12625e2e4e321e1e3e3:" #(let
-  #:g427 λ prog1 trycatch #:g428 raise))  dotimes #fn("z10<0T20E2187Ke32223e186e1e12415153e4:" #(for
+  #:g430 λ prog1 trycatch #:g431 raise))  dotimes #fn("z10<0T20E2187Ke32223e186e1e12415153e4:" #(for
   - #fn(nconc) λ #fn(copy-list)))  throw #fn("n220212223e201e4e2:" #(raise list quote thrown-value)))
             1+ #fn("n10KM:" #() 1+) 1-
             #fn("n10K~:" #() 1-) 1arg-lambda? #fn("n10B;3E04700<51;3:04710TK62:" #(lambda? length=) 1arg-lambda?)
@@ -489,7 +494,7 @@
                                                                                   #fn("n070A51471225061:" #(print-exception
   print-stack-trace #fn(stacktrace))) #fn("n1A50420061:" #(#fn(raise)))) top-level-exception-handler)
             trace #fn("n120051718551Jc02207324252627280e225e3e229e12:2885e225e3e55152@30q^147;60:" #(#fn(top-level-value)
-  traced? #fn(set-top-level-value!) eval λ #:g429 write cons quote newline apply void) trace)
+  traced? #fn(set-top-level-value!) eval λ #:g432 write cons quote newline apply void) trace)
             traced? #fn("n170051;3>042105121A51d:" #(closure? #fn(fn-code)) #(#fn("z020210P51472504230}2:" #(#fn(write)
   x newline #.apply))))
             untrace #fn("n1200517185513C0220238551r3G52@30q^147460:" #(#fn(top-level-value) traced?
--- a/src/system.sl
+++ b/src/system.sl
@@ -110,6 +110,7 @@
 (def (putprop symbol key val)
   "Associate a property value with the symbol."
   :doc-group prop
+  :doc-see getprop
   (let ((kt (get *properties* key NIL)))
     (unless kt
         (let ((ta (table)))
@@ -122,6 +123,7 @@
   "Return a property value associated with the symbol or `def` if
    missing."
   :doc-group prop
+  :doc-see putprop
   (let ((kt (get *properties* key NIL)))
     (or (and kt (get kt symbol def)) def)))
 
@@ -243,6 +245,15 @@
                    (when doc
                      (princ doc)
                      (newline))
+                   (let* {[extra (getprop docterm '*doc-extra*)]
+                          [see (filter (λ (v) (eq? (car v) :doc-see)) extra)]}
+                     (when see
+                       (newline)
+                       (princ "See also:")
+                       (newline)
+                       (for-each (λ (v) (print-sig (cdr v) [getprop (cdr v) '*formals-list* NIL] "    "))
+                                 see)
+                       (newline)))
                    (when kind
                      (newline)
                      (princ "Members:")