Hex Artifact Content
Not logged in

Artifact 225fe1c9c643acde417036075f52c16cb8322d23:


0000: 09 0a 20 28 64 65 66 69 6e 65 2d 73 79 6e 74 61  .. (define-synta
0010: 78 20 64 65 66 69 6e 65 2d 66 74 79 70 65 2d 61  x define-ftype-a
0020: 6c 6c 6f 63 61 74 6f 72 20 0a 20 20 20 28 6c 61  llocator .   (la
0030: 6d 62 64 61 20 28 78 29 0a 20 20 20 20 20 28 73  mbda (x).     (s
0040: 79 6e 74 61 78 2d 63 61 73 65 20 78 20 28 29 20  yntax-case x () 
0050: 0a 20 20 20 20 20 20 20 5b 28 5f 20 6e 61 6d 65  .       [(_ name
0060: 20 74 79 70 65 29 20 0a 09 23 27 28 64 65 66 69   type) ..#'(defi
0070: 6e 65 20 28 6e 61 6d 65 29 20 0a 09 20 20 20 20  ne (name) ..    
0080: 28 73 64 6c 2d 67 75 61 72 64 2d 70 6f 69 6e 74  (sdl-guard-point
0090: 65 72 20 28 6d 61 6b 65 2d 66 74 79 70 65 2d 70  er (make-ftype-p
00a0: 6f 69 6e 74 65 72 20 74 79 70 65 20 28 66 6f 72  ointer type (for
00b0: 65 69 67 6e 2d 61 6c 6c 6f 63 20 28 66 74 79 70  eign-alloc (ftyp
00c0: 65 2d 73 69 7a 65 6f 66 20 74 79 70 65 29 29 29  e-sizeof type)))
00d0: 29 29 5d 29 29 29 0a 0a 20 28 64 65 66 69 6e 65  ))]))).. (define
00e0: 2d 73 79 6e 74 61 78 20 64 65 66 69 6e 65 2d 73  -syntax define-s
00f0: 64 6c 2d 66 75 6e 63 0a 20 20 20 28 6c 61 6d 62  dl-func.   (lamb
0100: 64 61 20 28 78 29 0a 20 20 20 20 20 28 64 65 66  da (x).     (def
0110: 69 6e 65 20 28 61 6e 74 69 2d 63 61 6d 65 6c 20  ine (anti-camel 
0120: 78 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20  x).       (let* 
0130: 28 5b 78 20 28 73 74 72 69 6e 67 2d 72 65 70 6c  ([x (string-repl
0140: 61 63 65 20 78 20 23 5c 5f 20 23 5c 2d 29 5d 0a  ace x #\_ #\-)].
0150: 09 20 20 20 20 20 20 5b 6c 65 6e 20 28 73 74 72  .      [len (str
0160: 69 6e 67 2d 6c 65 6e 67 74 68 20 78 29 5d 0a 09  ing-length x)]..
0170: 20 20 20 20 20 20 5b 73 20 28 6c 69 73 74 2d 3e        [s (list->
0180: 73 74 72 69 6e 67 0a 09 09 20 20 28 72 65 76 65  string...  (reve
0190: 72 73 65 0a 09 09 20 20 20 28 66 6f 6c 64 20 28  rse...   (fold (
01a0: 6c 61 6d 62 64 61 20 28 69 20 61 63 63 29 20 0a  lambda (i acc) .
01b0: 09 09 09 20 20 20 28 6c 65 74 20 28 5b 61 20 28  ...   (let ([a (
01c0: 73 74 72 69 6e 67 2d 72 65 66 20 78 20 69 29 5d  string-ref x i)]
01d0: 20 0a 09 09 09 09 20 5b 62 20 28 69 66 20 28 3c   ..... [b (if (<
01e0: 20 28 2b 20 31 20 69 29 20 6c 65 6e 29 20 28 73   (+ 1 i) len) (s
01f0: 74 72 69 6e 67 2d 72 65 66 20 78 20 28 2b 20 31  tring-ref x (+ 1
0200: 20 69 29 29 20 23 66 29 5d 0a 09 09 09 09 20 5b   i)) #f)]..... [
0210: 63 20 28 69 66 20 28 3e 20 69 20 30 29 20 28 73  c (if (> i 0) (s
0220: 74 72 69 6e 67 2d 72 65 66 20 78 20 28 2d 20 69  tring-ref x (- i
0230: 20 31 29 29 20 23 66 29 5d 29 0a 09 09 09 20 20   1)) #f)])....  
0240: 20 20 20 28 69 66 20 28 61 6e 64 20 28 63 68 61     (if (and (cha
0250: 72 2d 75 70 70 65 72 2d 63 61 73 65 3f 20 61 29  r-upper-case? a)
0260: 20 0a 09 09 09 09 20 20 20 20 20 20 62 20 28 6e   .....      b (n
0270: 6f 74 20 28 63 68 61 72 2d 75 70 70 65 72 2d 63  ot (char-upper-c
0280: 61 73 65 3f 20 62 29 29 20 63 20 28 6e 6f 74 20  ase? b)) c (not 
0290: 28 63 68 61 72 2d 75 70 70 65 72 2d 63 61 73 65  (char-upper-case
02a0: 3f 20 63 29 29 29 0a 09 09 09 09 20 28 63 6f 6e  ? c)))..... (con
02b0: 73 20 28 63 68 61 72 2d 64 6f 77 6e 63 61 73 65  s (char-downcase
02c0: 20 61 29 20 28 69 66 20 28 61 6e 64 20 63 20 28   a) (if (and c (
02d0: 63 68 61 72 3d 3f 20 63 20 23 5c 2d 29 29 20 61  char=? c #\-)) a
02e0: 63 63 20 28 63 6f 6e 73 20 23 5c 2d 20 61 63 63  cc (cons #\- acc
02f0: 29 29 29 0a 09 09 09 09 20 28 63 6f 6e 73 20 28  )))..... (cons (
0300: 63 68 61 72 2d 64 6f 77 6e 63 61 73 65 20 61 29  char-downcase a)
0310: 20 61 63 63 29 29 29 29 20 27 28 29 20 28 69 6f   acc)))) '() (io
0320: 74 61 20 6c 65 6e 29 29 29 29 5d 29 0a 09 20 0a  ta len))))]).. .
0330: 09 20 73 29 29 0a 20 20 20 20 20 0a 20 20 20 20  . s)).     .    
0340: 20 28 64 65 66 69 6e 65 20 28 72 65 6e 61 6d 65   (define (rename
0350: 2d 73 63 68 65 6d 65 2d 3e 63 20 74 79 70 65 29  -scheme->c type)
0360: 0a 20 20 20 20 20 20 20 28 63 6f 6e 64 20 5b 28  .       (cond [(
0370: 63 61 73 65 20 28 73 79 6e 74 61 78 2d 3e 64 61  case (syntax->da
0380: 74 75 6d 20 74 79 70 65 29 0a 09 09 5b 28 75 6e  tum type)...[(un
0390: 6b 6e 6f 77 6e 29 20 27 75 6e 6b 6e 6f 77 6e 5d  known) 'unknown]
03a0: 0a 09 09 5b 65 6c 73 65 20 23 66 5d 29 0a 09 20  ...[else #f]).. 
03b0: 20 20 20 20 20 3d 3e 20 28 6c 61 6d 62 64 61 20       => (lambda 
03c0: 28 74 29 0a 09 09 20 20 20 28 64 61 74 75 6d 2d  (t)...   (datum-
03d0: 3e 73 79 6e 74 61 78 20 74 79 70 65 20 74 29 29  >syntax type t))
03e0: 5d 0a 09 20 20 20 20 20 5b 65 6c 73 65 20 74 79  ]..     [else ty
03f0: 70 65 5d 29 29 0a 0a 20 20 20 20 20 28 64 65 66  pe]))..     (def
0400: 69 6e 65 20 28 63 6f 6e 76 65 72 74 2d 73 63 68  ine (convert-sch
0410: 65 6d 65 2d 3e 63 20 66 75 6e 63 74 69 6f 6e 2d  eme->c function-
0420: 6e 61 6d 65 20 6e 61 6d 65 20 74 79 70 65 29 0a  name name type).
0430: 20 20 20 20 20 20 20 6e 61 6d 65 29 0a 0a 20 20         name)..  
0440: 20 20 20 28 64 65 66 69 6e 65 20 28 64 61 74 75     (define (datu
0450: 6d 2d 3e 73 74 72 69 6e 67 20 78 29 0a 20 20 20  m->string x).   
0460: 20 20 20 20 28 73 79 6d 62 6f 6c 2d 3e 73 74 72      (symbol->str
0470: 69 6e 67 20 28 73 79 6e 74 61 78 2d 3e 64 61 74  ing (syntax->dat
0480: 75 6d 20 78 29 29 29 0a 0a 20 20 20 20 20 28 64  um x)))..     (d
0490: 65 66 69 6e 65 20 28 73 74 72 69 6e 67 2d 3e 64  efine (string->d
04a0: 61 74 75 6d 20 74 20 78 29 0a 20 20 20 20 20 20  atum t x).      
04b0: 20 28 64 61 74 75 6d 2d 3e 73 79 6e 74 61 78 20   (datum->syntax 
04c0: 74 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  t (string->symbo
04d0: 6c 20 78 29 29 29 0a 0a 20 20 20 20 20 28 73 79  l x)))..     (sy
04e0: 6e 74 61 78 2d 63 61 73 65 20 78 20 28 29 0a 20  ntax-case x (). 
04f0: 20 20 20 20 20 20 5b 28 5f 20 72 65 74 2d 74 79        [(_ ret-ty
0500: 70 65 20 6e 61 6d 65 20 28 28 61 72 67 2d 6e 61  pe name ((arg-na
0510: 6d 65 20 61 72 67 2d 74 79 70 65 29 20 2e 2e 2e  me arg-type) ...
0520: 29 20 63 2d 6e 61 6d 65 29 20 0a 09 28 77 69 74  ) c-name) ..(wit
0530: 68 2d 73 79 6e 74 61 78 20 28 3b 5b 6e 61 6d 65  h-syntax (;[name
0540: 2f 73 74 72 69 6e 67 20 28 64 61 74 75 6d 2d 3e  /string (datum->
0550: 73 74 72 69 6e 67 20 23 27 6e 61 6d 65 29 5d 0a  string #'name)].
0560: 09 09 20 20 20 20 20 20 3b 5b 6e 61 6d 65 20 28  ..      ;[name (
0570: 73 74 72 69 6e 67 2d 3e 64 61 74 75 6d 20 23 27  string->datum #'
0580: 6e 61 6d 65 20 28 61 6e 74 69 2d 63 61 6d 65 6c  name (anti-camel
0590: 20 28 64 61 74 75 6d 2d 3e 73 74 72 69 6e 67 20   (datum->string 
05a0: 23 27 6e 61 6d 65 29 29 29 5d 0a 09 09 20 20 20  #'name)))]...   
05b0: 20 20 20 5b 28 72 65 6e 61 6d 65 64 2d 74 79 70     [(renamed-typ
05c0: 65 20 2e 2e 2e 29 20 28 6d 61 70 20 72 65 6e 61  e ...) (map rena
05d0: 6d 65 2d 73 63 68 65 6d 65 2d 3e 63 20 23 27 28  me-scheme->c #'(
05e0: 61 72 67 2d 74 79 70 65 20 2e 2e 2e 29 29 5d 0a  arg-type ...))].
05f0: 09 09 20 20 20 20 20 20 5b 72 65 6e 61 6d 65 64  ..      [renamed
0600: 2d 72 65 74 20 28 72 65 6e 61 6d 65 2d 73 63 68  -ret (rename-sch
0610: 65 6d 65 2d 3e 63 20 23 27 72 65 74 2d 74 79 70  eme->c #'ret-typ
0620: 65 29 5d 0a 09 09 20 20 20 20 20 20 5b 66 75 6e  e)]...      [fun
0630: 63 74 69 6f 6e 2d 66 74 79 70 65 20 28 64 61 74  ction-ftype (dat
0640: 75 6d 2d 3e 73 79 6e 74 61 78 20 23 27 6e 61 6d  um->syntax #'nam
0650: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  e (string->symbo
0660: 6c 20 28 73 74 72 69 6e 67 2d 61 70 70 65 6e 64  l (string-append
0670: 20 28 73 79 6d 62 6f 6c 2d 3e 73 74 72 69 6e 67   (symbol->string
0680: 20 28 73 79 6e 74 61 78 2d 3e 64 61 74 75 6d 20   (syntax->datum 
0690: 23 27 6e 61 6d 65 29 29 20 22 2d 66 74 22 29 29  #'name)) "-ft"))
06a0: 29 5d 0a 09 09 20 20 20 20 20 20 5b 28 28 61 72  )]...      [((ar
06b0: 67 2d 6e 61 6d 65 20 61 72 67 2d 63 6f 6e 76 65  g-name arg-conve
06c0: 72 74 29 20 2e 2e 2e 29 20 28 6d 61 70 20 28 6c  rt) ...) (map (l
06d0: 61 6d 62 64 61 20 28 6e 20 74 29 20 0a 09 09 09  ambda (n t) ....
06e0: 09 09 09 09 20 20 20 28 6c 69 73 74 20 6e 20 28  ....   (list n (
06f0: 63 6f 6e 76 65 72 74 2d 73 63 68 65 6d 65 2d 3e  convert-scheme->
0700: 63 20 23 27 6e 61 6d 65 20 6e 20 74 29 29 29 20  c #'name n t))) 
0710: 0a 09 09 09 09 09 09 09 20 23 27 28 61 72 67 2d  ........ #'(arg-
0720: 6e 61 6d 65 20 2e 2e 2e 29 20 23 27 28 61 72 67  name ...) #'(arg
0730: 2d 74 79 70 65 20 2e 2e 2e 29 29 5d 29 0a 09 09  -type ...))])...
0740: 20 20 20 20 20 23 60 28 62 65 67 69 6e 0a 09 09       #`(begin...
0750: 09 20 28 64 65 66 69 6e 65 20 28 6e 61 6d 65 20  . (define (name 
0760: 61 72 67 2d 6e 61 6d 65 20 2e 2e 2e 29 20 0a 09  arg-name ...) ..
0770: 09 09 20 20 20 28 64 65 66 69 6e 65 2d 66 74 79  ..   (define-fty
0780: 70 65 20 66 75 6e 63 74 69 6f 6e 2d 66 74 79 70  pe function-ftyp
0790: 65 20 28 66 75 6e 63 74 69 6f 6e 20 28 72 65 6e  e (function (ren
07a0: 61 6d 65 64 2d 74 79 70 65 20 2e 2e 2e 29 20 72  amed-type ...) r
07b0: 65 6e 61 6d 65 64 2d 72 65 74 29 29 0a 09 09 09  enamed-ret))....
07c0: 20 20 20 28 6c 65 74 2a 20 28 5b 66 75 6e 63 74     (let* ([funct
07d0: 69 6f 6e 2d 66 70 74 72 20 20 28 6d 61 6b 65 2d  ion-fptr  (make-
07e0: 66 74 79 70 65 2d 70 6f 69 6e 74 65 72 20 66 75  ftype-pointer fu
07f0: 6e 63 74 69 6f 6e 2d 66 74 79 70 65 20 63 2d 6e  nction-ftype c-n
0800: 61 6d 65 29 5d 0a 09 09 09 09 20 20 5b 66 75 6e  ame)].....  [fun
0810: 63 74 69 6f 6e 20 20 20 20 20 20 20 28 66 74 79  ction       (fty
0820: 70 65 2d 72 65 66 20 66 75 6e 63 74 69 6f 6e 2d  pe-ref function-
0830: 66 74 79 70 65 20 28 29 20 66 75 6e 63 74 69 6f  ftype () functio
0840: 6e 2d 66 70 74 72 29 5d 0a 09 09 09 09 20 20 5b  n-fptr)].....  [
0850: 61 72 67 2d 6e 61 6d 65 20 61 72 67 2d 63 6f 6e  arg-name arg-con
0860: 76 65 72 74 5d 20 2e 2e 2e 29 0a 09 09 09 20 20  vert] ...)....  
0870: 20 20 20 28 6c 65 74 20 28 5b 72 65 73 75 6c 74     (let ([result
0880: 20 28 66 75 6e 63 74 69 6f 6e 20 61 72 67 2d 6e   (function arg-n
0890: 61 6d 65 20 2e 2e 2e 29 5d 29 0a 09 09 09 20 20  ame ...)])....  
08a0: 20 20 20 20 20 23 2c 28 63 61 73 65 20 28 73 79       #,(case (sy
08b0: 6e 74 61 78 2d 3e 64 61 74 75 6d 20 23 27 72 65  ntax->datum #'re
08c0: 74 2d 74 79 70 65 29 0a 09 09 09 09 20 20 20 5b  t-type).....   [
08d0: 28 69 6e 74 25 29 20 20 20 20 20 20 20 20 20 20  (int%)          
08e0: 20 20 20 23 27 28 69 66 20 28 3c 20 72 65 73 75     #'(if (< resu
08f0: 6c 74 20 30 29 20 28 72 61 69 73 65 20 28 6d 61  lt 0) (raise (ma
0900: 6b 65 2d 73 64 6c 32 2d 63 6f 6e 64 69 74 69 6f  ke-sdl2-conditio
0910: 6e 20 28 73 64 6c 2d 67 65 74 2d 65 72 72 6f 72  n (sdl-get-error
0920: 20 72 65 73 75 6c 74 29 29 29 29 5d 0a 09 09 09   result))))]....
0930: 09 20 20 20 5b 28 28 2a 20 73 64 6c 2d 74 65 78  .   [((* sdl-tex
0940: 74 75 72 65 2d 74 29 0a 09 09 09 09 20 20 20 20  ture-t).....    
0950: 20 28 2a 20 73 64 6c 2d 73 75 72 66 61 63 65 2d   (* sdl-surface-
0960: 74 29 0a 09 09 09 09 20 20 20 20 20 28 2a 20 73  t).....     (* s
0970: 64 6c 2d 63 75 72 73 6f 72 2d 74 29 0a 09 09 09  dl-cursor-t)....
0980: 09 20 20 20 20 20 28 2a 20 73 64 6c 2d 70 69 78  .     (* sdl-pix
0990: 65 6c 2d 66 6f 72 6d 61 74 2d 74 29 0a 09 09 09  el-format-t)....
09a0: 09 20 20 20 20 20 28 2a 20 73 64 6c 2d 70 61 6c  .     (* sdl-pal
09b0: 65 74 74 65 2d 74 29 0a 09 09 09 09 20 20 20 20  ette-t).....    
09c0: 20 28 2a 20 73 64 6c 2d 72 77 2d 6f 70 73 2d 74   (* sdl-rw-ops-t
09d0: 29 0a 09 09 09 09 20 20 20 20 20 28 2a 20 73 64  ).....     (* sd
09e0: 6c 2d 6d 75 74 65 78 2d 74 29 0a 09 09 09 09 20  l-mutex-t)..... 
09f0: 20 20 20 20 28 2a 20 73 64 6c 2d 77 69 6e 64 6f      (* sdl-windo
0a00: 77 2d 74 29 0a 09 09 09 09 20 20 20 20 20 28 2a  w-t).....     (*
0a10: 20 73 64 6c 2d 73 65 6d 2d 74 29 0a 09 09 09 09   sdl-sem-t).....
0a20: 20 20 20 20 20 28 2a 20 73 64 6c 2d 63 6f 6e 64       (* sdl-cond
0a30: 2d 74 29 0a 09 09 09 09 20 20 20 20 20 28 2a 20  -t).....     (* 
0a40: 73 64 6c 2d 72 65 6e 64 65 72 65 72 2d 74 29 29  sdl-renderer-t))
0a50: 20 20 23 27 28 73 64 6c 2d 67 75 61 72 64 2d 70    #'(sdl-guard-p
0a60: 6f 69 6e 74 65 72 20 72 65 73 75 6c 74 29 5d 0a  ointer result)].
0a70: 09 09 09 09 20 20 20 5b 65 6c 73 65 20 23 27 72  ....   [else #'r
0a80: 65 73 75 6c 74 5d 29 29 29 29 29 29 5d 29 29 29  esult]))))))])))
0a90: 0a 20 20 20 20 20 0a 20 28 64 65 66 69 6e 65 2d  .     . (define-
0aa0: 73 79 6e 74 61 78 20 6e 65 77 2d 73 74 72 75 63  syntax new-struc
0ab0: 74 0a 20 20 20 28 6c 61 6d 62 64 61 20 28 78 29  t.   (lambda (x)
0ac0: 0a 20 20 20 20 20 28 73 79 6e 74 61 78 2d 63 61  .     (syntax-ca
0ad0: 73 65 20 78 20 28 29 0a 20 20 20 20 20 20 20 5b  se x ().       [
0ae0: 28 5f 20 66 74 79 70 65 2d 6e 61 6d 65 20 28 66  (_ ftype-name (f
0af0: 69 65 6c 64 20 76 61 6c 75 65 29 20 2e 2e 2e 20  ield value) ... 
0b00: 29 0a 09 23 27 28 6c 65 74 20 28 5b 6f 62 6a 65  )..#'(let ([obje
0b10: 63 74 20 28 6d 61 6b 65 2d 66 74 79 70 65 2d 70  ct (make-ftype-p
0b20: 6f 69 6e 74 65 72 20 0a 09 09 09 20 66 74 79 70  ointer .... ftyp
0b30: 65 2d 6e 61 6d 65 0a 09 09 09 20 28 66 6f 72 65  e-name.... (fore
0b40: 69 67 6e 2d 61 6c 6c 6f 63 20 28 66 74 79 70 65  ign-alloc (ftype
0b50: 2d 73 69 7a 65 6f 66 20 66 74 79 70 65 2d 6e 61  -sizeof ftype-na
0b60: 6d 65 29 29 29 5d 29 0a 09 20 20 20 20 28 66 74  me)))])..    (ft
0b70: 79 70 65 2d 73 65 74 21 20 66 74 79 70 65 2d 6e  ype-set! ftype-n
0b80: 61 6d 65 20 28 66 69 65 6c 64 29 20 6f 62 6a 65  ame (field) obje
0b90: 63 74 20 76 61 6c 75 65 29 20 2e 2e 2e 0a 09 20  ct value) ..... 
0ba0: 20 20 20 28 73 64 6c 2d 67 75 61 72 64 2d 70 6f     (sdl-guard-po
0bb0: 69 6e 74 65 72 20 6f 62 6a 65 63 74 29 29 5d 29  inter object))])
0bc0: 29 29 0a 0a 0a 3b 3b 20 54 68 69 73 20 69 73 20  ))...;; This is 
0bd0: 75 73 65 66 75 6c 20 69 66 20 74 68 65 20 63 20  useful if the c 
0be0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
0bf0: 20 76 61 6c 75 65 73 20 62 79 20 72 65 66 65 72   values by refer
0c00: 65 6e 63 65 20 28 70 6f 69 6e 74 65 72 73 29 0a  ence (pointers).
0c10: 3b 3b 20 74 68 65 20 6d 61 63 72 6f 20 61 75 74  ;; the macro aut
0c20: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  omatically alloc
0c30: 61 74 65 73 20 74 68 65 20 76 61 72 69 61 62 6c  ates the variabl
0c40: 65 73 20 61 6e 64 20 72 65 66 65 72 65 6e 63 65  es and reference
0c50: 73 20 74 68 65 20 76 61 6c 75 65 73 20 61 66 74  s the values aft
0c60: 65 72 20 74 68 65 20 63 61 6c 6c 2e 0a 3b 3b 0a  er the call..;;.
0c70: 28 64 65 66 69 6e 65 2d 73 79 6e 74 61 78 20 73  (define-syntax s
0c80: 64 6c 2d 6c 65 74 2d 72 65 66 2d 63 61 6c 6c 0a  dl-let-ref-call.
0c90: 20 20 28 6c 61 6d 62 64 61 20 28 78 29 0a 20 20    (lambda (x).  
0ca0: 20 20 28 73 79 6e 74 61 78 2d 63 61 73 65 20 78    (syntax-case x
0cb0: 20 28 29 0a 20 20 20 20 20 20 5b 28 6b 20 66 75   ().      [(k fu
0cc0: 6e 63 20 28 70 61 72 61 6d 20 2e 2e 2e 29 20 72  nc (param ...) r
0cd0: 65 73 75 6c 74 20 62 6f 64 79 20 2e 2e 2e 29 20  esult body ...) 
0ce0: 0a 20 20 20 20 20 20 20 28 77 69 74 68 2d 73 79  .       (with-sy
0cf0: 6e 74 61 78 20 28 5b 28 28 76 61 72 20 76 61 6c  ntax ([((var val
0d00: 29 20 2e 2e 2e 29 20 28 6d 61 70 20 28 6c 61 6d  ) ...) (map (lam
0d10: 62 64 61 20 28 70 29 0a 09 09 09 09 09 20 20 20  bda (p)......   
0d20: 20 20 28 6c 65 74 20 28 5b 70 2a 20 28 73 79 6e    (let ([p* (syn
0d30: 74 61 78 2d 3e 64 61 74 75 6d 20 70 29 5d 29 0a  tax->datum p)]).
0d40: 09 09 09 09 09 20 20 20 20 20 20 20 28 69 66 20  .....       (if 
0d50: 28 70 61 69 72 3f 20 70 2a 29 0a 09 09 09 09 09  (pair? p*)......
0d60: 09 20 20 20 28 6c 69 73 74 20 28 64 61 74 75 6d  .   (list (datum
0d70: 2d 3e 73 79 6e 74 61 78 20 23 27 6b 20 28 63 61  ->syntax #'k (ca
0d80: 72 20 70 2a 29 29 20 0a 09 09 09 09 09 09 09 20  r p*)) ........ 
0d90: 23 60 28 73 64 6c 2d 67 75 61 72 64 2d 70 6f 69  #`(sdl-guard-poi
0da0: 6e 74 65 72 20 0a 09 09 09 09 09 09 09 20 20 20  nter ........   
0db0: 20 28 6d 61 6b 65 2d 66 74 79 70 65 2d 70 6f 69   (make-ftype-poi
0dc0: 6e 74 65 72 20 0a 09 09 09 09 09 09 09 20 20 20  nter ........   
0dd0: 20 20 23 2c 28 64 61 74 75 6d 2d 3e 73 79 6e 74    #,(datum->synt
0de0: 61 78 20 23 27 6b 20 28 63 61 64 72 20 70 2a 29  ax #'k (cadr p*)
0df0: 29 0a 09 09 09 09 09 09 09 20 20 20 20 20 28 66  )........     (f
0e00: 6f 72 65 69 67 6e 2d 61 6c 6c 6f 63 20 0a 09 09  oreign-alloc ...
0e10: 09 09 09 09 09 20 20 20 20 20 20 28 66 74 79 70  .....      (ftyp
0e20: 65 2d 73 69 7a 65 6f 66 20 23 2c 28 64 61 74 75  e-sizeof #,(datu
0e30: 6d 2d 3e 73 79 6e 74 61 78 20 23 27 6b 20 28 63  m->syntax #'k (c
0e40: 61 64 72 20 70 2a 29 29 29 29 29 29 29 0a 09 09  adr p*)))))))...
0e50: 09 09 09 09 20 20 20 28 6c 69 73 74 20 70 20 70  ....   (list p p
0e60: 29 29 29 29 20 23 27 28 70 61 72 61 6d 20 2e 2e  )))) #'(param ..
0e70: 2e 29 29 5d 29 0a 09 09 20 20 20 20 28 77 69 74  .))])...    (wit
0e80: 68 2d 73 79 6e 74 61 78 0a 09 09 20 20 20 20 20  h-syntax...     
0e90: 28 5b 28 76 61 6c 32 20 2e 2e 2e 29 20 28 6d 61  ([(val2 ...) (ma
0ea0: 70 20 28 6c 61 6d 62 64 61 20 28 70 20 76 29 0a  p (lambda (p v).
0eb0: 09 09 09 09 09 20 20 20 20 20 28 6c 65 74 20 28  .....     (let (
0ec0: 5b 70 2a 20 28 73 79 6e 74 61 78 2d 3e 64 61 74  [p* (syntax->dat
0ed0: 75 6d 20 70 29 5d 29 0a 09 09 09 09 09 20 20 20  um p)])......   
0ee0: 20 20 20 20 28 69 66 20 28 70 61 69 72 3f 20 70      (if (pair? p
0ef0: 2a 29 0a 09 09 09 09 09 09 20 20 20 20 20 28 69  *).......     (i
0f00: 66 20 28 6d 65 6d 71 20 27 26 20 70 2a 29 0a 09  f (memq '& p*)..
0f10: 09 09 09 09 09 09 20 23 60 28 66 74 79 70 65 2d  ...... #`(ftype-
0f20: 26 72 65 66 0a 09 09 09 09 09 09 09 20 20 20 20  &ref........    
0f30: 23 2c 28 64 61 74 75 6d 2d 3e 73 79 6e 74 61 78  #,(datum->syntax
0f40: 20 23 27 6b 20 28 63 61 64 72 20 70 2a 29 29 0a   #'k (cadr p*)).
0f50: 09 09 09 09 09 09 09 20 20 20 20 28 29 0a 09 09  .......    ()...
0f60: 09 09 09 09 09 20 20 20 20 23 2c 76 29 0a 09 09  .....    #,v)...
0f70: 09 09 09 09 09 20 23 60 28 66 74 79 70 65 2d 72  ..... #`(ftype-r
0f80: 65 66 20 0a 09 09 09 09 09 09 09 20 20 20 20 23  ef ........    #
0f90: 2c 28 64 61 74 75 6d 2d 3e 73 79 6e 74 61 78 20  ,(datum->syntax 
0fa0: 23 27 6b 20 28 63 61 64 72 20 70 2a 29 29 0a 09  #'k (cadr p*))..
0fb0: 09 09 09 09 09 09 20 20 20 20 28 29 0a 09 09 09  ......    ()....
0fc0: 09 09 09 09 20 20 20 20 23 2c 76 29 29 0a 09 09  ....    #,v))...
0fd0: 09 09 09 09 20 20 20 70 29 29 29 20 23 27 28 70  ....   p))) #'(p
0fe0: 61 72 61 6d 20 2e 2e 2e 29 20 23 27 28 76 61 72  aram ...) #'(var
0ff0: 20 2e 2e 2e 29 20 29 5d 29 0a 09 09 20 20 20 20   ...) )])...    
1000: 20 23 27 28 6c 65 74 20 28 5b 76 61 72 20 76 61   #'(let ([var va
1010: 6c 5d 20 2e 2e 2e 29 0a 09 09 09 20 28 6c 65 74  l] ...).... (let
1020: 20 28 5b 72 65 73 75 6c 74 20 28 66 75 6e 63 20   ([result (func 
1030: 76 61 72 20 2e 2e 2e 29 5d 29 0a 09 09 09 20 20  var ...)])....  
1040: 20 28 6c 65 74 20 28 28 76 61 72 20 76 61 6c 32   (let ((var val2
1050: 29 20 2e 2e 2e 29 0a 09 09 09 20 20 20 20 20 62  ) ...)....     b
1060: 6f 64 79 20 2e 2e 2e 29 29 29 29 29 5d 29 29 29  ody ...)))))])))
1070: 0a                                               .