Artifact aa5a71c7ff76eab457a086da6c6bd771b34f243f:


0000: 3b 3b 20 43 6f 70 79 72 69 67 68 74 20 32 30 30  ;; Copyright 200
0010: 37 2d 32 30 31 31 2c 20 4d 61 74 74 68 65 77 20  7-2011, Matthew 
0020: 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20 0a 3b 3b 20  Welland..;; .;; 
0030: 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73   This program is
0040: 20 6d 61 64 65 20 61 76 61 69 6c 61 62 6c 65 20   made available 
0050: 75 6e 64 65 72 20 74 68 65 20 47 4e 55 20 47 50  under the GNU GP
0060: 4c 20 76 65 72 73 69 6f 6e 20 32 2e 30 20 6f 72  L version 2.0 or
0070: 0a 3b 3b 20 20 67 72 65 61 74 65 72 2e 20 53 65  .;;  greater. Se
0080: 65 20 74 68 65 20 61 63 63 6f 6d 70 61 6e 79 69  e the accompanyi
0090: 6e 67 20 66 69 6c 65 20 43 4f 50 59 49 4e 47 20  ng file COPYING 
00a0: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 3b 3b 20  for details..;; 
00b0: 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72 61  .;;  This progra
00c0: 6d 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64  m is distributed
00d0: 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41 52   WITHOUT ANY WAR
00e0: 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 65  RANTY; without e
00f0: 76 65 6e 20 74 68 65 0a 3b 3b 20 20 69 6d 70 6c  ven the.;;  impl
0100: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 20  ied warranty of 
0110: 4d 45 52 43 48 41 4e 54 41 42 49 4c 49 54 59 20  MERCHANTABILITY 
0120: 6f 72 20 46 49 54 4e 45 53 53 20 46 4f 52 20 41  or FITNESS FOR A
0130: 20 50 41 52 54 49 43 55 4c 41 52 0a 3b 3b 20 20   PARTICULAR.;;  
0140: 50 55 52 50 4f 53 45 2e 0a 0a 3b 3b 20 73 74 6d  PURPOSE...;; stm
0150: 6c 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 68  l is a list of h
0160: 74 6d 6c 20 73 74 72 69 6e 67 73 0a 0a 28 64 65  tml strings..(de
0170: 63 6c 61 72 65 20 28 75 6e 69 74 20 73 74 6d 6c  clare (unit stml
0180: 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73 65  )).(declare (use
0190: 73 20 6d 69 73 63 2d 73 74 6d 6c 29 29 0a 28 72  s misc-stml)).(r
01a0: 65 71 75 69 72 65 2d 65 78 74 65 6e 73 69 6f 6e  equire-extension
01b0: 20 72 65 67 65 78 29 0a 0a 3b 3b 20 65 78 74 72   regex)..;; extr
01c0: 61 63 74 20 76 61 72 69 6f 75 73 20 74 6f 6b 65  act various toke
01d0: 6e 73 20 66 72 6f 6d 20 74 68 65 20 70 61 72 61  ns from the para
01e0: 6d 65 74 65 72 20 6c 69 73 74 0a 3b 3b 20 20 20  meter list.;;   
01f0: 27 6b 65 79 20 76 61 6c 20 3d 3e 20 70 75 74 20  'key val => put 
0200: 69 6e 20 74 68 65 20 70 61 72 61 6d 73 20 6c 69  in the params li
0210: 73 74 0a 3b 3b 20 20 20 73 74 72 69 6e 67 73 20  st.;;   strings 
0220: 20 3d 3e 20 6d 61 69 6e 74 61 69 6e 20 6f 72 64   => maintain ord
0230: 65 72 20 61 6e 64 20 61 64 64 20 74 6f 20 74 68  er and add to th
0240: 65 20 64 61 74 61 6c 69 73 74 20 3c 3c 3d 3d 20  e datalist <<== 
0250: 49 4d 50 4f 52 54 41 4e 54 0a 28 64 65 66 69 6e  IMPORTANT.(defin
0260: 65 20 28 73 3a 65 78 74 72 61 63 74 20 69 6e 6c  e (s:extract inl
0270: 73 74 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f  st).  (if (null?
0280: 20 69 6e 6c 73 74 29 20 69 6e 6c 73 74 0a 20 20   inlst) inlst.  
0290: 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28      (let loop ((
02a0: 64 61 74 61 20 27 28 29 29 0a 20 20 20 20 20 20  data '()).      
02b0: 20 20 20 20 20 20 20 20 20 20 20 28 70 61 72 61             (para
02c0: 6d 73 20 27 28 29 29 0a 20 20 20 20 20 20 20 20  ms '()).        
02d0: 20 20 20 20 20 20 20 20 20 28 68 65 61 64 20 28           (head (
02e0: 63 61 72 20 69 6e 6c 73 74 29 29 0a 20 20 20 20  car inlst)).    
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 74 61               (ta
0300: 69 6c 20 28 63 64 72 20 69 6e 6c 73 74 29 29 29  il (cdr inlst)))
0310: 0a 20 20 20 20 20 20 20 20 3b 3b 20 28 70 72 69  .        ;; (pri
0320: 6e 74 20 22 68 65 61 64 3d 22 20 68 65 61 64 20  nt "head=" head 
0330: 22 20 74 61 69 6c 3d 22 20 74 61 69 6c 29 0a 20  " tail=" tail). 
0340: 20 20 20 20 20 20 20 28 63 6f 6e 64 20 0a 20 20         (cond .  
0350: 20 20 20 20 20 20 20 28 28 6e 75 6c 6c 3f 20 74         ((null? t
0360: 61 69 6c 29 0a 20 20 20 20 20 20 20 20 20 20 28  ail).          (
0370: 69 66 20 28 73 79 6d 62 6f 6c 3f 20 68 65 61 64  if (symbol? head
0380: 29 20 3b 3b 20 74 68 65 20 6c 61 73 74 20 69 74  ) ;; the last it
0390: 65 6d 20 69 73 20 61 20 70 61 72 61 6d 20 2d 20  em is a param - 
03a0: 62 6f 72 6b 65 64 0a 20 20 20 20 20 20 20 20 20  borked.         
03b0: 20 20 20 20 20 28 73 3a 6c 6f 67 20 22 45 52 52       (s:log "ERR
03c0: 4f 52 3a 20 70 61 72 61 6d 20 77 69 74 68 20 6e  OR: param with n
03d0: 6f 20 76 61 6c 75 65 22 29 29 0a 20 20 20 20 20  o value")).     
03e0: 20 20 20 20 20 28 6c 69 73 74 20 28 61 70 70 65       (list (appe
03f0: 6e 64 20 64 61 74 61 20 28 6c 69 73 74 20 28 73  nd data (list (s
0400: 3a 61 6e 79 2d 3e 73 74 72 69 6e 67 20 68 65 61  :any->string hea
0410: 64 29 29 29 20 70 61 72 61 6d 73 29 29 0a 20 20  d))) params)).  
0420: 20 20 20 20 20 20 20 28 28 6f 72 20 28 73 74 72         ((or (str
0430: 69 6e 67 3f 20 68 65 61 64 29 28 6c 69 73 74 3f  ing? head)(list?
0440: 20 68 65 61 64 29 28 6e 75 6d 62 65 72 3f 20 68   head)(number? h
0450: 65 61 64 29 29 0a 20 20 20 20 20 20 20 20 20 20  ead)).          
0460: 28 6c 6f 6f 70 20 28 61 70 70 65 6e 64 20 64 61  (loop (append da
0470: 74 61 20 28 6c 69 73 74 20 20 28 73 3a 61 6e 79  ta (list  (s:any
0480: 2d 3e 73 74 72 69 6e 67 20 68 65 61 64 29 29 29  ->string head)))
0490: 20 70 61 72 61 6d 73 20 28 63 61 72 20 74 61 69   params (car tai
04a0: 6c 29 20 20 20 28 63 64 72 20 74 61 69 6c 29 29  l)   (cdr tail))
04b0: 29 0a 20 20 20 20 20 20 20 20 20 28 28 73 79 6d  ).         ((sym
04c0: 62 6f 6c 3f 20 68 65 61 64 29 0a 20 20 20 20 20  bol? head).     
04d0: 20 20 20 20 20 28 6c 65 74 20 28 28 6e 65 77 2d       (let ((new-
04e0: 70 61 72 61 6d 73 20 28 63 6f 6e 73 20 28 6c 69  params (cons (li
04f0: 73 74 20 68 65 61 64 20 28 63 61 72 20 74 61 69  st head (car tai
0500: 6c 29 29 20 70 61 72 61 6d 73 29 29 0a 20 20 20  l)) params)).   
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e 65               (ne
0520: 77 2d 74 61 69 6c 20 20 28 63 64 72 20 74 61 69  w-tail  (cdr tai
0530: 6c 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  l))).           
0540: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6e 65 77 2d   (if (null? new-
0550: 74 61 69 6c 29 20 3b 3b 20 77 65 20 61 72 65 20  tail) ;; we are 
0560: 64 6f 6e 65 2c 20 6e 6f 20 6d 6f 72 65 20 70 61  done, no more pa
0570: 72 61 6d 73 20 65 74 63 2e 0a 20 20 20 20 20 20  rams etc..      
0580: 20 20 20 20 20 20 20 20 20 20 28 6c 69 73 74 20            (list 
0590: 64 61 74 61 20 6e 65 77 2d 70 61 72 61 6d 73 29  data new-params)
05a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
05b0: 20 28 6c 6f 6f 70 20 64 61 74 61 20 6e 65 77 2d   (loop data new-
05c0: 70 61 72 61 6d 73 20 28 63 61 72 20 6e 65 77 2d  params (car new-
05d0: 74 61 69 6c 29 28 63 64 72 20 6e 65 77 2d 74 61  tail)(cdr new-ta
05e0: 69 6c 29 29 29 29 29 0a 20 20 20 20 20 20 20 20  il))))).        
05f0: 20 28 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20   (else.         
0600: 20 28 73 3a 6c 6f 67 20 22 57 41 52 4e 49 4e 47   (s:log "WARNING
0610: 3a 20 4d 61 6c 66 6f 72 6d 65 64 20 69 6e 70 75  : Malformed inpu
0620: 74 2c 20 79 6f 75 20 68 61 76 65 20 62 72 6f 6b  t, you have brok
0630: 65 6e 20 73 74 6d 6c 2c 20 72 65 6d 65 6d 62 65  en stml, remembe
0640: 72 20 74 68 61 74 20 61 6c 6c 20 73 74 6d 6c 20  r that all stml 
0650: 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 72 65 74  calls should ret
0660: 75 72 6e 20 61 20 72 65 73 75 6c 74 20 28 6e 75  urn a result (nu
0670: 6c 6c 20 6c 69 73 74 20 6f 72 20 65 6d 70 74 79  ll list or empty
0680: 20 73 74 72 69 6e 67 20 69 73 20 6f 6b 29 3a 5c   string is ok):\
0690: 6e 20 20 68 65 61 64 3d 22 20 68 65 61 64 20 0a  n  head=" head .
06a0: 09 20 20 20 20 20 20 20 20 20 20 22 5c 6e 20 20  .          "\n  
06b0: 74 61 69 6c 3d 22 20 74 61 69 6c 20 0a 20 20 20  tail=" tail .   
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
06d0: 5c 6e 20 20 69 6e 6c 73 74 3d 22 20 69 6e 6c 73  \n  inlst=" inls
06e0: 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
06f0: 20 20 20 20 20 22 5c 6e 20 20 70 61 72 61 6d 73       "\n  params
0700: 3d 22 20 70 61 72 61 6d 73 29 0a 09 20 20 28 69  =" params)..  (i
0710: 66 20 28 6e 75 6c 6c 3f 20 74 61 69 6c 29 0a 09  f (null? tail)..
0720: 20 20 20 20 20 20 28 6c 69 73 74 20 64 61 74 61        (list data
0730: 20 70 61 72 61 6d 73 29 0a 09 20 20 20 20 20 20   params)..      
0740: 28 6c 6f 6f 70 20 64 61 74 61 20 70 61 72 61 6d  (loop data param
0750: 73 20 28 63 61 72 20 74 61 69 6c 29 28 63 64 72  s (car tail)(cdr
0760: 20 74 61 69 6c 29 29 29 29 29 29 29 29 0a 0a 3b   tail))))))))..;
0770: 3b 20 6d 6f 73 74 20 74 61 67 73 20 63 61 6e 20  ; most tags can 
0780: 62 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68  be handled by th
0790: 69 73 20 72 6f 75 74 69 6e 65 0a 28 64 65 66 69  is routine.(defi
07a0: 6e 65 20 28 73 3a 63 6f 6d 6d 6f 6e 2d 74 61 67  ne (s:common-tag
07b0: 20 74 61 67 6e 61 6d 65 20 61 72 67 73 29 0a 20   tagname args). 
07c0: 20 28 6c 65 74 2a 20 28 28 69 6e 70 75 74 73 20   (let* ((inputs 
07d0: 28 73 3a 65 78 74 72 61 63 74 20 61 72 67 73 29  (s:extract args)
07e0: 29 0a 20 20 20 20 20 20 20 20 20 28 64 61 74 61  ).         (data
07f0: 20 20 20 28 63 61 72 20 69 6e 70 75 74 73 29 29     (car inputs))
0800: 0a 20 20 20 20 20 20 20 20 20 28 70 61 72 61 6d  .         (param
0810: 73 20 28 73 3a 70 72 6f 63 65 73 73 2d 70 61 72  s (s:process-par
0820: 61 6d 73 20 28 63 61 64 72 20 69 6e 70 75 74 73  ams (cadr inputs
0830: 29 29 29 29 0a 20 20 20 20 28 6c 69 73 74 20 28  )))).    (list (
0840: 63 6f 6e 63 20 22 3c 22 20 74 61 67 6e 61 6d 65  conc "<" tagname
0850: 20 70 61 72 61 6d 73 20 22 3e 22 29 0a 20 20 20   params ">").   
0860: 20 20 20 20 20 20 20 64 61 74 61 0a 20 20 20 20         data.    
0870: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 3c 2f 22        (conc "</"
0880: 20 74 61 67 6e 61 6d 65 20 22 3e 22 29 29 29 29   tagname ">"))))
0890: 0a 0a 3b 3b 20 53 75 67 67 65 73 74 69 6f 6e 3a  ..;; Suggestion:
08a0: 20 6f 72 64 65 72 20 74 68 65 73 65 20 61 6c 70   order these alp
08b0: 68 61 62 65 74 69 63 61 6c 6c 79 0a 28 64 65 66  habetically.(def
08c0: 69 6e 65 20 28 73 3a 61 20 20 20 20 20 20 2e 20  ine (s:a      . 
08d0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
08e0: 74 61 67 20 22 41 22 20 20 20 20 20 20 61 72 67  tag "A"      arg
08f0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 62  s)).(define (s:b
0900: 20 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73        . args) (s
0910: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 42 22 20  :common-tag "B" 
0920: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0930: 69 6e 65 20 28 73 3a 75 20 20 20 20 20 20 2e 20  ine (s:u      . 
0940: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0950: 74 61 67 20 22 55 22 20 20 20 20 20 20 61 72 67  tag "U"      arg
0960: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 62  s)).(define (s:b
0970: 69 67 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  ig    . args) (s
0980: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 42 49 47  :common-tag "BIG
0990: 22 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  "    args)).(def
09a0: 69 6e 65 20 28 73 3a 62 6f 64 79 20 20 20 2e 20  ine (s:body   . 
09b0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
09c0: 74 61 67 20 22 42 4f 44 59 22 20 20 20 61 72 67  tag "BODY"   arg
09d0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 62  s)).(define (s:b
09e0: 75 74 74 6f 6e 20 2e 20 61 72 67 73 29 20 28 73  utton . args) (s
09f0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 42 55 54  :common-tag "BUT
0a00: 54 4f 4e 22 20 61 72 67 73 29 29 0a 28 64 65 66  TON" args)).(def
0a10: 69 6e 65 20 28 73 3a 63 65 6e 74 65 72 20 2e 20  ine (s:center . 
0a20: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0a30: 74 61 67 20 22 43 45 4e 54 45 52 22 20 61 72 67  tag "CENTER" arg
0a40: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 63  s)).(define (s:c
0a50: 6f 64 65 20 20 20 2e 20 61 72 67 73 29 20 28 73  ode   . args) (s
0a60: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 43 4f 44  :common-tag "COD
0a70: 45 22 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  E"   args)).(def
0a80: 69 6e 65 20 28 73 3a 64 69 76 20 20 20 20 2e 20  ine (s:div    . 
0a90: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0aa0: 74 61 67 20 22 44 49 56 22 20 20 20 20 61 72 67  tag "DIV"    arg
0ab0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0ac0: 31 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  1     . args) (s
0ad0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 31 22  :common-tag "H1"
0ae0: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0af0: 69 6e 65 20 28 73 3a 68 32 20 20 20 20 20 2e 20  ine (s:h2     . 
0b00: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0b10: 74 61 67 20 22 48 32 22 20 20 20 20 20 61 72 67  tag "H2"     arg
0b20: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0b30: 33 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  3     . args) (s
0b40: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 33 22  :common-tag "H3"
0b50: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0b60: 69 6e 65 20 28 73 3a 68 34 20 20 20 20 20 2e 20  ine (s:h4     . 
0b70: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0b80: 74 61 67 20 22 48 34 22 20 20 20 20 20 61 72 67  tag "H4"     arg
0b90: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0ba0: 35 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  5     . args) (s
0bb0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 35 22  :common-tag "H5"
0bc0: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0bd0: 69 6e 65 20 28 73 3a 68 65 61 64 20 20 20 2e 20  ine (s:head   . 
0be0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0bf0: 74 61 67 20 22 48 45 41 44 22 20 20 20 61 72 67  tag "HEAD"   arg
0c00: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0c10: 74 6d 6c 20 20 20 2e 20 61 72 67 73 29 20 28 73  tml   . args) (s
0c20: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 54 4d  :common-tag "HTM
0c30: 4c 22 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  L"   args)).(def
0c40: 69 6e 65 20 28 73 3a 69 20 20 20 20 20 20 2e 20  ine (s:i      . 
0c50: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0c60: 74 61 67 20 22 49 22 20 20 20 20 20 20 61 72 67  tag "I"      arg
0c70: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 69  s)).(define (s:i
0c80: 6d 67 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  mg    . args) (s
0c90: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 49 4d 47  :common-tag "IMG
0ca0: 22 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  "    args)).(def
0cb0: 69 6e 65 20 28 73 3a 69 6e 70 75 74 20 20 2e 20  ine (s:input  . 
0cc0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0cd0: 74 61 67 20 22 49 4e 50 55 54 22 20 20 61 72 67  tag "INPUT"  arg
0ce0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 6c  s)).(define (s:l
0cf0: 69 6e 6b 20 20 20 2e 20 61 72 67 73 29 20 28 73  ink   . args) (s
0d00: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 4c 49 4e  :common-tag "LIN
0d10: 4b 22 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  K"   args)).(def
0d20: 69 6e 65 20 28 73 3a 70 20 20 20 20 20 20 2e 20  ine (s:p      . 
0d30: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0d40: 74 61 67 20 22 50 22 20 20 20 20 20 20 61 72 67  tag "P"      arg
0d50: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  s)).(define (s:s
0d60: 74 72 6f 6e 67 20 2e 20 61 72 67 73 29 20 28 73  trong . args) (s
0d70: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 53 54 52  :common-tag "STR
0d80: 4f 4e 47 22 20 61 72 67 73 29 29 0a 28 64 65 66  ONG" args)).(def
0d90: 69 6e 65 20 28 73 3a 74 61 62 6c 65 20 20 2e 20  ine (s:table  . 
0da0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0db0: 74 61 67 20 22 54 41 42 4c 45 22 20 20 61 72 67  tag "TABLE"  arg
0dc0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 74  s)).(define (s:t
0dd0: 62 6f 64 79 20 20 2e 20 61 72 67 73 29 20 28 73  body  . args) (s
0de0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 54 42 4f  :common-tag "TBO
0df0: 44 59 22 20 20 61 72 67 73 29 29 0a 28 64 65 66  DY"  args)).(def
0e00: 69 6e 65 20 28 73 3a 74 68 65 61 64 20 20 2e 20  ine (s:thead  . 
0e10: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0e20: 74 61 67 20 22 54 48 45 41 44 22 20 20 61 72 67  tag "THEAD"  arg
0e30: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 74  s)).(define (s:t
0e40: 68 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  h     . args) (s
0e50: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 54 48 22  :common-tag "TH"
0e60: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0e70: 69 6e 65 20 28 73 3a 74 64 20 20 20 20 20 2e 20  ine (s:td     . 
0e80: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0e90: 74 61 67 20 22 54 44 22 20 20 20 20 20 61 72 67  tag "TD"     arg
0ea0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 74  s)).(define (s:t
0eb0: 69 74 6c 65 20 20 2e 20 61 72 67 73 29 20 28 73  itle  . args) (s
0ec0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 54 49 54  :common-tag "TIT
0ed0: 4c 45 22 20 20 61 72 67 73 29 29 0a 28 64 65 66  LE"  args)).(def
0ee0: 69 6e 65 20 28 73 3a 74 72 20 20 20 20 20 2e 20  ine (s:tr     . 
0ef0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0f00: 74 61 67 20 22 54 52 22 20 20 20 20 20 61 72 67  tag "TR"     arg
0f10: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  s)).(define (s:s
0f20: 6d 61 6c 6c 20 20 2e 20 61 72 67 73 29 20 28 73  mall  . args) (s
0f30: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 53 4d 41  :common-tag "SMA
0f40: 4c 4c 22 20 20 61 72 67 73 29 29 0a 28 64 65 66  LL"  args)).(def
0f50: 69 6e 65 20 28 73 3a 71 75 6f 74 65 20 20 2e 20  ine (s:quote  . 
0f60: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0f70: 74 61 67 20 22 51 55 4f 54 45 22 20 20 61 72 67  tag "QUOTE"  arg
0f80: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 68  s)).(define (s:h
0f90: 72 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  r     . args) (s
0fa0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 48 52 22  :common-tag "HR"
0fb0: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
0fc0: 69 6e 65 20 28 73 3a 6c 69 20 20 20 20 20 2e 20  ine (s:li     . 
0fd0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
0fe0: 74 61 67 20 22 4c 49 22 20 20 20 20 20 61 72 67  tag "LI"     arg
0ff0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 75  s)).(define (s:u
1000: 6c 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  l     . args) (s
1010: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 55 4c 22  :common-tag "UL"
1020: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
1030: 69 6e 65 20 28 73 3a 6f 6c 20 20 20 20 20 2e 20  ine (s:ol     . 
1040: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
1050: 74 61 67 20 22 4f 4c 22 20 20 20 20 20 61 72 67  tag "OL"     arg
1060: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 64  s)).(define (s:d
1070: 6c 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  l     . args) (s
1080: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 44 4c 22  :common-tag "DL"
1090: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
10a0: 69 6e 65 20 28 73 3a 64 74 20 20 20 20 20 2e 20  ine (s:dt     . 
10b0: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
10c0: 74 61 67 20 22 44 54 22 20 20 20 20 20 61 72 67  tag "DT"     arg
10d0: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 64  s)).(define (s:d
10e0: 64 20 20 20 20 20 2e 20 61 72 67 73 29 20 28 73  d     . args) (s
10f0: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 44 44 22  :common-tag "DD"
1100: 20 20 20 20 20 61 72 67 73 29 29 0a 28 64 65 66       args)).(def
1110: 69 6e 65 20 28 73 3a 70 72 65 20 20 20 20 2e 20  ine (s:pre    . 
1120: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
1130: 74 61 67 20 22 50 52 45 22 20 20 20 20 61 72 67  tag "PRE"    arg
1140: 73 29 29 0a 28 64 65 66 69 6e 65 20 28 73 3a 73  s)).(define (s:s
1150: 70 61 6e 20 20 20 2e 20 61 72 67 73 29 20 28 73  pan   . args) (s
1160: 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22 53 50 41  :common-tag "SPA
1170: 4e 22 20 20 20 61 72 67 73 29 29 0a 28 64 65 66  N"   args)).(def
1180: 69 6e 65 20 28 73 3a 6c 61 62 65 6c 20 20 2e 20  ine (s:label  . 
1190: 61 72 67 73 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  args) (s:common-
11a0: 74 61 67 20 22 4c 41 42 45 4c 22 20 20 61 72 67  tag "LABEL"  arg
11b0: 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a  s))..(define (s:
11c0: 64 62 6c 71 75 6f 74 65 20 20 2e 20 61 72 67 73  dblquote  . args
11d0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 69 6e 70 75  ).  (let* ((inpu
11e0: 74 73 20 28 73 3a 65 78 74 72 61 63 74 20 61 72  ts (s:extract ar
11f0: 67 73 29 29 0a 20 20 20 20 20 20 20 20 20 28 64  gs)).         (d
1200: 61 74 61 20 20 20 28 63 61 61 72 20 69 6e 70 75  ata   (caar inpu
1210: 74 73 29 29 0a 20 20 20 20 20 20 20 20 20 28 70  ts)).         (p
1220: 61 72 61 6d 73 20 28 73 3a 70 72 6f 63 65 73 73  arams (s:process
1230: 2d 70 61 72 61 6d 73 20 28 63 61 64 72 20 69 6e  -params (cadr in
1240: 70 75 74 73 29 29 29 29 0a 20 20 20 20 28 63 6f  puts)))).    (co
1250: 6e 63 20 22 26 71 75 6f 74 3b 22 20 64 61 74 61  nc "&quot;" data
1260: 20 22 26 71 75 6f 74 3b 22 29 29 29 0a 0a 28 64   "&quot;")))..(d
1270: 65 66 69 6e 65 20 28 73 3a 62 72 20 20 20 20 20  efine (s:br     
1280: 2e 20 61 72 67 73 29 20 22 3c 42 52 3e 22 29 20  . args) "<BR>") 
1290: 3b 3b 20 20 54 48 49 53 20 4d 41 59 20 4e 4f 54  ;;  THIS MAY NOT
12a0: 20 57 4f 52 4b 21 21 21 21 20 42 52 20 43 41 4e   WORK!!!! BR CAN
12b0: 20 28 4d 49 53 54 41 4b 45 4e 4c 59 29 20 47 45   (MISTAKENLY) GE
12c0: 54 20 50 41 52 41 4d 20 54 45 58 54 0a 3b 3b 20  T PARAM TEXT.;; 
12d0: 28 64 65 66 69 6e 65 20 28 73 3a 62 72 20 20 20  (define (s:br   
12e0: 20 20 2e 20 61 72 67 73 29 20 28 73 3a 63 6f 6d    . args) (s:com
12f0: 6d 6f 6e 2d 74 61 67 20 22 42 52 22 20 20 20 20  mon-tag "BR"    
1300: 20 61 72 67 73 29 29 0a 28 64 65 66 69 6e 65 20   args)).(define 
1310: 28 73 3a 66 6f 6e 74 20 20 20 2e 20 61 72 67 73  (s:font   . args
1320: 29 20 28 73 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20  ) (s:common-tag 
1330: 22 46 4f 4e 54 22 20 20 20 61 72 67 73 29 29 0a  "FONT"   args)).
1340: 28 64 65 66 69 6e 65 20 28 73 3a 65 72 72 2d 66  (define (s:err-f
1350: 6f 6e 74 20 2e 20 61 72 67 73 29 0a 20 20 28 73  ont . args).  (s
1360: 3a 62 20 28 73 3a 66 6f 6e 74 20 27 63 6f 6c 6f  :b (s:font 'colo
1370: 72 20 22 72 65 64 22 20 61 72 67 73 29 29 29 0a  r "red" args))).
1380: 0a 28 64 65 66 69 6e 65 20 28 73 3a 63 6f 6d 6d  .(define (s:comm
1390: 65 6e 74 20 2e 20 61 72 67 73 29 0a 20 20 28 6c  ent . args).  (l
13a0: 65 74 2a 20 28 28 69 6e 70 75 74 73 20 28 73 3a  et* ((inputs (s:
13b0: 65 78 74 72 61 63 74 20 61 72 67 73 29 29 0a 20  extract args)). 
13c0: 20 20 20 20 20 20 20 20 28 64 61 74 61 20 20 20          (data   
13d0: 28 63 61 72 20 69 6e 70 75 74 73 29 29 0a 20 20  (car inputs)).  
13e0: 20 20 20 20 20 20 20 28 70 61 72 61 6d 73 20 28         (params (
13f0: 73 3a 70 72 6f 63 65 73 73 2d 70 61 72 61 6d 73  s:process-params
1400: 20 28 63 61 64 72 20 69 6e 70 75 74 73 29 29 29   (cadr inputs)))
1410: 29 0a 20 20 20 20 28 6c 69 73 74 20 22 3c 21 2d  ).    (list "<!-
1420: 2d 22 20 64 61 74 61 20 22 2d 2d 3e 22 29 29 29  -" data "-->")))
1430: 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a 6e 75 6c  ..(define (s:nul
1440: 6c 20 20 20 2e 20 61 72 67 73 29 20 3b 3b 20 6e  l   . args) ;; n
1450: 6f 70 0a 20 20 28 6c 65 74 2a 20 28 28 69 6e 70  op.  (let* ((inp
1460: 75 74 73 20 28 73 3a 65 78 74 72 61 63 74 20 61  uts (s:extract a
1470: 72 67 73 29 29 0a 20 20 20 20 20 20 20 20 20 28  rgs)).         (
1480: 64 61 74 61 20 20 20 28 63 61 72 20 69 6e 70 75  data   (car inpu
1490: 74 73 29 29 0a 20 20 20 20 20 20 20 20 20 28 70  ts)).         (p
14a0: 61 72 61 6d 73 20 28 73 3a 70 72 6f 63 65 73 73  arams (s:process
14b0: 2d 70 61 72 61 6d 73 20 28 63 61 64 72 20 69 6e  -params (cadr in
14c0: 70 75 74 73 29 29 29 29 0a 20 20 20 20 28 6c 69  puts)))).    (li
14d0: 73 74 20 64 61 74 61 29 29 29 0a 0a 3b 3b 20 70  st data)))..;; p
14e0: 75 74 73 20 61 20 6e 69 63 65 20 62 6f 78 20 61  uts a nice box a
14f0: 72 6f 75 6e 64 20 61 20 63 68 75 6e 6b 20 6f 66  round a chunk of
1500: 20 73 74 75 66 66 0a 28 64 65 66 69 6e 65 20 28   stuff.(define (
1510: 73 3a 66 69 65 6c 64 73 65 74 20 6c 65 67 65 6e  s:fieldset legen
1520: 64 20 2e 20 61 72 67 73 29 0a 20 20 28 6c 69 73  d . args).  (lis
1530: 74 20 22 3c 46 49 45 4c 44 53 45 54 3e 3c 4c 45  t "<FIELDSET><LE
1540: 47 45 4e 44 3e 22 20 6c 65 67 65 6e 64 20 22 3c  GEND>" legend "<
1550: 2f 4c 45 47 45 4e 44 3e 22 20 61 72 67 73 20 22  /LEGEND>" args "
1560: 3c 2f 46 49 45 4c 44 53 45 54 3e 22 29 29 0a 0a  </FIELDSET>"))..
1570: 3b 3b 20 67 69 76 65 6e 20 61 20 73 74 72 69 6e  ;; given a strin
1580: 67 20 72 65 74 75 72 6e 20 74 68 65 20 73 74 72  g return the str
1590: 69 6e 67 20 69 66 20 69 74 20 69 73 20 6e 6f 6e  ing if it is non
15a0: 2d 77 68 69 74 65 20 73 70 61 63 65 20 6f 72 20  -white space or 
15b0: 26 6e 62 73 70 3b 20 6f 74 68 65 72 77 69 73 65  &nbsp; otherwise
15c0: 0a 28 64 65 66 69 6e 65 20 28 73 3a 6e 62 73 70  .(define (s:nbsp
15d0: 20 73 74 72 29 0a 20 20 28 69 66 20 28 73 74 72   str).  (if (str
15e0: 69 6e 67 2d 6d 61 74 63 68 20 22 5e 5c 5c 73 2a  ing-match "^\\s*
15f0: 24 22 20 73 74 72 29 0a 20 20 20 20 20 20 22 26  $" str).      "&
1600: 6e 62 73 70 3b 22 0a 20 20 20 20 20 20 73 74 72  nbsp;".      str
1610: 29 29 0a 0a 3b 3b 20 55 53 45 20 27 70 61 67 65  ))..;; USE 'page
1620: 5f 6f 76 65 72 72 69 64 65 20 74 6f 20 6f 76 65  _override to ove
1630: 72 72 69 64 65 20 61 20 6c 69 6e 6b 74 6f 20 70  rride a linkto p
1640: 61 67 65 20 66 72 6f 6d 20 61 20 62 75 74 74 6f  age from a butto
1650: 6e 0a 28 64 65 66 69 6e 65 20 28 73 3a 66 6f 72  n.(define (s:for
1660: 6d 20 20 20 2e 20 61 72 67 73 29 0a 20 20 3b 3b  m   . args).  ;;
1670: 20 63 72 65 61 74 65 20 61 20 6c 69 6e 6b 20 66   create a link f
1680: 6f 72 20 63 61 6c 6c 69 6e 67 20 62 61 63 6b 20  or calling back 
1690: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
16a0: 20 70 61 67 65 20 61 6e 64 20 63 61 6c 6c 69 6e   page and callin
16b0: 67 20 61 20 73 70 65 63 69 66 69 65 64 20 0a 20  g a specified . 
16c0: 20 3b 3b 20 66 75 6e 63 74 69 6f 6e 0a 20 20 28   ;; function.  (
16d0: 6c 65 74 2a 20 28 28 61 63 74 69 6f 6e 20 20 20  let* ((action   
16e0: 20 20 28 6c 65 74 20 28 28 76 20 28 73 3a 66 69    (let ((v (s:fi
16f0: 6e 64 2d 70 61 72 61 6d 20 27 61 63 74 69 6f 6e  nd-param 'action
1700: 20 61 72 67 73 29 29 29 0a 20 20 20 20 20 20 20   args))).       
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 28 69 66 20 76 20 76 20 22 64 65 66 61 75 6c 74  (if v v "default
1730: 22 29 29 29 0a 09 20 28 69 64 20 20 20 20 20 20  "))).. (id      
1740: 20 20 20 28 6c 65 74 20 28 28 69 20 28 73 3a 66     (let ((i (s:f
1750: 69 6e 64 2d 70 61 72 61 6d 20 27 69 64 20 61 72  ind-param 'id ar
1760: 67 73 29 29 29 0a 09 09 20 20 20 20 20 20 20 28  gs)))...       (
1770: 69 66 20 69 20 69 20 23 66 29 29 29 0a 20 20 20  if i i #f))).   
1780: 20 20 20 20 20 20 28 70 61 67 65 20 20 20 20 20        (page     
1790: 20 20 28 6c 65 74 20 28 28 70 20 28 73 64 61 74    (let ((p (sdat
17a0: 2d 67 65 74 2d 70 61 67 65 20 73 3a 73 65 73 73  -get-page s:sess
17b0: 69 6f 6e 29 29 29 0a 20 20 20 20 20 20 20 20 20  ion))).         
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
17d0: 66 20 70 20 70 20 22 68 6f 6d 65 22 29 29 29 0a  f p p "home"))).
17e0: 09 20 3b 3b 20 28 6c 69 6e 6b 20 20 20 20 20 20  . ;; (link      
17f0: 20 28 73 65 73 73 69 6f 6e 3a 6c 69 6e 6b 2d 74   (session:link-t
1800: 6f 20 73 3a 73 65 73 73 69 6f 6e 20 70 61 67 65  o s:session page
1810: 20 28 69 66 20 69 64 0a 20 20 20 20 20 20 20 20   (if id.        
1820: 20 3b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   ;;             
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 28 6c 69 73 74 20 27 61 63 74 69 6f      (list 'actio
1860: 6e 20 61 63 74 69 6f 6e 20 27 69 64 20 69 64 29  n action 'id id)
1870: 0a 20 20 20 20 20 20 20 20 20 3b 3b 20 20 20 20  .         ;;    
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 69               (li
18b0: 73 74 20 27 61 63 74 69 6f 6e 20 61 63 74 69 6f  st 'action actio
18c0: 6e 29 29 29 29 29 0a 09 20 28 6c 69 6e 6b 20 20  n))))).. (link  
18d0: 20 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67       (if (string
18e0: 3d 3f 20 28 73 75 62 73 74 72 69 6e 67 20 61 63  =? (substring ac
18f0: 74 69 6f 6e 20 30 20 35 29 20 22 68 74 74 70 3a  tion 0 5) "http:
1900: 22 29 20 3b 3b 20 69 66 20 66 69 72 73 74 20 70  ") ;; if first p
1910: 61 72 74 20 6f 66 20 73 74 72 69 6e 67 20 69 73  art of string is
1920: 20 68 74 74 70 3a 0a 09 20 20 20 20 20 20 20 20   http:..        
1930: 09 20 61 63 74 69 6f 6e 0a 09 20 20 20 20 20 20  . action..      
1940: 20 20 09 20 28 73 65 73 73 69 6f 6e 3a 6c 69 6e    . (session:lin
1950: 6b 2d 74 6f 20 73 3a 73 65 73 73 69 6f 6e 20 0a  k-to s:session .
1960: 09 20 20 20 20 20 20 20 20 09 09 09 20 20 70 61  .        ...  pa
1970: 67 65 20 0a 09 20 20 20 20 20 20 20 20 09 09 09  ge ..        ...
1980: 20 20 28 69 66 20 69 64 0a 09 20 20 20 20 20 20    (if id..      
1990: 20 20 09 09 09 20 20 20 20 20 20 28 6c 69 73 74    ...      (list
19a0: 20 27 61 63 74 69 6f 6e 20 61 63 74 69 6f 6e 20   'action action 
19b0: 27 69 64 20 69 64 29 0a 09 20 20 20 20 20 20 20  'id id)..       
19c0: 20 09 09 09 20 20 20 20 20 20 28 6c 69 73 74 20   ...      (list 
19d0: 27 61 63 74 69 6f 6e 20 61 63 74 69 6f 6e 29 29  'action action))
19e0: 29 29 29 29 0a 20 20 20 20 3b 3b 20 28 73 63 72  )))).    ;; (scr
19f0: 69 70 74 20 20 20 20 20 28 73 6c 6f 74 2d 72 65  ipt     (slot-re
1a00: 66 20 73 3a 73 65 73 73 69 6f 6e 20 27 73 63 72  f s:session 'scr
1a10: 69 70 74 29 29 0a 20 20 20 20 3b 3b 20 28 61 63  ipt)).    ;; (ac
1a20: 74 69 6f 6e 2d 73 74 72 20 28 73 74 72 69 6e 67  tion-str (string
1a30: 2d 61 70 70 65 6e 64 20 73 63 72 69 70 74 20 22  -append script "
1a40: 2f 22 20 70 61 67 65 20 22 3f 61 63 74 69 6f 6e  /" page "?action
1a50: 3d 22 20 61 63 74 69 6f 6e 29 29 29 0a 20 20 20  =" action))).   
1a60: 20 28 73 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20 22   (s:common-tag "
1a70: 46 4f 52 4d 22 20 28 61 70 70 65 6e 64 20 28 73  FORM" (append (s
1a80: 3a 72 65 6d 6f 76 65 2d 70 61 72 61 6d 2d 6d 61  :remove-param-ma
1a90: 74 63 68 69 6e 67 20 28 73 3a 72 65 6d 6f 76 65  tching (s:remove
1aa0: 2d 70 61 72 61 6d 2d 6d 61 74 63 68 69 6e 67 20  -param-matching 
1ab0: 61 72 67 73 20 27 61 63 74 69 6f 6e 29 20 27 69  args 'action) 'i
1ac0: 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d).             
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae0: 20 20 20 20 28 6c 69 73 74 20 27 61 63 74 69 6f      (list 'actio
1af0: 6e 20 6c 69 6e 6b 29 29 29 29 29 0a 0a 3b 3b 20  n link)))))..;; 
1b00: 6c 6f 6f 6b 20 75 70 20 74 68 65 20 76 61 72 69  look up the vari
1b10: 61 62 6c 65 20 6e 61 6d 65 20 28 76 69 61 20 74  able name (via t
1b20: 68 65 20 27 6e 61 6d 65 20 74 61 67 29 20 74 68  he 'name tag) th
1b30: 65 6e 20 69 6e 6a 65 63 74 20 74 68 65 20 76 61  en inject the va
1b40: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 73  lue from the ses
1b50: 73 69 6f 6e 20 76 61 72 0a 3b 3b 20 72 65 70 6c  sion var.;; repl
1b60: 61 63 69 6e 67 20 74 68 65 20 27 76 61 6c 75 65  acing the 'value
1b70: 20 76 61 6c 75 65 20 69 66 20 69 74 20 69 73 20   value if it is 
1b80: 61 6c 72 65 61 64 79 20 74 68 65 72 65 2c 20 61  already there, a
1b90: 64 64 69 6e 67 20 69 74 20 69 66 20 69 74 20 69  dding it if it i
1ba0: 73 20 6e 6f 74 2e 0a 28 64 65 66 69 6e 65 20 28  s not..(define (
1bb0: 73 3a 70 72 65 73 65 72 76 65 20 74 61 67 20 61  s:preserve tag a
1bc0: 72 67 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 76  rgs).  (let* ((v
1bd0: 61 72 2d 6e 61 6d 65 20 28 73 3a 66 69 6e 64 2d  ar-name (s:find-
1be0: 70 61 72 61 6d 20 27 6e 61 6d 65 20 61 72 67 73  param 'name args
1bf0: 29 29 20 3b 3b 20 6e 61 6d 65 3d 27 76 61 72 6e  )) ;; name='varn
1c00: 61 6d 65 27 0a 09 20 28 76 61 6c 75 65 20 20 20  ame'.. (value   
1c10: 20 28 6c 65 74 20 28 28 76 20 28 73 3a 67 65 74   (let ((v (s:get
1c20: 20 76 61 72 2d 6e 61 6d 65 29 29 29 0a 09 09 20   var-name)))... 
1c30: 20 20 20 20 28 69 66 20 76 20 76 20 23 66 29 29      (if v v #f))
1c40: 29 0a 09 20 28 6e 65 77 61 72 67 73 20 20 28 61  ).. (newargs  (a
1c50: 70 70 65 6e 64 20 28 73 3a 72 65 6d 6f 76 65 2d  ppend (s:remove-
1c60: 70 61 72 61 6d 2d 6d 61 74 63 68 69 6e 67 20 61  param-matching a
1c70: 72 67 73 20 27 76 61 6c 75 65 29 20 28 69 66 20  rgs 'value) (if 
1c80: 76 61 6c 75 65 20 28 6c 69 73 74 20 27 76 61 6c  value (list 'val
1c90: 75 65 20 76 61 6c 75 65 29 20 27 28 29 29 29 29  ue value) '())))
1ca0: 29 0a 20 20 20 20 28 73 3a 63 6f 6d 6d 6f 6e 2d  ).    (s:common-
1cb0: 74 61 67 20 74 61 67 20 6e 65 77 61 72 67 73 29  tag tag newargs)
1cc0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 73 3a 69  ))..(define (s:i
1cd0: 6e 70 75 74 2d 70 72 65 73 65 72 76 65 20 20 2e  nput-preserve  .
1ce0: 20 61 72 67 73 29 0a 20 20 28 73 3a 70 72 65 73   args).  (s:pres
1cf0: 65 72 76 65 20 22 49 4e 50 55 54 22 20 61 72 67  erve "INPUT" arg
1d00: 73 29 29 0a 0a 3b 3b 20 74 65 78 74 20 61 72 65  s))..;; text are
1d10: 61 73 20 61 72 65 20 64 6f 6e 65 20 61 20 6c 69  as are done a li
1d20: 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74 6c 79  ttle differently
1d30: 2e 20 54 68 65 20 76 61 6c 75 65 20 69 73 20 73  . The value is s
1d40: 74 6f 72 65 64 20 62 65 74 77 65 65 6e 20 74 68  tored between th
1d50: 65 20 74 61 67 73 20 3c 74 65 78 74 61 72 65 61  e tags <textarea
1d60: 20 2e 2e 2e 3e 74 68 65 20 76 61 6c 75 65 20 67   ...>the value g
1d70: 6f 65 73 20 68 65 72 65 3c 2f 74 65 78 74 61 72  oes here</textar
1d80: 65 61 3e 0a 28 64 65 66 69 6e 65 20 28 73 3a 74  ea>.(define (s:t
1d90: 65 78 74 61 72 65 61 2d 70 72 65 73 65 72 76 65  extarea-preserve
1da0: 20 2e 20 61 72 67 73 29 0a 20 20 28 6c 65 74 2a   . args).  (let*
1db0: 20 28 28 76 61 72 2d 6e 61 6d 65 20 28 73 3a 66   ((var-name (s:f
1dc0: 69 6e 64 2d 70 61 72 61 6d 20 27 6e 61 6d 65 20  ind-param 'name 
1dd0: 61 72 67 73 29 29 0a 09 20 28 76 61 6c 75 65 20  args)).. (value 
1de0: 20 20 20 28 6c 65 74 20 28 28 76 20 28 73 3a 67     (let ((v (s:g
1df0: 65 74 20 76 61 72 2d 6e 61 6d 65 29 29 29 0a 09  et var-name)))..
1e00: 09 20 20 20 20 20 28 69 66 20 76 20 76 20 23 66  .     (if v v #f
1e10: 29 29 29 29 0a 20 20 20 20 28 73 3a 63 6f 6d 6d  )))).    (s:comm
1e20: 6f 6e 2d 74 61 67 20 22 54 45 58 54 41 52 45 41  on-tag "TEXTAREA
1e30: 22 20 28 69 66 20 76 61 6c 75 65 20 28 63 6f 6e  " (if value (con
1e40: 73 20 76 61 6c 75 65 20 61 72 67 73 29 20 61 72  s value args) ar
1e50: 67 73 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  gs))))..(define 
1e60: 28 73 3a 6f 70 74 69 6f 6e 20 64 61 74 29 0a 20  (s:option dat). 
1e70: 20 28 6c 65 74 20 28 28 6c 65 6e 20 20 20 20 20   (let ((len     
1e80: 20 28 6c 65 6e 67 74 68 20 64 61 74 29 29 29 0a   (length dat))).
1e90: 20 20 20 20 28 63 6f 6e 64 0a 20 20 20 20 20 28      (cond.     (
1ea0: 28 65 71 3f 20 6c 65 6e 20 31 29 0a 20 20 20 20  (eq? len 1).    
1eb0: 20 20 28 6c 65 74 20 28 28 69 74 65 6d 20 28 63    (let ((item (c
1ec0: 61 72 20 64 61 74 29 29 29 0a 09 28 73 3a 6f 70  ar dat)))..(s:op
1ed0: 74 69 6f 6e 20 28 6c 69 73 74 20 69 74 65 6d 20  tion (list item 
1ee0: 69 74 65 6d 20 69 74 65 6d 29 29 29 29 0a 20 20  item item)))).  
1ef0: 20 20 20 28 28 65 71 3f 20 6c 65 6e 20 32 29 0a     ((eq? len 2).
1f00: 20 20 20 20 20 20 28 73 3a 6f 70 74 69 6f 6e 20        (s:option 
1f10: 28 61 70 70 65 6e 64 20 64 61 74 20 28 6c 69 73  (append dat (lis
1f20: 74 20 28 63 61 72 20 64 61 74 29 29 29 29 29 0a  t (car dat))))).
1f30: 20 20 20 20 20 28 65 6c 73 65 0a 20 20 20 20 20       (else.     
1f40: 20 28 6c 65 74 20 28 28 6c 61 62 65 6c 20 20 20   (let ((label   
1f50: 20 28 63 61 72 20 64 61 74 29 29 0a 09 20 20 20   (car dat))..   
1f60: 20 28 76 61 6c 75 65 20 20 20 20 28 63 61 64 72   (value    (cadr
1f70: 20 64 61 74 29 29 0a 09 20 20 20 20 28 64 69 73   dat))..    (dis
1f80: 70 76 61 6c 20 20 28 63 61 64 64 72 20 64 61 74  pval  (caddr dat
1f90: 29 29 0a 09 20 20 20 20 28 73 65 6c 65 63 74 65  ))..    (selecte
1fa0: 64 20 28 69 66 20 28 3e 20 6c 65 6e 20 33 29 28  d (if (> len 3)(
1fb0: 63 61 64 64 64 72 20 64 61 74 29 20 23 66 29 29  cadddr dat) #f))
1fc0: 29 0a 09 28 6c 69 73 74 20 28 63 6f 6e 63 20 22  )..(list (conc "
1fd0: 3c 4f 50 54 49 4f 4e 20 22 20 0a 09 09 20 20 20  <OPTION " ...   
1fe0: 20 28 69 66 20 73 65 6c 65 63 74 65 64 20 22 20   (if selected " 
1ff0: 73 65 6c 65 63 74 65 64 20 22 20 22 22 29 0a 09  selected " "")..
2000: 09 20 20 20 20 22 6c 61 62 65 6c 3d 5c 22 22 20  .    "label=\"" 
2010: 6c 61 62 65 6c 0a 09 09 20 20 20 20 22 5c 22 20  label...    "\" 
2020: 76 61 6c 75 65 3d 5c 22 22 20 76 61 6c 75 65 0a  value=\"" value.
2030: 09 09 20 20 20 20 22 5c 22 3e 22 20 64 69 73 70  ..    "\">" disp
2040: 76 61 6c 20 22 3c 2f 4f 50 54 49 4f 4e 3e 22 29  val "</OPTION>")
2050: 29 29 29 29 29 29 0a 0a 3b 3b 20 63 61 6c 6c 20  ))))))..;; call 
2060: 6f 6e 6c 79 20 77 69 74 68 20 28 6c 61 62 65 6c  only with (label
2070: 20 28 6c 61 62 65 6c 20 76 61 6c 75 65 20 64 69   (label value di
2080: 73 70 76 61 6c 20 5b 23 74 5d 29 20 2e 2e 2e 29  spval [#t]) ...)
2090: 0a 3b 3b 20 4e 42 2f 2f 20 73 61 64 6c 79 20 74  .;; NB// sadly t
20a0: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 64  his block is red
20b0: 75 6e 64 61 6e 74 6c 79 20 61 6c 6d 6f 73 74 20  undantly almost 
20c0: 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65  identical to the
20d0: 20 73 3a 73 65 6c 65 63 74 0a 3b 3b 20 66 69 78   s:select.;; fix
20e0: 20 74 68 61 74 20 6c 61 74 65 72 20 2e 2e 2e 0a   that later ....
20f0: 28 64 65 66 69 6e 65 20 28 73 3a 6f 70 74 67 72  (define (s:optgr
2100: 6f 75 70 20 64 61 74 29 0a 20 20 28 6c 65 74 20  oup dat).  (let 
2110: 28 28 6c 61 62 65 6c 20 28 63 61 72 20 64 61 74  ((label (car dat
2120: 29 29 0a 09 28 72 65 6d 20 20 20 28 63 64 72 20  ))..(rem   (cdr 
2130: 64 61 74 29 29 29 0a 20 20 20 20 28 69 66 20 28  dat))).    (if (
2140: 6e 75 6c 6c 3f 20 72 65 6d 29 0a 09 28 73 3a 63  null? rem)..(s:c
2150: 6f 6d 6d 6f 6e 2d 74 61 67 20 22 4f 50 54 47 52  ommon-tag "OPTGR
2160: 4f 55 50 22 20 27 6c 61 62 65 6c 20 6c 61 62 65  OUP" 'label labe
2170: 6c 29 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28  l)..(let loop ((
2180: 68 65 64 20 28 63 61 72 20 72 65 6d 29 29 0a 09  hed (car rem))..
2190: 09 20 20 20 28 74 61 6c 20 28 63 64 72 20 72 65  .   (tal (cdr re
21a0: 6d 29 29 0a 09 09 20 20 20 28 72 65 73 20 28 6c  m))...   (res (l
21b0: 69 73 74 20 28 63 6f 6e 63 20 22 3c 4f 50 54 47  ist (conc "<OPTG
21c0: 52 4f 55 50 20 6c 61 62 65 6c 3d 22 20 6c 61 62  ROUP label=" lab
21d0: 65 6c 29 29 29 29 0a 09 20 20 3b 3b 20 28 70 72  el))))..  ;; (pr
21e0: 69 6e 74 20 22 68 65 64 3a 20 22 20 68 65 64 20  int "hed: " hed 
21f0: 22 20 74 61 6c 3a 20 22 20 74 61 6c 20 22 20 72  " tal: " tal " r
2200: 65 73 3a 20 22 20 72 65 73 29 0a 09 20 20 28 6c  es: " res)..  (l
2210: 65 74 20 28 28 6e 65 77 20 28 61 70 70 65 6e 64  et ((new (append
2220: 20 72 65 73 20 28 6c 69 73 74 20 28 69 66 20 28   res (list (if (
2230: 6c 69 73 74 3f 20 28 63 61 64 72 20 68 65 64 29  list? (cadr hed)
2240: 29 0a 09 09 09 09 09 20 20 20 28 73 3a 6f 70 74  )......   (s:opt
2250: 67 72 6f 75 70 20 68 65 64 29 0a 09 09 09 09 09  group hed)......
2260: 20 20 20 28 73 3a 6f 70 74 69 6f 6e 20 68 65 64     (s:option hed
2270: 29 29 29 29 29 29 0a 09 20 20 20 20 28 69 66 20  ))))))..    (if 
2280: 28 6e 75 6c 6c 3f 20 74 61 6c 29 0a 09 09 28 61  (null? tal)...(a
2290: 70 70 65 6e 64 20 6e 65 77 20 28 6c 69 73 74 20  ppend new (list 
22a0: 22 3c 2f 4f 50 54 47 52 4f 55 50 3e 22 29 29 0a  "</OPTGROUP>")).
22b0: 09 09 28 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c  ..(loop (car tal
22c0: 29 28 63 64 72 20 74 61 6c 29 20 6e 65 77 29 29  )(cdr tal) new))
22d0: 29 29 29 29 29 0a 20 20 20 20 0a 3b 3b 20 69 74  ))))).    .;; it
22e0: 65 6d 73 20 69 73 20 61 20 68 69 65 72 61 72 63  ems is a hierarc
22f0: 68 69 61 6c 20 61 6c 69 73 74 0a 3b 3b 20 28 20  hial alist.;; ( 
2300: 28 6c 61 62 65 6c 31 20 76 61 6c 75 65 31 20 64  (label1 value1 d
2310: 69 73 70 76 61 6c 31 20 23 74 29 20 3b 3b 20 3c  ispval1 #t) ;; <
2320: 3d 3d 20 74 68 69 73 20 6f 6e 65 20 69 73 20 73  == this one is s
2330: 65 6c 65 63 74 65 64 0a 3b 3b 20 20 20 28 6c 61  elected.;;   (la
2340: 62 65 6c 32 20 28 6c 61 62 65 6c 33 20 76 61 6c  bel2 (label3 val
2350: 75 65 32 20 64 69 73 70 76 61 6c 32 29 0a 3b 3b  ue2 dispval2).;;
2360: 20 20 20 20 20 20 20 20 20 20 20 28 6c 61 62 65             (labe
2370: 6c 34 20 76 61 6c 75 65 33 20 64 69 73 70 76 61  l4 value3 dispva
2380: 6c 33 29 29 29 0a 3b 3b 20 20 20 20 20 0a 3b 3b  l3))).;;     .;;
2390: 20 20 72 65 71 75 69 72 65 64 20 61 72 67 20 69    required arg i
23a0: 73 20 27 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20  s 'name.(define 
23b0: 28 73 3a 73 65 6c 65 63 74 20 69 74 65 6d 73 20  (s:select items 
23c0: 2e 20 61 72 67 73 29 0a 20 20 28 69 66 20 28 6e  . args).  (if (n
23d0: 75 6c 6c 3f 20 69 74 65 6d 73 29 0a 20 20 20 20  ull? items).    
23e0: 20 20 28 73 3a 63 6f 6d 6d 6f 6e 2d 74 61 67 20    (s:common-tag 
23f0: 22 53 45 4c 45 43 54 22 20 61 72 67 73 29 0a 20  "SELECT" args). 
2400: 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28       (let loop (
2410: 28 68 65 64 20 28 63 61 72 20 69 74 65 6d 73 29  (hed (car items)
2420: 29 0a 09 09 20 28 74 61 6c 20 28 63 64 72 20 69  )... (tal (cdr i
2430: 74 65 6d 73 29 29 0a 09 09 20 28 72 65 73 20 27  tems))... (res '
2440: 28 29 29 29 0a 09 3b 3b 20 28 70 72 69 6e 74 20  ()))..;; (print 
2450: 22 68 65 64 3a 20 22 20 68 65 64 20 22 20 74 61  "hed: " hed " ta
2460: 6c 3a 20 22 20 74 61 6c 20 22 20 72 65 73 3a 20  l: " tal " res: 
2470: 22 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28 6e  " res)..(let ((n
2480: 65 77 20 28 61 70 70 65 6e 64 20 72 65 73 20 28  ew (append res (
2490: 6c 69 73 74 20 28 69 66 20 28 61 6e 64 20 28 3e  list (if (and (>
24a0: 20 28 6c 65 6e 67 74 68 20 68 65 64 29 20 31 29   (length hed) 1)
24b0: 0a 09 09 09 09 09 20 20 20 20 20 20 28 6c 69 73  ......      (lis
24c0: 74 3f 20 28 63 61 64 72 20 68 65 64 29 29 29 0a  t? (cadr hed))).
24d0: 09 09 09 09 09 20 28 73 3a 6f 70 74 67 72 6f 75  ..... (s:optgrou
24e0: 70 20 68 65 64 29 0a 09 09 09 09 09 20 28 73 3a  p hed)...... (s:
24f0: 6f 70 74 69 6f 6e 20 68 65 64 29 29 29 29 29 29  option hed))))))
2500: 0a 09 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74  ..  (if (null? t
2510: 61 6c 29 0a 09 20 20 20 20 20 20 28 73 3a 63 6f  al)..      (s:co
2520: 6d 6d 6f 6e 2d 74 61 67 20 22 53 45 4c 45 43 54  mmon-tag "SELECT
2530: 22 20 28 63 6f 6e 73 20 6e 65 77 20 61 72 67 73  " (cons new args
2540: 29 29 0a 09 20 20 20 20 20 20 28 6c 6f 6f 70 20  ))..      (loop 
2550: 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61  (car tal)(cdr ta
2560: 6c 29 20 6e 65 77 29 29 29 29 29 29 0a 0a 28 64  l) new))))))..(d
2570: 65 66 69 6e 65 20 28 73 3a 63 6f 6c 6f 72 20 20  efine (s:color  
2580: 2e 20 61 72 67 73 29 0a 20 20 22 23 30 30 66 66  . args).  "#00ff
2590: 30 30 22 29 0a 0a 28 64 65 66 69 6e 65 20 28 73  00")..(define (s
25a0: 3a 70 72 69 6e 74 20 69 6e 64 65 6e 74 20 69 6e  :print indent in
25b0: 6c 73 74 29 0a 20 20 28 6d 61 70 20 28 6c 61 6d  lst).  (map (lam
25c0: 62 64 61 20 28 78 29 0a 20 20 20 20 20 20 20 20  bda (x).        
25d0: 20 28 63 6f 6e 64 20 0a 20 20 20 20 20 20 20 20   (cond .        
25e0: 20 20 28 28 6f 72 20 28 73 74 72 69 6e 67 3f 20    ((or (string? 
25f0: 78 29 28 73 79 6d 62 6f 6c 3f 20 78 29 29 0a 20  x)(symbol? x)). 
2600: 20 20 20 20 20 20 20 20 20 20 28 70 72 69 6e 74            (print
2610: 20 28 63 6f 6e 63 20 28 6d 61 6b 65 2d 73 74 72   (conc (make-str
2620: 69 6e 67 20 28 2a 20 69 6e 64 65 6e 74 20 32 29  ing (* indent 2)
2630: 20 23 5c 20 29 20 28 61 6e 79 2d 3e 73 74 72 69   #\ ) (any->stri
2640: 6e 67 20 78 29 29 29 29 0a 20 20 20 20 20 20 20  ng x)))).       
2650: 20 20 20 28 28 6c 69 73 74 3f 20 78 29 0a 20 20     ((list? x).  
2660: 20 20 20 20 20 20 20 20 20 28 73 3a 70 72 69 6e           (s:prin
2670: 74 20 28 2b 20 69 6e 64 65 6e 74 20 31 29 20 78  t (+ indent 1) x
2680: 29 29 0a 20 20 20 20 20 20 20 20 20 20 28 65 6c  )).          (el
2690: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 3b 3b  se.           ;;
26a0: 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20   (print "ERROR: 
26b0: 42 61 64 20 69 6e 70 75 74 20 30 31 22 29 20 3b  Bad input 01") ;
26c0: 3b 20 77 68 79 20 64 6f 20 61 6e 79 74 68 69 6e  ; why do anythin
26d0: 67 20 77 69 74 68 20 6a 75 6e 6b 3f 0a 20 20 20  g with junk?.   
26e0: 20 20 20 20 20 20 20 20 29 29 29 0a 20 20 20 20          ))).    
26f0: 20 20 20 69 6e 6c 73 74 29 29 0a 0a 28 64 65 66     inlst))..(def
2700: 69 6e 65 20 28 73 3a 63 67 69 2d 6f 75 74 20 69  ine (s:cgi-out i
2710: 6e 6c 73 74 29 0a 20 20 28 73 3a 6f 75 74 70 75  nlst).  (s:outpu
2720: 74 20 28 63 75 72 72 65 6e 74 2d 6f 75 74 70 75  t (current-outpu
2730: 74 2d 70 6f 72 74 29 20 69 6e 6c 73 74 29 29 0a  t-port) inlst)).
2740: 0a 28 64 65 66 69 6e 65 20 28 73 3a 6f 75 74 70  .(define (s:outp
2750: 75 74 20 70 6f 72 74 20 69 6e 6c 73 74 29 0a 20  ut port inlst). 
2760: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 78   (map (lambda (x
2770: 29 0a 09 20 28 63 6f 6e 64 20 0a 09 20 20 28 28  ).. (cond ..  ((
2780: 73 74 72 69 6e 67 3f 20 78 29 20 28 70 72 69 6e  string? x) (prin
2790: 74 20 78 29 29 20 3b 3b 20 28 70 72 69 6e 74 20  t x)) ;; (print 
27a0: 78 29 29 0a 09 20 20 28 28 73 79 6d 62 6f 6c 3f  x))..  ((symbol?
27b0: 20 78 29 20 28 70 72 69 6e 74 20 78 29 29 20 3b   x) (print x)) ;
27c0: 3b 20 28 70 72 69 6e 74 20 78 29 29 0a 09 20 20  ; (print x))..  
27d0: 28 28 6c 69 73 74 3f 20 78 29 20 20 20 28 73 3a  ((list? x)   (s:
27e0: 6f 75 74 70 75 74 20 70 6f 72 74 20 78 29 29 0a  output port x)).
27f0: 09 20 20 28 65 6c 73 65 0a 09 20 20 20 3b 3b 20  .  (else..   ;; 
2800: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 42  (print "ERROR: B
2810: 61 64 20 69 6e 70 75 74 20 30 32 22 29 20 3b 3b  ad input 02") ;;
2820: 20 77 68 79 20 64 6f 20 61 6e 79 74 68 69 6e 67   why do anything
2830: 3f 20 64 6f 6e 27 74 20 6f 75 74 70 75 74 20 6a  ? don't output j
2840: 75 6e 6b 2e 0a 09 20 20 20 29 29 29 0a 20 20 20  unk...   ))).   
2850: 20 20 20 20 69 6e 6c 73 74 29 29 0a 3b 20 20 28      inlst)).;  (
2860: 69 66 20 28 3e 20 28 6c 65 6e 67 74 68 20 69 6e  if (> (length in
2870: 6c 73 74 29 20 32 29 0a 3b 20 20 20 20 20 20 28  lst) 2).;      (
2880: 70 72 69 6e 74 29 29 29 0a 0a 28 64 65 66 69 6e  print)))..(defin
2890: 65 20 28 73 3a 6f 75 74 70 75 74 2d 6e 65 77 20  e (s:output-new 
28a0: 70 6f 72 74 20 69 6e 6c 73 74 29 0a 20 20 28 77  port inlst).  (w
28b0: 69 74 68 2d 6f 75 74 70 75 74 2d 74 6f 2d 70 6f  ith-output-to-po
28c0: 72 74 20 70 6f 72 74 0a 20 20 20 20 20 20 28 6c  rt port.      (l
28d0: 61 6d 62 64 61 20 28 29 0a 09 28 6d 61 70 20 28  ambda ()..(map (
28e0: 6c 61 6d 62 64 61 20 28 78 29 0a 09 20 20 20 20  lambda (x)..    
28f0: 20 20 20 28 63 6f 6e 64 20 0a 09 09 28 28 73 74     (cond ...((st
2900: 72 69 6e 67 3f 20 78 29 20 28 70 72 69 6e 74 20  ring? x) (print 
2910: 78 29 29 0a 09 09 28 28 73 79 6d 62 6f 6c 3f 20  x))...((symbol? 
2920: 78 29 20 28 70 72 69 6e 74 20 78 29 29 0a 09 09  x) (print x))...
2930: 28 28 6c 69 73 74 3f 20 78 29 20 20 20 28 73 3a  ((list? x)   (s:
2940: 6f 75 74 70 75 74 20 70 6f 72 74 20 78 29 29 0a  output port x)).
2950: 09 09 28 65 6c 73 65 0a 09 09 20 3b 3b 20 28 70  ..(else... ;; (p
2960: 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 42 61 64  rint "ERROR: Bad
2970: 20 69 6e 70 75 74 20 30 33 22 29 0a 20 20 20 20   input 03").    
2980: 20 29 29 29 0a 09 20 20 20 20 20 69 6e 6c 73 74   )))..     inlst
2990: 29 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  )))).           
29a0: 0a                                               .