Nicer docstring syntax for case-lambda.
[bpt/guile.git] / module / ice-9 / psyntax-pp.scm
1 (eval-when (compile) (set-current-module (resolve-module (quote (guile)))))
2 (if #f #f)
3
4 (letrec*
5 ((make-void
6 (lambda (src) (make-struct (vector-ref %expanded-vtables 0) 0 src)))
7 (make-const
8 (lambda (src exp)
9 (make-struct (vector-ref %expanded-vtables 1) 0 src exp)))
10 (make-primitive-ref
11 (lambda (src name)
12 (make-struct (vector-ref %expanded-vtables 2) 0 src name)))
13 (make-lexical-ref
14 (lambda (src name gensym)
15 (make-struct (vector-ref %expanded-vtables 3) 0 src name gensym)))
16 (make-lexical-set
17 (lambda (src name gensym exp)
18 (make-struct (vector-ref %expanded-vtables 4) 0 src name gensym exp)))
19 (make-module-ref
20 (lambda (src mod name public?)
21 (make-struct (vector-ref %expanded-vtables 5) 0 src mod name public?)))
22 (make-module-set
23 (lambda (src mod name public? exp)
24 (make-struct
25 (vector-ref %expanded-vtables 6)
26 0
27 src
28 mod
29 name
30 public?
31 exp)))
32 (make-toplevel-ref
33 (lambda (src name)
34 (make-struct (vector-ref %expanded-vtables 7) 0 src name)))
35 (make-toplevel-set
36 (lambda (src name exp)
37 (make-struct (vector-ref %expanded-vtables 8) 0 src name exp)))
38 (make-toplevel-define
39 (lambda (src name exp)
40 (make-struct (vector-ref %expanded-vtables 9) 0 src name exp)))
41 (make-conditional
42 (lambda (src test consequent alternate)
43 (make-struct
44 (vector-ref %expanded-vtables 10)
45 0
46 src
47 test
48 consequent
49 alternate)))
50 (make-application
51 (lambda (src proc args)
52 (make-struct (vector-ref %expanded-vtables 11) 0 src proc args)))
53 (make-sequence
54 (lambda (src exps)
55 (make-struct (vector-ref %expanded-vtables 12) 0 src exps)))
56 (make-lambda
57 (lambda (src meta body)
58 (make-struct (vector-ref %expanded-vtables 13) 0 src meta body)))
59 (make-lambda-case
60 (lambda (src req opt rest kw inits gensyms body alternate)
61 (make-struct
62 (vector-ref %expanded-vtables 14)
63 0
64 src
65 req
66 opt
67 rest
68 kw
69 inits
70 gensyms
71 body
72 alternate)))
73 (make-let
74 (lambda (src names gensyms vals body)
75 (make-struct
76 (vector-ref %expanded-vtables 15)
77 0
78 src
79 names
80 gensyms
81 vals
82 body)))
83 (make-letrec
84 (lambda (src in-order? names gensyms vals body)
85 (make-struct
86 (vector-ref %expanded-vtables 16)
87 0
88 src
89 in-order?
90 names
91 gensyms
92 vals
93 body)))
94 (make-dynlet
95 (lambda (src fluids vals body)
96 (make-struct
97 (vector-ref %expanded-vtables 17)
98 0
99 src
100 fluids
101 vals
102 body)))
103 (lambda?
104 (lambda (x)
105 (and (struct? x)
106 (eq? (struct-vtable x) (vector-ref %expanded-vtables 13)))))
107 (lambda-meta (lambda (x) (struct-ref x 1)))
108 (set-lambda-meta! (lambda (x v) (struct-set! x 1 v)))
109 (top-level-eval-hook (lambda (x mod) (primitive-eval x)))
110 (local-eval-hook (lambda (x mod) (primitive-eval x)))
111 (session-id
112 (let ((v (module-variable (current-module) 'syntax-session-id)))
113 (lambda () ((variable-ref v)))))
114 (put-global-definition-hook
115 (lambda (symbol type val)
116 (module-define!
117 (current-module)
118 symbol
119 (make-syntax-transformer symbol type val))))
120 (get-global-definition-hook
121 (lambda (symbol module)
122 (if (and (not module) (current-module))
123 (warn "module system is booted, we should have a module" symbol))
124 (let ((v (module-variable
125 (if module (resolve-module (cdr module)) (current-module))
126 symbol)))
127 (and v
128 (variable-bound? v)
129 (let ((val (variable-ref v)))
130 (and (macro? val)
131 (macro-type val)
132 (cons (macro-type val) (macro-binding val))))))))
133 (decorate-source
134 (lambda (e s)
135 (if (and s (supports-source-properties? e))
136 (set-source-properties! e s))
137 e))
138 (maybe-name-value!
139 (lambda (name val)
140 (if (lambda? val)
141 (let ((meta (lambda-meta val)))
142 (if (not (assq 'name meta))
143 (set-lambda-meta! val (acons 'name name meta)))))))
144 (build-void (lambda (source) (make-void source)))
145 (build-application
146 (lambda (source fun-exp arg-exps)
147 (make-application source fun-exp arg-exps)))
148 (build-conditional
149 (lambda (source test-exp then-exp else-exp)
150 (make-conditional source test-exp then-exp else-exp)))
151 (build-dynlet
152 (lambda (source fluids vals body)
153 (make-dynlet source fluids vals body)))
154 (build-lexical-reference
155 (lambda (type source name var) (make-lexical-ref source name var)))
156 (build-lexical-assignment
157 (lambda (source name var exp)
158 (maybe-name-value! name exp)
159 (make-lexical-set source name var exp)))
160 (analyze-variable
161 (lambda (mod var modref-cont bare-cont)
162 (if (not mod)
163 (bare-cont var)
164 (let ((kind (car mod)) (mod (cdr mod)))
165 (let ((key kind))
166 (cond ((memv key '(public)) (modref-cont mod var #t))
167 ((memv key '(private))
168 (if (not (equal? mod (module-name (current-module))))
169 (modref-cont mod var #f)
170 (bare-cont var)))
171 ((memv key '(bare)) (bare-cont var))
172 ((memv key '(hygiene))
173 (if (and (not (equal? mod (module-name (current-module))))
174 (module-variable (resolve-module mod) var))
175 (modref-cont mod var #f)
176 (bare-cont var)))
177 (else (syntax-violation #f "bad module kind" var mod))))))))
178 (build-global-reference
179 (lambda (source var mod)
180 (analyze-variable
181 mod
182 var
183 (lambda (mod var public?) (make-module-ref source mod var public?))
184 (lambda (var) (make-toplevel-ref source var)))))
185 (build-global-assignment
186 (lambda (source var exp mod)
187 (maybe-name-value! var exp)
188 (analyze-variable
189 mod
190 var
191 (lambda (mod var public?)
192 (make-module-set source mod var public? exp))
193 (lambda (var) (make-toplevel-set source var exp)))))
194 (build-global-definition
195 (lambda (source var exp)
196 (maybe-name-value! var exp)
197 (make-toplevel-define source var exp)))
198 (build-simple-lambda
199 (lambda (src req rest vars meta exp)
200 (make-lambda
201 src
202 meta
203 (make-lambda-case src req #f rest #f '() vars exp #f))))
204 (build-case-lambda
205 (lambda (src meta body) (make-lambda src meta body)))
206 (build-lambda-case
207 (lambda (src req opt rest kw inits vars body else-case)
208 (make-lambda-case src req opt rest kw inits vars body else-case)))
209 (build-primref
210 (lambda (src name)
211 (if (equal? (module-name (current-module)) '(guile))
212 (make-toplevel-ref src name)
213 (make-module-ref src '(guile) name #f))))
214 (build-data (lambda (src exp) (make-const src exp)))
215 (build-sequence
216 (lambda (src exps)
217 (if (null? (cdr exps)) (car exps) (make-sequence src exps))))
218 (build-let
219 (lambda (src ids vars val-exps body-exp)
220 (for-each maybe-name-value! ids val-exps)
221 (if (null? vars) body-exp (make-let src ids vars val-exps body-exp))))
222 (build-named-let
223 (lambda (src ids vars val-exps body-exp)
224 (let ((f (car vars)) (f-name (car ids)) (vars (cdr vars)) (ids (cdr ids)))
225 (let ((proc (build-simple-lambda src ids #f vars '() body-exp)))
226 (maybe-name-value! f-name proc)
227 (for-each maybe-name-value! ids val-exps)
228 (make-letrec
229 src
230 #f
231 (list f-name)
232 (list f)
233 (list proc)
234 (build-application
235 src
236 (build-lexical-reference 'fun src f-name f)
237 val-exps))))))
238 (build-letrec
239 (lambda (src in-order? ids vars val-exps body-exp)
240 (if (null? vars)
241 body-exp
242 (begin
243 (for-each maybe-name-value! ids val-exps)
244 (make-letrec src in-order? ids vars val-exps body-exp)))))
245 (make-syntax-object
246 (lambda (expression wrap module)
247 (vector 'syntax-object expression wrap module)))
248 (syntax-object?
249 (lambda (x)
250 (and (vector? x)
251 (= (vector-length x) 4)
252 (eq? (vector-ref x 0) 'syntax-object))))
253 (syntax-object-expression (lambda (x) (vector-ref x 1)))
254 (syntax-object-wrap (lambda (x) (vector-ref x 2)))
255 (syntax-object-module (lambda (x) (vector-ref x 3)))
256 (set-syntax-object-expression!
257 (lambda (x update) (vector-set! x 1 update)))
258 (set-syntax-object-wrap!
259 (lambda (x update) (vector-set! x 2 update)))
260 (set-syntax-object-module!
261 (lambda (x update) (vector-set! x 3 update)))
262 (source-annotation
263 (lambda (x)
264 (let ((props (source-properties
265 (if (syntax-object? x) (syntax-object-expression x) x))))
266 (and (pair? props) props))))
267 (extend-env
268 (lambda (labels bindings r)
269 (if (null? labels)
270 r
271 (extend-env
272 (cdr labels)
273 (cdr bindings)
274 (cons (cons (car labels) (car bindings)) r)))))
275 (extend-var-env
276 (lambda (labels vars r)
277 (if (null? labels)
278 r
279 (extend-var-env
280 (cdr labels)
281 (cdr vars)
282 (cons (cons (car labels) (cons 'lexical (car vars))) r)))))
283 (macros-only-env
284 (lambda (r)
285 (if (null? r)
286 '()
287 (let ((a (car r)))
288 (if (eq? (cadr a) 'macro)
289 (cons a (macros-only-env (cdr r)))
290 (macros-only-env (cdr r)))))))
291 (lookup
292 (lambda (x r mod)
293 (let ((t (assq x r)))
294 (cond (t (cdr t))
295 ((symbol? x) (or (get-global-definition-hook x mod) '(global)))
296 (else '(displaced-lexical))))))
297 (global-extend
298 (lambda (type sym val) (put-global-definition-hook sym type val)))
299 (nonsymbol-id?
300 (lambda (x)
301 (and (syntax-object? x) (symbol? (syntax-object-expression x)))))
302 (id? (lambda (x)
303 (if (symbol? x)
304 #t
305 (and (syntax-object? x) (symbol? (syntax-object-expression x))))))
306 (id-sym-name&marks
307 (lambda (x w)
308 (if (syntax-object? x)
309 (values
310 (syntax-object-expression x)
311 (join-marks (car w) (car (syntax-object-wrap x))))
312 (values x (car w)))))
313 (gen-label
314 (lambda ()
315 (string-append "l-" (session-id) (symbol->string (gensym "-")))))
316 (gen-labels
317 (lambda (ls)
318 (if (null? ls) '() (cons (gen-label) (gen-labels (cdr ls))))))
319 (make-ribcage
320 (lambda (symnames marks labels)
321 (vector 'ribcage symnames marks labels)))
322 (ribcage?
323 (lambda (x)
324 (and (vector? x)
325 (= (vector-length x) 4)
326 (eq? (vector-ref x 0) 'ribcage))))
327 (ribcage-symnames (lambda (x) (vector-ref x 1)))
328 (ribcage-marks (lambda (x) (vector-ref x 2)))
329 (ribcage-labels (lambda (x) (vector-ref x 3)))
330 (set-ribcage-symnames! (lambda (x update) (vector-set! x 1 update)))
331 (set-ribcage-marks! (lambda (x update) (vector-set! x 2 update)))
332 (set-ribcage-labels! (lambda (x update) (vector-set! x 3 update)))
333 (anti-mark
334 (lambda (w) (cons (cons #f (car w)) (cons 'shift (cdr w)))))
335 (extend-ribcage!
336 (lambda (ribcage id label)
337 (set-ribcage-symnames!
338 ribcage
339 (cons (syntax-object-expression id) (ribcage-symnames ribcage)))
340 (set-ribcage-marks!
341 ribcage
342 (cons (car (syntax-object-wrap id)) (ribcage-marks ribcage)))
343 (set-ribcage-labels! ribcage (cons label (ribcage-labels ribcage)))))
344 (make-binding-wrap
345 (lambda (ids labels w)
346 (if (null? ids)
347 w
348 (cons (car w)
349 (cons (let* ((labelvec (list->vector labels)) (n (vector-length labelvec)))
350 (let ((symnamevec (make-vector n)) (marksvec (make-vector n)))
351 (let f ((ids ids) (i 0))
352 (if (not (null? ids))
353 (call-with-values
354 (lambda () (id-sym-name&marks (car ids) w))
355 (lambda (symname marks)
356 (vector-set! symnamevec i symname)
357 (vector-set! marksvec i marks)
358 (f (cdr ids) (+ i 1))))))
359 (make-ribcage symnamevec marksvec labelvec)))
360 (cdr w))))))
361 (smart-append (lambda (m1 m2) (if (null? m2) m1 (append m1 m2))))
362 (join-wraps
363 (lambda (w1 w2)
364 (let ((m1 (car w1)) (s1 (cdr w1)))
365 (if (null? m1)
366 (if (null? s1) w2 (cons (car w2) (smart-append s1 (cdr w2))))
367 (cons (smart-append m1 (car w2)) (smart-append s1 (cdr w2)))))))
368 (join-marks (lambda (m1 m2) (smart-append m1 m2)))
369 (same-marks?
370 (lambda (x y)
371 (or (eq? x y)
372 (and (not (null? x))
373 (not (null? y))
374 (eq? (car x) (car y))
375 (same-marks? (cdr x) (cdr y))))))
376 (id-var-name
377 (lambda (id w)
378 (letrec*
379 ((search
380 (lambda (sym subst marks)
381 (if (null? subst)
382 (values #f marks)
383 (let ((fst (car subst)))
384 (if (eq? fst 'shift)
385 (search sym (cdr subst) (cdr marks))
386 (let ((symnames (ribcage-symnames fst)))
387 (if (vector? symnames)
388 (search-vector-rib sym subst marks symnames fst)
389 (search-list-rib sym subst marks symnames fst))))))))
390 (search-list-rib
391 (lambda (sym subst marks symnames ribcage)
392 (let f ((symnames symnames) (i 0))
393 (cond ((null? symnames) (search sym (cdr subst) marks))
394 ((and (eq? (car symnames) sym)
395 (same-marks? marks (list-ref (ribcage-marks ribcage) i)))
396 (values (list-ref (ribcage-labels ribcage) i) marks))
397 (else (f (cdr symnames) (+ i 1)))))))
398 (search-vector-rib
399 (lambda (sym subst marks symnames ribcage)
400 (let ((n (vector-length symnames)))
401 (let f ((i 0))
402 (cond ((= i n) (search sym (cdr subst) marks))
403 ((and (eq? (vector-ref symnames i) sym)
404 (same-marks? marks (vector-ref (ribcage-marks ribcage) i)))
405 (values (vector-ref (ribcage-labels ribcage) i) marks))
406 (else (f (+ i 1)))))))))
407 (cond ((symbol? id) (or (search id (cdr w) (car w)) id))
408 ((syntax-object? id)
409 (let ((id (syntax-object-expression id)) (w1 (syntax-object-wrap id)))
410 (let ((marks (join-marks (car w) (car w1))))
411 (call-with-values
412 (lambda () (search id (cdr w) marks))
413 (lambda (new-id marks) (or new-id (search id (cdr w1) marks) id))))))
414 (else (syntax-violation 'id-var-name "invalid id" id))))))
415 (locally-bound-identifiers
416 (lambda (w mod)
417 (letrec*
418 ((scan (lambda (subst results)
419 (if (null? subst)
420 results
421 (let ((fst (car subst)))
422 (if (eq? fst 'shift)
423 (scan (cdr subst) results)
424 (let ((symnames (ribcage-symnames fst)) (marks (ribcage-marks fst)))
425 (if (vector? symnames)
426 (scan-vector-rib subst symnames marks results)
427 (scan-list-rib subst symnames marks results))))))))
428 (scan-list-rib
429 (lambda (subst symnames marks results)
430 (let f ((symnames symnames) (marks marks) (results results))
431 (if (null? symnames)
432 (scan (cdr subst) results)
433 (f (cdr symnames)
434 (cdr marks)
435 (cons (wrap (car symnames) (anti-mark (cons (car marks) subst)) mod)
436 results))))))
437 (scan-vector-rib
438 (lambda (subst symnames marks results)
439 (let ((n (vector-length symnames)))
440 (let f ((i 0) (results results))
441 (if (= i n)
442 (scan (cdr subst) results)
443 (f (+ i 1)
444 (cons (wrap (vector-ref symnames i)
445 (anti-mark (cons (vector-ref marks i) subst))
446 mod)
447 results))))))))
448 (scan (cdr w) '()))))
449 (resolve-identifier
450 (lambda (id w r mod)
451 (letrec*
452 ((resolve-global
453 (lambda (var mod)
454 (let ((b (or (get-global-definition-hook var mod) '(global))))
455 (if (eq? (car b) 'global)
456 (values 'global var mod)
457 (values (car b) (cdr b) mod)))))
458 (resolve-lexical
459 (lambda (label mod)
460 (let ((b (or (assq-ref r label) '(displaced-lexical))))
461 (values (car b) (cdr b) mod)))))
462 (let ((n (id-var-name id w)))
463 (cond ((symbol? n)
464 (resolve-global
465 n
466 (if (syntax-object? id) (syntax-object-module id) mod)))
467 ((string? n)
468 (resolve-lexical
469 n
470 (if (syntax-object? id) (syntax-object-module id) mod)))
471 (else (error "unexpected id-var-name" id w n)))))))
472 (transformer-environment
473 (make-fluid
474 (lambda (k)
475 (error "called outside the dynamic extent of a syntax transformer"))))
476 (with-transformer-environment
477 (lambda (k) ((fluid-ref transformer-environment) k)))
478 (free-id=?
479 (lambda (i j)
480 (and (eq? (let ((x i)) (if (syntax-object? x) (syntax-object-expression x) x))
481 (let ((x j)) (if (syntax-object? x) (syntax-object-expression x) x)))
482 (eq? (id-var-name i '(())) (id-var-name j '(()))))))
483 (bound-id=?
484 (lambda (i j)
485 (if (and (syntax-object? i) (syntax-object? j))
486 (and (eq? (syntax-object-expression i) (syntax-object-expression j))
487 (same-marks?
488 (car (syntax-object-wrap i))
489 (car (syntax-object-wrap j))))
490 (eq? i j))))
491 (valid-bound-ids?
492 (lambda (ids)
493 (and (let all-ids? ((ids ids))
494 (or (null? ids) (and (id? (car ids)) (all-ids? (cdr ids)))))
495 (distinct-bound-ids? ids))))
496 (distinct-bound-ids?
497 (lambda (ids)
498 (let distinct? ((ids ids))
499 (or (null? ids)
500 (and (not (bound-id-member? (car ids) (cdr ids)))
501 (distinct? (cdr ids)))))))
502 (bound-id-member?
503 (lambda (x list)
504 (and (not (null? list))
505 (or (bound-id=? x (car list)) (bound-id-member? x (cdr list))))))
506 (wrap (lambda (x w defmod)
507 (cond ((and (null? (car w)) (null? (cdr w))) x)
508 ((syntax-object? x)
509 (make-syntax-object
510 (syntax-object-expression x)
511 (join-wraps w (syntax-object-wrap x))
512 (syntax-object-module x)))
513 ((null? x) x)
514 (else (make-syntax-object x w defmod)))))
515 (source-wrap
516 (lambda (x w s defmod) (wrap (decorate-source x s) w defmod)))
517 (expand-sequence
518 (lambda (body r w s mod)
519 (build-sequence
520 s
521 (let dobody ((body body) (r r) (w w) (mod mod))
522 (if (null? body)
523 '()
524 (let ((first (expand (car body) r w mod)))
525 (cons first (dobody (cdr body) r w mod))))))))
526 (expand-top-sequence
527 (lambda (body r w s m esew mod)
528 (letrec*
529 ((scan (lambda (body r w s m esew mod exps)
530 (if (null? body)
531 exps
532 (call-with-values
533 (lambda ()
534 (call-with-values
535 (lambda ()
536 (let ((e (car body)))
537 (syntax-type e r w (or (source-annotation e) s) #f mod #f)))
538 (lambda (type value form e w s mod)
539 (let ((key type))
540 (cond ((memv key '(begin-form))
541 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_))))
542 (if tmp-1
543 (apply (lambda () exps) tmp-1)
544 (let ((tmp-1 ($sc-dispatch tmp '(_ any . each-any))))
545 (if tmp-1
546 (apply (lambda (e1 e2) (scan (cons e1 e2) r w s m esew mod exps))
547 tmp-1)
548 (syntax-violation
549 #f
550 "source expression failed to match any pattern"
551 tmp))))))
552 ((memv key '(local-syntax-form))
553 (expand-local-syntax
554 value
555 e
556 r
557 w
558 s
559 mod
560 (lambda (body r w s mod) (scan body r w s m esew mod exps))))
561 ((memv key '(eval-when-form))
562 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any . each-any))))
563 (if tmp
564 (apply (lambda (x e1 e2)
565 (let ((when-list (parse-when-list e x)) (body (cons e1 e2)))
566 (cond ((eq? m 'e)
567 (if (memq 'eval when-list)
568 (scan body
569 r
570 w
571 s
572 (if (memq 'expand when-list) 'c&e 'e)
573 '(eval)
574 mod
575 exps)
576 (begin
577 (if (memq 'expand when-list)
578 (top-level-eval-hook
579 (expand-top-sequence body r w s 'e '(eval) mod)
580 mod))
581 (values exps))))
582 ((memq 'load when-list)
583 (cond ((or (memq 'compile when-list)
584 (memq 'expand when-list)
585 (and (eq? m 'c&e) (memq 'eval when-list)))
586 (scan body r w s 'c&e '(compile load) mod exps))
587 ((memq m '(c c&e))
588 (scan body r w s 'c '(load) mod exps))
589 (else (values exps))))
590 ((or (memq 'compile when-list)
591 (memq 'expand when-list)
592 (and (eq? m 'c&e) (memq 'eval when-list)))
593 (top-level-eval-hook
594 (expand-top-sequence body r w s 'e '(eval) mod)
595 mod)
596 (values exps))
597 (else (values exps)))))
598 tmp)
599 (syntax-violation
600 #f
601 "source expression failed to match any pattern"
602 tmp-1))))
603 ((memv key '(define-syntax-form define-syntax-parameter-form))
604 (let ((n (id-var-name value w)) (r (macros-only-env r)))
605 (let ((key m))
606 (cond ((memv key '(c))
607 (cond ((memq 'compile esew)
608 (let ((e (expand-install-global n (expand e r w mod))))
609 (top-level-eval-hook e mod)
610 (if (memq 'load esew) (values (cons e exps)) (values exps))))
611 ((memq 'load esew)
612 (values
613 (cons (expand-install-global n (expand e r w mod)) exps)))
614 (else (values exps))))
615 ((memv key '(c&e))
616 (let ((e (expand-install-global n (expand e r w mod))))
617 (top-level-eval-hook e mod)
618 (values (cons e exps))))
619 (else
620 (if (memq 'eval esew)
621 (top-level-eval-hook
622 (expand-install-global n (expand e r w mod))
623 mod))
624 (values exps))))))
625 ((memv key '(define-form))
626 (let* ((n (id-var-name value w)) (type (car (lookup n r mod))) (key type))
627 (cond ((memv key '(global core macro module-ref))
628 (if (and (memq m '(c c&e))
629 (not (module-local-variable (current-module) n))
630 (current-module))
631 (let ((old (module-variable (current-module) n)))
632 (if (and (variable? old) (variable-bound? old))
633 (module-define! (current-module) n (variable-ref old))
634 (module-add! (current-module) n (make-undefined-variable)))))
635 (values
636 (cons (if (eq? m 'c&e)
637 (let ((x (build-global-definition s n (expand e r w mod))))
638 (top-level-eval-hook x mod)
639 x)
640 (lambda () (build-global-definition s n (expand e r w mod))))
641 exps)))
642 ((memv key '(displaced-lexical))
643 (syntax-violation
644 #f
645 "identifier out of context"
646 (source-wrap form w s mod)
647 (wrap value w mod)))
648 (else
649 (syntax-violation
650 #f
651 "cannot define keyword at top level"
652 (source-wrap form w s mod)
653 (wrap value w mod))))))
654 (else
655 (values
656 (cons (if (eq? m 'c&e)
657 (let ((x (expand-expr type value form e r w s mod)))
658 (top-level-eval-hook x mod)
659 x)
660 (lambda () (expand-expr type value form e r w s mod)))
661 exps))))))))
662 (lambda (exps) (scan (cdr body) r w s m esew mod exps)))))))
663 (call-with-values
664 (lambda () (scan body r w s m esew mod '()))
665 (lambda (exps)
666 (if (null? exps)
667 (build-void s)
668 (build-sequence
669 s
670 (let lp ((in exps) (out '()))
671 (if (null? in)
672 out
673 (let ((e (car in)))
674 (lp (cdr in) (cons (if (procedure? e) (e) e) out))))))))))))
675 (expand-install-global
676 (lambda (name e)
677 (build-global-definition
678 #f
679 name
680 (build-application
681 #f
682 (build-primref #f 'make-syntax-transformer)
683 (list (build-data #f name) (build-data #f 'macro) e)))))
684 (parse-when-list
685 (lambda (e when-list)
686 (let ((result (strip when-list '(()))))
687 (let lp ((l result))
688 (cond ((null? l) result)
689 ((memq (car l) '(compile load eval expand)) (lp (cdr l)))
690 (else (syntax-violation 'eval-when "invalid situation" e (car l))))))))
691 (syntax-type
692 (lambda (e r w s rib mod for-car?)
693 (cond ((symbol? e)
694 (let* ((n (id-var-name e w))
695 (b (lookup n r mod))
696 (type (car b))
697 (key type))
698 (cond ((memv key '(lexical)) (values type (cdr b) e e w s mod))
699 ((memv key '(global)) (values type n e e w s mod))
700 ((memv key '(macro))
701 (if for-car?
702 (values type (cdr b) e e w s mod)
703 (syntax-type
704 (expand-macro (cdr b) e r w s rib mod)
705 r
706 '(())
707 s
708 rib
709 mod
710 #f)))
711 (else (values type (cdr b) e e w s mod)))))
712 ((pair? e)
713 (let ((first (car e)))
714 (call-with-values
715 (lambda () (syntax-type first r w s rib mod #t))
716 (lambda (ftype fval fform fe fw fs fmod)
717 (let ((key ftype))
718 (cond ((memv key '(lexical)) (values 'lexical-call fval e e w s mod))
719 ((memv key '(global))
720 (values 'global-call (make-syntax-object fval w fmod) e e w s mod))
721 ((memv key '(macro))
722 (syntax-type
723 (expand-macro fval e r w s rib mod)
724 r
725 '(())
726 s
727 rib
728 mod
729 for-car?))
730 ((memv key '(module-ref))
731 (call-with-values
732 (lambda () (fval e r w))
733 (lambda (e r w s mod) (syntax-type e r w s rib mod for-car?))))
734 ((memv key '(core)) (values 'core-form fval e e w s mod))
735 ((memv key '(local-syntax))
736 (values 'local-syntax-form fval e e w s mod))
737 ((memv key '(begin)) (values 'begin-form #f e e w s mod))
738 ((memv key '(eval-when)) (values 'eval-when-form #f e e w s mod))
739 ((memv key '(define))
740 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any any))))
741 (if (and tmp-1 (apply (lambda (name val) (id? name)) tmp-1))
742 (apply (lambda (name val) (values 'define-form name e val w s mod))
743 tmp-1)
744 (let ((tmp-1 ($sc-dispatch tmp '(_ (any . any) any . each-any))))
745 (if (and tmp-1
746 (apply (lambda (name args e1 e2)
747 (and (id? name) (valid-bound-ids? (lambda-var-list args))))
748 tmp-1))
749 (apply (lambda (name args e1 e2)
750 (values
751 'define-form
752 (wrap name w mod)
753 (wrap e w mod)
754 (decorate-source
755 (cons '#(syntax-object lambda ((top)) (hygiene guile))
756 (wrap (cons args (cons e1 e2)) w mod))
757 s)
758 '(())
759 s
760 mod))
761 tmp-1)
762 (let ((tmp-1 ($sc-dispatch tmp '(_ any))))
763 (if (and tmp-1 (apply (lambda (name) (id? name)) tmp-1))
764 (apply (lambda (name)
765 (values
766 'define-form
767 (wrap name w mod)
768 (wrap e w mod)
769 '(#(syntax-object if ((top)) (hygiene guile)) #f #f)
770 '(())
771 s
772 mod))
773 tmp-1)
774 (syntax-violation
775 #f
776 "source expression failed to match any pattern"
777 tmp))))))))
778 ((memv key '(define-syntax))
779 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
780 (if (and tmp (apply (lambda (name val) (id? name)) tmp))
781 (apply (lambda (name val) (values 'define-syntax-form name e val w s mod))
782 tmp)
783 (syntax-violation
784 #f
785 "source expression failed to match any pattern"
786 tmp-1))))
787 ((memv key '(define-syntax-parameter))
788 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
789 (if (and tmp (apply (lambda (name val) (id? name)) tmp))
790 (apply (lambda (name val)
791 (values 'define-syntax-parameter-form name e val w s mod))
792 tmp)
793 (syntax-violation
794 #f
795 "source expression failed to match any pattern"
796 tmp-1))))
797 (else (values 'call #f e e w s mod))))))))
798 ((syntax-object? e)
799 (syntax-type
800 (syntax-object-expression e)
801 r
802 (join-wraps w (syntax-object-wrap e))
803 (or (source-annotation e) s)
804 rib
805 (or (syntax-object-module e) mod)
806 for-car?))
807 ((self-evaluating? e) (values 'constant #f e e w s mod))
808 (else (values 'other #f e e w s mod)))))
809 (expand
810 (lambda (e r w mod)
811 (call-with-values
812 (lambda () (syntax-type e r w (source-annotation e) #f mod #f))
813 (lambda (type value form e w s mod)
814 (expand-expr type value form e r w s mod)))))
815 (expand-expr
816 (lambda (type value form e r w s mod)
817 (let ((key type))
818 (cond ((memv key '(lexical)) (build-lexical-reference 'value s e value))
819 ((memv key '(core core-form)) (value e r w s mod))
820 ((memv key '(module-ref))
821 (call-with-values
822 (lambda () (value e r w))
823 (lambda (e r w s mod) (expand e r w mod))))
824 ((memv key '(lexical-call))
825 (expand-application
826 (let ((id (car e)))
827 (build-lexical-reference
828 'fun
829 (source-annotation id)
830 (if (syntax-object? id) (syntax->datum id) id)
831 value))
832 e
833 r
834 w
835 s
836 mod))
837 ((memv key '(global-call))
838 (expand-application
839 (build-global-reference
840 (source-annotation (car e))
841 (if (syntax-object? value) (syntax-object-expression value) value)
842 (if (syntax-object? value) (syntax-object-module value) mod))
843 e
844 r
845 w
846 s
847 mod))
848 ((memv key '(constant))
849 (build-data s (strip (source-wrap e w s mod) '(()))))
850 ((memv key '(global)) (build-global-reference s value mod))
851 ((memv key '(call))
852 (expand-application (expand (car e) r w mod) e r w s mod))
853 ((memv key '(begin-form))
854 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any . each-any))))
855 (if tmp-1
856 (apply (lambda (e1 e2) (expand-sequence (cons e1 e2) r w s mod))
857 tmp-1)
858 (let ((tmp-1 ($sc-dispatch tmp '(_))))
859 (if tmp-1
860 (apply (lambda ()
861 (if (include-deprecated-features)
862 (begin
863 (issue-deprecation-warning
864 "Sequences of zero expressions are deprecated. Use *unspecified*.")
865 (expand-void))
866 (syntax-violation
867 #f
868 "sequence of zero expressions"
869 (source-wrap e w s mod))))
870 tmp-1)
871 (syntax-violation
872 #f
873 "source expression failed to match any pattern"
874 tmp))))))
875 ((memv key '(local-syntax-form))
876 (expand-local-syntax value e r w s mod expand-sequence))
877 ((memv key '(eval-when-form))
878 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any . each-any))))
879 (if tmp
880 (apply (lambda (x e1 e2)
881 (let ((when-list (parse-when-list e x)))
882 (if (memq 'eval when-list)
883 (expand-sequence (cons e1 e2) r w s mod)
884 (expand-void))))
885 tmp)
886 (syntax-violation
887 #f
888 "source expression failed to match any pattern"
889 tmp-1))))
890 ((memv key
891 '(define-form define-syntax-form define-syntax-parameter-form))
892 (syntax-violation
893 #f
894 "definition in expression context, where definitions are not allowed,"
895 (source-wrap form w s mod)))
896 ((memv key '(syntax))
897 (syntax-violation
898 #f
899 "reference to pattern variable outside syntax form"
900 (source-wrap e w s mod)))
901 ((memv key '(displaced-lexical))
902 (syntax-violation
903 #f
904 "reference to identifier outside its scope"
905 (source-wrap e w s mod)))
906 (else
907 (syntax-violation #f "unexpected syntax" (source-wrap e w s mod)))))))
908 (expand-application
909 (lambda (x e r w s mod)
910 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(any . each-any))))
911 (if tmp
912 (apply (lambda (e0 e1)
913 (build-application s x (map (lambda (e) (expand e r w mod)) e1)))
914 tmp)
915 (syntax-violation
916 #f
917 "source expression failed to match any pattern"
918 tmp-1)))))
919 (expand-macro
920 (lambda (p e r w s rib mod)
921 (letrec*
922 ((rebuild-macro-output
923 (lambda (x m)
924 (cond ((pair? x)
925 (decorate-source
926 (cons (rebuild-macro-output (car x) m)
927 (rebuild-macro-output (cdr x) m))
928 s))
929 ((syntax-object? x)
930 (let ((w (syntax-object-wrap x)))
931 (let ((ms (car w)) (ss (cdr w)))
932 (if (and (pair? ms) (eq? (car ms) #f))
933 (make-syntax-object
934 (syntax-object-expression x)
935 (cons (cdr ms) (if rib (cons rib (cdr ss)) (cdr ss)))
936 (syntax-object-module x))
937 (make-syntax-object
938 (decorate-source (syntax-object-expression x) s)
939 (cons (cons m ms)
940 (if rib (cons rib (cons 'shift ss)) (cons 'shift ss)))
941 (syntax-object-module x))))))
942 ((vector? x)
943 (let* ((n (vector-length x)) (v (decorate-source (make-vector n) s)))
944 (let loop ((i 0))
945 (if (= i n)
946 (begin (if #f #f) v)
947 (begin
948 (vector-set! v i (rebuild-macro-output (vector-ref x i) m))
949 (loop (+ i 1)))))))
950 ((symbol? x)
951 (syntax-violation
952 #f
953 "encountered raw symbol in macro output"
954 (source-wrap e w (cdr w) mod)
955 x))
956 (else (decorate-source x s))))))
957 (with-fluids
958 ((transformer-environment (lambda (k) (k e r w s rib mod))))
959 (rebuild-macro-output
960 (p (source-wrap e (anti-mark w) s mod))
961 (gensym (string-append "m-" (session-id) "-")))))))
962 (expand-body
963 (lambda (body outer-form r w mod)
964 (let* ((r (cons '("placeholder" placeholder) r))
965 (ribcage (make-ribcage '() '() '()))
966 (w (cons (car w) (cons ribcage (cdr w)))))
967 (let parse ((body (map (lambda (x) (cons r (wrap x w mod))) body))
968 (ids '())
969 (labels '())
970 (var-ids '())
971 (vars '())
972 (vals '())
973 (bindings '()))
974 (if (null? body)
975 (syntax-violation #f "no expressions in body" outer-form)
976 (let ((e (cdar body)) (er (caar body)))
977 (call-with-values
978 (lambda ()
979 (syntax-type e er '(()) (source-annotation e) ribcage mod #f))
980 (lambda (type value form e w s mod)
981 (let ((key type))
982 (cond ((memv key '(define-form))
983 (let ((id (wrap value w mod)) (label (gen-label)))
984 (let ((var (gen-var id)))
985 (extend-ribcage! ribcage id label)
986 (parse (cdr body)
987 (cons id ids)
988 (cons label labels)
989 (cons id var-ids)
990 (cons var vars)
991 (cons (cons er (wrap e w mod)) vals)
992 (cons (cons 'lexical var) bindings)))))
993 ((memv key '(define-syntax-form define-syntax-parameter-form))
994 (let ((id (wrap value w mod))
995 (label (gen-label))
996 (trans-r (macros-only-env er)))
997 (extend-ribcage! ribcage id label)
998 (set-cdr!
999 r
1000 (extend-env
1001 (list label)
1002 (list (cons 'macro (eval-local-transformer (expand e trans-r w mod) mod)))
1003 (cdr r)))
1004 (parse (cdr body) (cons id ids) labels var-ids vars vals bindings)))
1005 ((memv key '(begin-form))
1006 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . each-any))))
1007 (if tmp
1008 (apply (lambda (e1)
1009 (parse (let f ((forms e1))
1010 (if (null? forms)
1011 (cdr body)
1012 (cons (cons er (wrap (car forms) w mod)) (f (cdr forms)))))
1013 ids
1014 labels
1015 var-ids
1016 vars
1017 vals
1018 bindings))
1019 tmp)
1020 (syntax-violation
1021 #f
1022 "source expression failed to match any pattern"
1023 tmp-1))))
1024 ((memv key '(local-syntax-form))
1025 (expand-local-syntax
1026 value
1027 e
1028 er
1029 w
1030 s
1031 mod
1032 (lambda (forms er w s mod)
1033 (parse (let f ((forms forms))
1034 (if (null? forms)
1035 (cdr body)
1036 (cons (cons er (wrap (car forms) w mod)) (f (cdr forms)))))
1037 ids
1038 labels
1039 var-ids
1040 vars
1041 vals
1042 bindings))))
1043 ((null? ids)
1044 (build-sequence
1045 #f
1046 (map (lambda (x) (expand (cdr x) (car x) '(()) mod))
1047 (cons (cons er (source-wrap e w s mod)) (cdr body)))))
1048 (else
1049 (if (not (valid-bound-ids? ids))
1050 (syntax-violation
1051 #f
1052 "invalid or duplicate identifier in definition"
1053 outer-form))
1054 (set-cdr! r (extend-env labels bindings (cdr r)))
1055 (build-letrec
1056 #f
1057 #t
1058 (reverse (map syntax->datum var-ids))
1059 (reverse vars)
1060 (map (lambda (x) (expand (cdr x) (car x) '(()) mod)) (reverse vals))
1061 (build-sequence
1062 #f
1063 (map (lambda (x) (expand (cdr x) (car x) '(()) mod))
1064 (cons (cons er (source-wrap e w s mod)) (cdr body))))))))))))))))
1065 (expand-local-syntax
1066 (lambda (rec? e r w s mod k)
1067 (let* ((tmp e)
1068 (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
1069 (if tmp
1070 (apply (lambda (id val e1 e2)
1071 (let ((ids id))
1072 (if (not (valid-bound-ids? ids))
1073 (syntax-violation #f "duplicate bound keyword" e)
1074 (let* ((labels (gen-labels ids)) (new-w (make-binding-wrap ids labels w)))
1075 (k (cons e1 e2)
1076 (extend-env
1077 labels
1078 (let ((w (if rec? new-w w)) (trans-r (macros-only-env r)))
1079 (map (lambda (x)
1080 (cons 'macro (eval-local-transformer (expand x trans-r w mod) mod)))
1081 val))
1082 r)
1083 new-w
1084 s
1085 mod)))))
1086 tmp)
1087 (syntax-violation
1088 #f
1089 "bad local syntax definition"
1090 (source-wrap e w s mod))))))
1091 (eval-local-transformer
1092 (lambda (expanded mod)
1093 (let ((p (local-eval-hook expanded mod)))
1094 (if (procedure? p)
1095 p
1096 (syntax-violation #f "nonprocedure transformer" p)))))
1097 (expand-void (lambda () (build-void #f)))
1098 (ellipsis?
1099 (lambda (x)
1100 (and (nonsymbol-id? x)
1101 (free-id=? x '#(syntax-object ... ((top)) (hygiene guile))))))
1102 (lambda-formals
1103 (lambda (orig-args)
1104 (letrec*
1105 ((req (lambda (args rreq)
1106 (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
1107 (if tmp-1
1108 (apply (lambda () (check (reverse rreq) #f)) tmp-1)
1109 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1110 (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
1111 (apply (lambda (a b) (req b (cons a rreq))) tmp-1)
1112 (let ((tmp-1 (list tmp)))
1113 (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
1114 (apply (lambda (r) (check (reverse rreq) r)) tmp-1)
1115 (let ((else tmp))
1116 (syntax-violation 'lambda "invalid argument list" orig-args args))))))))))
1117 (check (lambda (req rest)
1118 (if (distinct-bound-ids? (if rest (cons rest req) req))
1119 (values req #f rest #f)
1120 (syntax-violation
1121 'lambda
1122 "duplicate identifier in argument list"
1123 orig-args)))))
1124 (req orig-args '()))))
1125 (expand-simple-lambda
1126 (lambda (e r w s mod req rest meta body)
1127 (let* ((ids (if rest (append req (list rest)) req))
1128 (vars (map gen-var ids))
1129 (labels (gen-labels ids)))
1130 (build-simple-lambda
1131 s
1132 (map syntax->datum req)
1133 (and rest (syntax->datum rest))
1134 vars
1135 meta
1136 (expand-body
1137 body
1138 (source-wrap e w s mod)
1139 (extend-var-env labels vars r)
1140 (make-binding-wrap ids labels w)
1141 mod)))))
1142 (lambda*-formals
1143 (lambda (orig-args)
1144 (letrec*
1145 ((req (lambda (args rreq)
1146 (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
1147 (if tmp-1
1148 (apply (lambda () (check (reverse rreq) '() #f '())) tmp-1)
1149 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1150 (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
1151 (apply (lambda (a b) (req b (cons a rreq))) tmp-1)
1152 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1153 (if (and tmp-1
1154 (apply (lambda (a b) (eq? (syntax->datum a) #:optional)) tmp-1))
1155 (apply (lambda (a b) (opt b (reverse rreq) '())) tmp-1)
1156 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1157 (if (and tmp-1
1158 (apply (lambda (a b) (eq? (syntax->datum a) #:key)) tmp-1))
1159 (apply (lambda (a b) (key b (reverse rreq) '() '())) tmp-1)
1160 (let ((tmp-1 ($sc-dispatch tmp '(any any))))
1161 (if (and tmp-1
1162 (apply (lambda (a b) (eq? (syntax->datum a) #:rest)) tmp-1))
1163 (apply (lambda (a b) (rest b (reverse rreq) '() '())) tmp-1)
1164 (let ((tmp-1 (list tmp)))
1165 (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
1166 (apply (lambda (r) (rest r (reverse rreq) '() '())) tmp-1)
1167 (let ((else tmp))
1168 (syntax-violation
1169 'lambda*
1170 "invalid argument list"
1171 orig-args
1172 args))))))))))))))))
1173 (opt (lambda (args req ropt)
1174 (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
1175 (if tmp-1
1176 (apply (lambda () (check req (reverse ropt) #f '())) tmp-1)
1177 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1178 (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
1179 (apply (lambda (a b) (opt b req (cons (cons a '(#f)) ropt))) tmp-1)
1180 (let ((tmp-1 ($sc-dispatch tmp '((any any) . any))))
1181 (if (and tmp-1 (apply (lambda (a init b) (id? a)) tmp-1))
1182 (apply (lambda (a init b) (opt b req (cons (list a init) ropt)))
1183 tmp-1)
1184 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1185 (if (and tmp-1
1186 (apply (lambda (a b) (eq? (syntax->datum a) #:key)) tmp-1))
1187 (apply (lambda (a b) (key b req (reverse ropt) '())) tmp-1)
1188 (let ((tmp-1 ($sc-dispatch tmp '(any any))))
1189 (if (and tmp-1
1190 (apply (lambda (a b) (eq? (syntax->datum a) #:rest)) tmp-1))
1191 (apply (lambda (a b) (rest b req (reverse ropt) '())) tmp-1)
1192 (let ((tmp-1 (list tmp)))
1193 (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
1194 (apply (lambda (r) (rest r req (reverse ropt) '())) tmp-1)
1195 (let ((else tmp))
1196 (syntax-violation
1197 'lambda*
1198 "invalid optional argument list"
1199 orig-args
1200 args))))))))))))))))
1201 (key (lambda (args req opt rkey)
1202 (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
1203 (if tmp-1
1204 (apply (lambda () (check req opt #f (cons #f (reverse rkey)))) tmp-1)
1205 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1206 (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
1207 (apply (lambda (a b)
1208 (let* ((tmp (symbol->keyword (syntax->datum a))) (k tmp))
1209 (key b req opt (cons (cons k (cons a '(#f))) rkey))))
1210 tmp-1)
1211 (let ((tmp-1 ($sc-dispatch tmp '((any any) . any))))
1212 (if (and tmp-1 (apply (lambda (a init b) (id? a)) tmp-1))
1213 (apply (lambda (a init b)
1214 (let* ((tmp (symbol->keyword (syntax->datum a))) (k tmp))
1215 (key b req opt (cons (list k a init) rkey))))
1216 tmp-1)
1217 (let ((tmp-1 ($sc-dispatch tmp '((any any any) . any))))
1218 (if (and tmp-1
1219 (apply (lambda (a init k b) (and (id? a) (keyword? (syntax->datum k))))
1220 tmp-1))
1221 (apply (lambda (a init k b) (key b req opt (cons (list k a init) rkey)))
1222 tmp-1)
1223 (let ((tmp-1 ($sc-dispatch tmp '(any))))
1224 (if (and tmp-1
1225 (apply (lambda (aok) (eq? (syntax->datum aok) #:allow-other-keys))
1226 tmp-1))
1227 (apply (lambda (aok) (check req opt #f (cons #t (reverse rkey))))
1228 tmp-1)
1229 (let ((tmp-1 ($sc-dispatch tmp '(any any any))))
1230 (if (and tmp-1
1231 (apply (lambda (aok a b)
1232 (and (eq? (syntax->datum aok) #:allow-other-keys)
1233 (eq? (syntax->datum a) #:rest)))
1234 tmp-1))
1235 (apply (lambda (aok a b) (rest b req opt (cons #t (reverse rkey))))
1236 tmp-1)
1237 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1238 (if (and tmp-1
1239 (apply (lambda (aok r)
1240 (and (eq? (syntax->datum aok) #:allow-other-keys) (id? r)))
1241 tmp-1))
1242 (apply (lambda (aok r) (rest r req opt (cons #t (reverse rkey))))
1243 tmp-1)
1244 (let ((tmp-1 ($sc-dispatch tmp '(any any))))
1245 (if (and tmp-1
1246 (apply (lambda (a b) (eq? (syntax->datum a) #:rest)) tmp-1))
1247 (apply (lambda (a b) (rest b req opt (cons #f (reverse rkey))))
1248 tmp-1)
1249 (let ((tmp-1 (list tmp)))
1250 (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
1251 (apply (lambda (r) (rest r req opt (cons #f (reverse rkey))))
1252 tmp-1)
1253 (let ((else tmp))
1254 (syntax-violation
1255 'lambda*
1256 "invalid keyword argument list"
1257 orig-args
1258 args))))))))))))))))))))))
1259 (rest (lambda (args req opt kw)
1260 (let* ((tmp-1 args) (tmp (list tmp-1)))
1261 (if (and tmp (apply (lambda (r) (id? r)) tmp))
1262 (apply (lambda (r) (check req opt r kw)) tmp)
1263 (let ((else tmp-1))
1264 (syntax-violation 'lambda* "invalid rest argument" orig-args args))))))
1265 (check (lambda (req opt rest kw)
1266 (if (distinct-bound-ids?
1267 (append
1268 req
1269 (map car opt)
1270 (if rest (list rest) '())
1271 (if (pair? kw) (map cadr (cdr kw)) '())))
1272 (values req opt rest kw)
1273 (syntax-violation
1274 'lambda*
1275 "duplicate identifier in argument list"
1276 orig-args)))))
1277 (req orig-args '()))))
1278 (expand-lambda-case
1279 (lambda (e r w s mod get-formals clauses)
1280 (letrec*
1281 ((parse-req
1282 (lambda (req opt rest kw body)
1283 (let ((vars (map gen-var req)) (labels (gen-labels req)))
1284 (let ((r* (extend-var-env labels vars r))
1285 (w* (make-binding-wrap req labels w)))
1286 (parse-opt
1287 (map syntax->datum req)
1288 opt
1289 rest
1290 kw
1291 body
1292 (reverse vars)
1293 r*
1294 w*
1295 '()
1296 '())))))
1297 (parse-opt
1298 (lambda (req opt rest kw body vars r* w* out inits)
1299 (cond ((pair? opt)
1300 (let* ((tmp-1 (car opt)) (tmp ($sc-dispatch tmp-1 '(any any))))
1301 (if tmp
1302 (apply (lambda (id i)
1303 (let* ((v (gen-var id))
1304 (l (gen-labels (list v)))
1305 (r** (extend-var-env l (list v) r*))
1306 (w** (make-binding-wrap (list id) l w*)))
1307 (parse-opt
1308 req
1309 (cdr opt)
1310 rest
1311 kw
1312 body
1313 (cons v vars)
1314 r**
1315 w**
1316 (cons (syntax->datum id) out)
1317 (cons (expand i r* w* mod) inits))))
1318 tmp)
1319 (syntax-violation
1320 #f
1321 "source expression failed to match any pattern"
1322 tmp-1))))
1323 (rest
1324 (let* ((v (gen-var rest))
1325 (l (gen-labels (list v)))
1326 (r* (extend-var-env l (list v) r*))
1327 (w* (make-binding-wrap (list rest) l w*)))
1328 (parse-kw
1329 req
1330 (and (pair? out) (reverse out))
1331 (syntax->datum rest)
1332 (if (pair? kw) (cdr kw) kw)
1333 body
1334 (cons v vars)
1335 r*
1336 w*
1337 (and (pair? kw) (car kw))
1338 '()
1339 inits)))
1340 (else
1341 (parse-kw
1342 req
1343 (and (pair? out) (reverse out))
1344 #f
1345 (if (pair? kw) (cdr kw) kw)
1346 body
1347 vars
1348 r*
1349 w*
1350 (and (pair? kw) (car kw))
1351 '()
1352 inits)))))
1353 (parse-kw
1354 (lambda (req opt rest kw body vars r* w* aok out inits)
1355 (if (pair? kw)
1356 (let* ((tmp-1 (car kw)) (tmp ($sc-dispatch tmp-1 '(any any any))))
1357 (if tmp
1358 (apply (lambda (k id i)
1359 (let* ((v (gen-var id))
1360 (l (gen-labels (list v)))
1361 (r** (extend-var-env l (list v) r*))
1362 (w** (make-binding-wrap (list id) l w*)))
1363 (parse-kw
1364 req
1365 opt
1366 rest
1367 (cdr kw)
1368 body
1369 (cons v vars)
1370 r**
1371 w**
1372 aok
1373 (cons (list (syntax->datum k) (syntax->datum id) v) out)
1374 (cons (expand i r* w* mod) inits))))
1375 tmp)
1376 (syntax-violation
1377 #f
1378 "source expression failed to match any pattern"
1379 tmp-1)))
1380 (parse-body
1381 req
1382 opt
1383 rest
1384 (and (or aok (pair? out)) (cons aok (reverse out)))
1385 body
1386 (reverse vars)
1387 r*
1388 w*
1389 (reverse inits)
1390 '()))))
1391 (parse-body
1392 (lambda (req opt rest kw body vars r* w* inits meta)
1393 (let* ((tmp body) (tmp-1 ($sc-dispatch tmp '(any any . each-any))))
1394 (if (and tmp-1
1395 (apply (lambda (docstring e1 e2) (string? (syntax->datum docstring)))
1396 tmp-1))
1397 (apply (lambda (docstring e1 e2)
1398 (parse-body
1399 req
1400 opt
1401 rest
1402 kw
1403 (cons e1 e2)
1404 vars
1405 r*
1406 w*
1407 inits
1408 (append meta (list (cons 'documentation (syntax->datum docstring))))))
1409 tmp-1)
1410 (let ((tmp-1 ($sc-dispatch tmp '(#(vector #(each (any . any))) any . each-any))))
1411 (if tmp-1
1412 (apply (lambda (k v e1 e2)
1413 (parse-body
1414 req
1415 opt
1416 rest
1417 kw
1418 (cons e1 e2)
1419 vars
1420 r*
1421 w*
1422 inits
1423 (append meta (syntax->datum (map cons k v)))))
1424 tmp-1)
1425 (let ((tmp-1 ($sc-dispatch tmp '(any . each-any))))
1426 (if tmp-1
1427 (apply (lambda (e1 e2)
1428 (values
1429 meta
1430 req
1431 opt
1432 rest
1433 kw
1434 inits
1435 vars
1436 (expand-body (cons e1 e2) (source-wrap e w s mod) r* w* mod)))
1437 tmp-1)
1438 (syntax-violation
1439 #f
1440 "source expression failed to match any pattern"
1441 tmp))))))))))
1442 (let* ((tmp clauses) (tmp-1 ($sc-dispatch tmp '())))
1443 (if tmp-1
1444 (apply (lambda () (values '() #f)) tmp-1)
1445 (let ((tmp-1 ($sc-dispatch
1446 tmp
1447 '((any any . each-any) . #(each (any any . each-any))))))
1448 (if tmp-1
1449 (apply (lambda (args e1 e2 args* e1* e2*)
1450 (call-with-values
1451 (lambda () (get-formals args))
1452 (lambda (req opt rest kw)
1453 (call-with-values
1454 (lambda () (parse-req req opt rest kw (cons e1 e2)))
1455 (lambda (meta req opt rest kw inits vars body)
1456 (call-with-values
1457 (lambda ()
1458 (expand-lambda-case
1459 e
1460 r
1461 w
1462 s
1463 mod
1464 get-formals
1465 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1466 e2*
1467 e1*
1468 args*)))
1469 (lambda (meta* else*)
1470 (values
1471 (append meta meta*)
1472 (build-lambda-case s req opt rest kw inits vars body else*)))))))))
1473 tmp-1)
1474 (syntax-violation
1475 #f
1476 "source expression failed to match any pattern"
1477 tmp))))))))
1478 (strip (lambda (x w)
1479 (if (memq 'top (car w))
1480 x
1481 (let f ((x x))
1482 (cond ((syntax-object? x)
1483 (strip (syntax-object-expression x) (syntax-object-wrap x)))
1484 ((pair? x)
1485 (let ((a (f (car x))) (d (f (cdr x))))
1486 (if (and (eq? a (car x)) (eq? d (cdr x))) x (cons a d))))
1487 ((vector? x)
1488 (let* ((old (vector->list x)) (new (map f old)))
1489 (let lp ((l1 old) (l2 new))
1490 (cond ((null? l1) x)
1491 ((eq? (car l1) (car l2)) (lp (cdr l1) (cdr l2)))
1492 (else (list->vector new))))))
1493 (else x))))))
1494 (gen-var
1495 (lambda (id)
1496 (let ((id (if (syntax-object? id) (syntax-object-expression id) id)))
1497 (gensym (string-append (symbol->string id) "-")))))
1498 (lambda-var-list
1499 (lambda (vars)
1500 (let lvl ((vars vars) (ls '()) (w '(())))
1501 (cond ((pair? vars) (lvl (cdr vars) (cons (wrap (car vars) w #f) ls) w))
1502 ((id? vars) (cons (wrap vars w #f) ls))
1503 ((null? vars) ls)
1504 ((syntax-object? vars)
1505 (lvl (syntax-object-expression vars)
1506 ls
1507 (join-wraps w (syntax-object-wrap vars))))
1508 (else (cons vars ls)))))))
1509 (global-extend 'local-syntax 'letrec-syntax #t)
1510 (global-extend 'local-syntax 'let-syntax #f)
1511 (global-extend
1512 'core
1513 'syntax-parameterize
1514 (lambda (e r w s mod)
1515 (let* ((tmp e)
1516 (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
1517 (if (and tmp (apply (lambda (var val e1 e2) (valid-bound-ids? var)) tmp))
1518 (apply (lambda (var val e1 e2)
1519 (let ((names (map (lambda (x) (id-var-name x w)) var)))
1520 (for-each
1521 (lambda (id n)
1522 (let ((key (car (lookup n r mod))))
1523 (if (memv key '(displaced-lexical))
1524 (syntax-violation
1525 'syntax-parameterize
1526 "identifier out of context"
1527 e
1528 (source-wrap id w s mod)))))
1529 var
1530 names)
1531 (expand-body
1532 (cons e1 e2)
1533 (source-wrap e w s mod)
1534 (extend-env
1535 names
1536 (let ((trans-r (macros-only-env r)))
1537 (map (lambda (x)
1538 (cons 'macro (eval-local-transformer (expand x trans-r w mod) mod)))
1539 val))
1540 r)
1541 w
1542 mod)))
1543 tmp)
1544 (syntax-violation
1545 'syntax-parameterize
1546 "bad syntax"
1547 (source-wrap e w s mod))))))
1548 (global-extend
1549 'core
1550 'quote
1551 (lambda (e r w s mod)
1552 (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any))))
1553 (if tmp
1554 (apply (lambda (e) (build-data s (strip e w))) tmp)
1555 (syntax-violation 'quote "bad syntax" (source-wrap e w s mod))))))
1556 (global-extend
1557 'core
1558 'syntax
1559 (letrec*
1560 ((gen-syntax
1561 (lambda (src e r maps ellipsis? mod)
1562 (if (id? e)
1563 (let* ((label (id-var-name e '(()))) (b (lookup label r mod)))
1564 (cond ((eq? (car b) 'syntax)
1565 (call-with-values
1566 (lambda ()
1567 (let ((var.lev (cdr b)))
1568 (gen-ref src (car var.lev) (cdr var.lev) maps)))
1569 (lambda (var maps) (values (list 'ref var) maps))))
1570 ((ellipsis? e) (syntax-violation 'syntax "misplaced ellipsis" src))
1571 (else (values (list 'quote e) maps))))
1572 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(any any))))
1573 (if (and tmp-1 (apply (lambda (dots e) (ellipsis? dots)) tmp-1))
1574 (apply (lambda (dots e) (gen-syntax src e r maps (lambda (x) #f) mod))
1575 tmp-1)
1576 (let ((tmp-1 ($sc-dispatch tmp '(any any . any))))
1577 (if (and tmp-1 (apply (lambda (x dots y) (ellipsis? dots)) tmp-1))
1578 (apply (lambda (x dots y)
1579 (let f ((y y)
1580 (k (lambda (maps)
1581 (call-with-values
1582 (lambda () (gen-syntax src x r (cons '() maps) ellipsis? mod))
1583 (lambda (x maps)
1584 (if (null? (car maps))
1585 (syntax-violation 'syntax "extra ellipsis" src)
1586 (values (gen-map x (car maps)) (cdr maps))))))))
1587 (let* ((tmp y) (tmp ($sc-dispatch tmp '(any . any))))
1588 (if (and tmp (apply (lambda (dots y) (ellipsis? dots)) tmp))
1589 (apply (lambda (dots y)
1590 (f y
1591 (lambda (maps)
1592 (call-with-values
1593 (lambda () (k (cons '() maps)))
1594 (lambda (x maps)
1595 (if (null? (car maps))
1596 (syntax-violation 'syntax "extra ellipsis" src)
1597 (values (gen-mappend x (car maps)) (cdr maps))))))))
1598 tmp)
1599 (call-with-values
1600 (lambda () (gen-syntax src y r maps ellipsis? mod))
1601 (lambda (y maps)
1602 (call-with-values
1603 (lambda () (k maps))
1604 (lambda (x maps) (values (gen-append x y) maps)))))))))
1605 tmp-1)
1606 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1607 (if tmp-1
1608 (apply (lambda (x y)
1609 (call-with-values
1610 (lambda () (gen-syntax src x r maps ellipsis? mod))
1611 (lambda (x maps)
1612 (call-with-values
1613 (lambda () (gen-syntax src y r maps ellipsis? mod))
1614 (lambda (y maps) (values (gen-cons x y) maps))))))
1615 tmp-1)
1616 (let ((tmp ($sc-dispatch tmp '#(vector (any . each-any)))))
1617 (if tmp
1618 (apply (lambda (e1 e2)
1619 (call-with-values
1620 (lambda () (gen-syntax src (cons e1 e2) r maps ellipsis? mod))
1621 (lambda (e maps) (values (gen-vector e) maps))))
1622 tmp)
1623 (values (list 'quote e) maps))))))))))))
1624 (gen-ref
1625 (lambda (src var level maps)
1626 (cond ((= level 0) (values var maps))
1627 ((null? maps) (syntax-violation 'syntax "missing ellipsis" src))
1628 (else
1629 (call-with-values
1630 (lambda () (gen-ref src var (- level 1) (cdr maps)))
1631 (lambda (outer-var outer-maps)
1632 (let ((b (assq outer-var (car maps))))
1633 (if b
1634 (values (cdr b) maps)
1635 (let ((inner-var (gen-var 'tmp)))
1636 (values
1637 inner-var
1638 (cons (cons (cons outer-var inner-var) (car maps)) outer-maps)))))))))))
1639 (gen-mappend
1640 (lambda (e map-env)
1641 (list 'apply '(primitive append) (gen-map e map-env))))
1642 (gen-map
1643 (lambda (e map-env)
1644 (let ((formals (map cdr map-env))
1645 (actuals (map (lambda (x) (list 'ref (car x))) map-env)))
1646 (cond ((eq? (car e) 'ref) (car actuals))
1647 ((and-map
1648 (lambda (x) (and (eq? (car x) 'ref) (memq (cadr x) formals)))
1649 (cdr e))
1650 (cons 'map
1651 (cons (list 'primitive (car e))
1652 (map (let ((r (map cons formals actuals)))
1653 (lambda (x) (cdr (assq (cadr x) r))))
1654 (cdr e)))))
1655 (else (cons 'map (cons (list 'lambda formals e) actuals)))))))
1656 (gen-cons
1657 (lambda (x y)
1658 (let ((key (car y)))
1659 (cond ((memv key '(quote))
1660 (cond ((eq? (car x) 'quote) (list 'quote (cons (cadr x) (cadr y))))
1661 ((eq? (cadr y) '()) (list 'list x))
1662 (else (list 'cons x y))))
1663 ((memv key '(list)) (cons 'list (cons x (cdr y))))
1664 (else (list 'cons x y))))))
1665 (gen-append (lambda (x y) (if (equal? y ''()) x (list 'append x y))))
1666 (gen-vector
1667 (lambda (x)
1668 (cond ((eq? (car x) 'list) (cons 'vector (cdr x)))
1669 ((eq? (car x) 'quote) (list 'quote (list->vector (cadr x))))
1670 (else (list 'list->vector x)))))
1671 (regen (lambda (x)
1672 (let ((key (car x)))
1673 (cond ((memv key '(ref))
1674 (build-lexical-reference 'value #f (cadr x) (cadr x)))
1675 ((memv key '(primitive)) (build-primref #f (cadr x)))
1676 ((memv key '(quote)) (build-data #f (cadr x)))
1677 ((memv key '(lambda))
1678 (if (list? (cadr x))
1679 (build-simple-lambda #f (cadr x) #f (cadr x) '() (regen (caddr x)))
1680 (error "how did we get here" x)))
1681 (else
1682 (build-application #f (build-primref #f (car x)) (map regen (cdr x)))))))))
1683 (lambda (e r w s mod)
1684 (let* ((e (source-wrap e w s mod))
1685 (tmp e)
1686 (tmp ($sc-dispatch tmp '(_ any))))
1687 (if tmp
1688 (apply (lambda (x)
1689 (call-with-values
1690 (lambda () (gen-syntax e x r '() ellipsis? mod))
1691 (lambda (e maps) (regen e))))
1692 tmp)
1693 (syntax-violation 'syntax "bad `syntax' form" e))))))
1694 (global-extend
1695 'core
1696 'lambda
1697 (lambda (e r w s mod)
1698 (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any any . each-any))))
1699 (if tmp
1700 (apply (lambda (args e1 e2)
1701 (call-with-values
1702 (lambda () (lambda-formals args))
1703 (lambda (req opt rest kw)
1704 (let lp ((body (cons e1 e2)) (meta '()))
1705 (let* ((tmp-1 body) (tmp ($sc-dispatch tmp-1 '(any any . each-any))))
1706 (if (and tmp
1707 (apply (lambda (docstring e1 e2) (string? (syntax->datum docstring)))
1708 tmp))
1709 (apply (lambda (docstring e1 e2)
1710 (lp (cons e1 e2)
1711 (append meta (list (cons 'documentation (syntax->datum docstring))))))
1712 tmp)
1713 (let ((tmp ($sc-dispatch tmp-1 '(#(vector #(each (any . any))) any . each-any))))
1714 (if tmp
1715 (apply (lambda (k v e1 e2)
1716 (lp (cons e1 e2) (append meta (syntax->datum (map cons k v)))))
1717 tmp)
1718 (expand-simple-lambda e r w s mod req rest meta body)))))))))
1719 tmp)
1720 (syntax-violation 'lambda "bad lambda" e)))))
1721 (global-extend
1722 'core
1723 'lambda*
1724 (lambda (e r w s mod)
1725 (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any any . each-any))))
1726 (if tmp
1727 (apply (lambda (args e1 e2)
1728 (call-with-values
1729 (lambda ()
1730 (expand-lambda-case
1731 e
1732 r
1733 w
1734 s
1735 mod
1736 lambda*-formals
1737 (list (cons args (cons e1 e2)))))
1738 (lambda (meta lcase) (build-case-lambda s meta lcase))))
1739 tmp)
1740 (syntax-violation 'lambda "bad lambda*" e)))))
1741 (global-extend
1742 'core
1743 'case-lambda
1744 (lambda (e r w s mod)
1745 (letrec*
1746 ((build-it
1747 (lambda (meta clauses)
1748 (call-with-values
1749 (lambda () (expand-lambda-case e r w s mod lambda-formals clauses))
1750 (lambda (meta* lcase)
1751 (build-case-lambda s (append meta meta*) lcase))))))
1752 (let* ((tmp-1 e)
1753 (tmp ($sc-dispatch tmp-1 '(_ . #(each (any any . each-any))))))
1754 (if tmp
1755 (apply (lambda (args e1 e2)
1756 (build-it
1757 '()
1758 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1759 e2
1760 e1
1761 args)))
1762 tmp)
1763 (let ((tmp ($sc-dispatch tmp-1 '(_ any . #(each (any any . each-any))))))
1764 (if (and tmp
1765 (apply (lambda (docstring args e1 e2) (string? (syntax->datum docstring)))
1766 tmp))
1767 (apply (lambda (docstring args e1 e2)
1768 (build-it
1769 (list (cons 'documentation (syntax->datum docstring)))
1770 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1771 e2
1772 e1
1773 args)))
1774 tmp)
1775 (syntax-violation 'case-lambda "bad case-lambda" e))))))))
1776 (global-extend
1777 'core
1778 'case-lambda*
1779 (lambda (e r w s mod)
1780 (letrec*
1781 ((build-it
1782 (lambda (meta clauses)
1783 (call-with-values
1784 (lambda () (expand-lambda-case e r w s mod lambda*-formals clauses))
1785 (lambda (meta* lcase)
1786 (build-case-lambda s (append meta meta*) lcase))))))
1787 (let* ((tmp-1 e)
1788 (tmp ($sc-dispatch tmp-1 '(_ . #(each (any any . each-any))))))
1789 (if tmp
1790 (apply (lambda (args e1 e2)
1791 (build-it
1792 '()
1793 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1794 e2
1795 e1
1796 args)))
1797 tmp)
1798 (let ((tmp ($sc-dispatch tmp-1 '(_ any . #(each (any any . each-any))))))
1799 (if (and tmp
1800 (apply (lambda (docstring args e1 e2) (string? (syntax->datum docstring)))
1801 tmp))
1802 (apply (lambda (docstring args e1 e2)
1803 (build-it
1804 (list (cons 'documentation (syntax->datum docstring)))
1805 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1806 e2
1807 e1
1808 args)))
1809 tmp)
1810 (syntax-violation 'case-lambda "bad case-lambda*" e))))))))
1811 (global-extend
1812 'core
1813 'let
1814 (letrec*
1815 ((expand-let
1816 (lambda (e r w s mod constructor ids vals exps)
1817 (if (not (valid-bound-ids? ids))
1818 (syntax-violation 'let "duplicate bound variable" e)
1819 (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
1820 (let ((nw (make-binding-wrap ids labels w))
1821 (nr (extend-var-env labels new-vars r)))
1822 (constructor
1823 s
1824 (map syntax->datum ids)
1825 new-vars
1826 (map (lambda (x) (expand x r w mod)) vals)
1827 (expand-body exps (source-wrap e nw s mod) nr nw mod))))))))
1828 (lambda (e r w s mod)
1829 (let* ((tmp-1 e)
1830 (tmp ($sc-dispatch tmp-1 '(_ #(each (any any)) any . each-any))))
1831 (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
1832 (apply (lambda (id val e1 e2)
1833 (expand-let e r w s mod build-let id val (cons e1 e2)))
1834 tmp)
1835 (let ((tmp ($sc-dispatch tmp-1 '(_ any #(each (any any)) any . each-any))))
1836 (if (and tmp
1837 (apply (lambda (f id val e1 e2) (and (id? f) (and-map id? id))) tmp))
1838 (apply (lambda (f id val e1 e2)
1839 (expand-let e r w s mod build-named-let (cons f id) val (cons e1 e2)))
1840 tmp)
1841 (syntax-violation 'let "bad let" (source-wrap e w s mod)))))))))
1842 (global-extend
1843 'core
1844 'letrec
1845 (lambda (e r w s mod)
1846 (let* ((tmp e)
1847 (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
1848 (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
1849 (apply (lambda (id val e1 e2)
1850 (let ((ids id))
1851 (if (not (valid-bound-ids? ids))
1852 (syntax-violation 'letrec "duplicate bound variable" e)
1853 (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
1854 (let ((w (make-binding-wrap ids labels w))
1855 (r (extend-var-env labels new-vars r)))
1856 (build-letrec
1857 s
1858 #f
1859 (map syntax->datum ids)
1860 new-vars
1861 (map (lambda (x) (expand x r w mod)) val)
1862 (expand-body (cons e1 e2) (source-wrap e w s mod) r w mod)))))))
1863 tmp)
1864 (syntax-violation 'letrec "bad letrec" (source-wrap e w s mod))))))
1865 (global-extend
1866 'core
1867 'letrec*
1868 (lambda (e r w s mod)
1869 (let* ((tmp e)
1870 (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
1871 (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
1872 (apply (lambda (id val e1 e2)
1873 (let ((ids id))
1874 (if (not (valid-bound-ids? ids))
1875 (syntax-violation 'letrec* "duplicate bound variable" e)
1876 (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
1877 (let ((w (make-binding-wrap ids labels w))
1878 (r (extend-var-env labels new-vars r)))
1879 (build-letrec
1880 s
1881 #t
1882 (map syntax->datum ids)
1883 new-vars
1884 (map (lambda (x) (expand x r w mod)) val)
1885 (expand-body (cons e1 e2) (source-wrap e w s mod) r w mod)))))))
1886 tmp)
1887 (syntax-violation 'letrec* "bad letrec*" (source-wrap e w s mod))))))
1888 (global-extend
1889 'core
1890 'set!
1891 (lambda (e r w s mod)
1892 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
1893 (if (and tmp (apply (lambda (id val) (id? id)) tmp))
1894 (apply (lambda (id val)
1895 (let ((n (id-var-name id w))
1896 (id-mod (if (syntax-object? id) (syntax-object-module id) mod)))
1897 (let* ((b (lookup n r id-mod)) (key (car b)))
1898 (cond ((memv key '(lexical))
1899 (build-lexical-assignment
1900 s
1901 (syntax->datum id)
1902 (cdr b)
1903 (expand val r w mod)))
1904 ((memv key '(global))
1905 (build-global-assignment s n (expand val r w mod) id-mod))
1906 ((memv key '(macro))
1907 (let ((p (cdr b)))
1908 (if (procedure-property p 'variable-transformer)
1909 (expand (expand-macro p e r w s #f mod) r '(()) mod)
1910 (syntax-violation
1911 'set!
1912 "not a variable transformer"
1913 (wrap e w mod)
1914 (wrap id w id-mod)))))
1915 ((memv key '(displaced-lexical))
1916 (syntax-violation 'set! "identifier out of context" (wrap id w mod)))
1917 (else (syntax-violation 'set! "bad set!" (source-wrap e w s mod)))))))
1918 tmp)
1919 (let ((tmp ($sc-dispatch tmp-1 '(_ (any . each-any) any))))
1920 (if tmp
1921 (apply (lambda (head tail val)
1922 (call-with-values
1923 (lambda () (syntax-type head r '(()) #f #f mod #t))
1924 (lambda (type value formform ee ww ss modmod)
1925 (let ((key type))
1926 (if (memv key '(module-ref))
1927 (let ((val (expand val r w mod)))
1928 (call-with-values
1929 (lambda () (value (cons head tail) r w))
1930 (lambda (e r w s* mod)
1931 (let* ((tmp-1 e) (tmp (list tmp-1)))
1932 (if (and tmp (apply (lambda (e) (id? e)) tmp))
1933 (apply (lambda (e) (build-global-assignment s (syntax->datum e) val mod))
1934 tmp)
1935 (syntax-violation
1936 #f
1937 "source expression failed to match any pattern"
1938 tmp-1))))))
1939 (build-application
1940 s
1941 (expand
1942 (list '#(syntax-object setter ((top)) (hygiene guile)) head)
1943 r
1944 w
1945 mod)
1946 (map (lambda (e) (expand e r w mod)) (append tail (list val)))))))))
1947 tmp)
1948 (syntax-violation 'set! "bad set!" (source-wrap e w s mod))))))))
1949 (global-extend
1950 'module-ref
1951 '@
1952 (lambda (e r w)
1953 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any))))
1954 (if (and tmp
1955 (apply (lambda (mod id) (and (and-map id? mod) (id? id))) tmp))
1956 (apply (lambda (mod id)
1957 (values
1958 (syntax->datum id)
1959 r
1960 '((top))
1961 #f
1962 (syntax->datum
1963 (cons '#(syntax-object public ((top)) (hygiene guile)) mod))))
1964 tmp)
1965 (syntax-violation
1966 #f
1967 "source expression failed to match any pattern"
1968 tmp-1)))))
1969 (global-extend
1970 'module-ref
1971 '@@
1972 (lambda (e r w)
1973 (letrec*
1974 ((remodulate
1975 (lambda (x mod)
1976 (cond ((pair? x) (cons (remodulate (car x) mod) (remodulate (cdr x) mod)))
1977 ((syntax-object? x)
1978 (make-syntax-object
1979 (remodulate (syntax-object-expression x) mod)
1980 (syntax-object-wrap x)
1981 mod))
1982 ((vector? x)
1983 (let* ((n (vector-length x)) (v (make-vector n)))
1984 (let loop ((i 0))
1985 (if (= i n)
1986 (begin (if #f #f) v)
1987 (begin
1988 (vector-set! v i (remodulate (vector-ref x i) mod))
1989 (loop (+ i 1)))))))
1990 (else x)))))
1991 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any))))
1992 (if (and tmp
1993 (apply (lambda (mod id) (and (and-map id? mod) (id? id))) tmp))
1994 (apply (lambda (mod id)
1995 (values
1996 (syntax->datum id)
1997 r
1998 '((top))
1999 #f
2000 (syntax->datum
2001 (cons '#(syntax-object private ((top)) (hygiene guile)) mod))))
2002 tmp)
2003 (let ((tmp ($sc-dispatch
2004 tmp-1
2005 '(_ #(free-id #(syntax-object @@ ((top)) (hygiene guile)))
2006 each-any
2007 any))))
2008 (if (and tmp (apply (lambda (mod exp) (and-map id? mod)) tmp))
2009 (apply (lambda (mod exp)
2010 (let ((mod (syntax->datum
2011 (cons '#(syntax-object private ((top)) (hygiene guile)) mod))))
2012 (values (remodulate exp mod) r w (source-annotation exp) mod)))
2013 tmp)
2014 (syntax-violation
2015 #f
2016 "source expression failed to match any pattern"
2017 tmp-1))))))))
2018 (global-extend
2019 'core
2020 'if
2021 (lambda (e r w s mod)
2022 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any any))))
2023 (if tmp-1
2024 (apply (lambda (test then)
2025 (build-conditional
2026 s
2027 (expand test r w mod)
2028 (expand then r w mod)
2029 (build-void #f)))
2030 tmp-1)
2031 (let ((tmp-1 ($sc-dispatch tmp '(_ any any any))))
2032 (if tmp-1
2033 (apply (lambda (test then else)
2034 (build-conditional
2035 s
2036 (expand test r w mod)
2037 (expand then r w mod)
2038 (expand else r w mod)))
2039 tmp-1)
2040 (syntax-violation
2041 #f
2042 "source expression failed to match any pattern"
2043 tmp)))))))
2044 (global-extend
2045 'core
2046 'with-fluids
2047 (lambda (e r w s mod)
2048 (let* ((tmp-1 e)
2049 (tmp ($sc-dispatch tmp-1 '(_ #(each (any any)) any . each-any))))
2050 (if tmp
2051 (apply (lambda (fluid val b b*)
2052 (build-dynlet
2053 s
2054 (map (lambda (x) (expand x r w mod)) fluid)
2055 (map (lambda (x) (expand x r w mod)) val)
2056 (expand-body (cons b b*) (source-wrap e w s mod) r w mod)))
2057 tmp)
2058 (syntax-violation
2059 #f
2060 "source expression failed to match any pattern"
2061 tmp-1)))))
2062 (global-extend 'begin 'begin '())
2063 (global-extend 'define 'define '())
2064 (global-extend 'define-syntax 'define-syntax '())
2065 (global-extend 'define-syntax-parameter 'define-syntax-parameter '())
2066 (global-extend 'eval-when 'eval-when '())
2067 (global-extend
2068 'core
2069 'syntax-case
2070 (letrec*
2071 ((convert-pattern
2072 (lambda (pattern keys)
2073 (letrec*
2074 ((cvt* (lambda (p* n ids)
2075 (if (not (pair? p*))
2076 (cvt p* n ids)
2077 (call-with-values
2078 (lambda () (cvt* (cdr p*) n ids))
2079 (lambda (y ids)
2080 (call-with-values
2081 (lambda () (cvt (car p*) n ids))
2082 (lambda (x ids) (values (cons x y) ids))))))))
2083 (v-reverse
2084 (lambda (x)
2085 (let loop ((r '()) (x x))
2086 (if (not (pair? x)) (values r x) (loop (cons (car x) r) (cdr x))))))
2087 (cvt (lambda (p n ids)
2088 (if (id? p)
2089 (cond ((bound-id-member? p keys) (values (vector 'free-id p) ids))
2090 ((free-id=? p '#(syntax-object _ ((top)) (hygiene guile)))
2091 (values '_ ids))
2092 (else (values 'any (cons (cons p n) ids))))
2093 (let* ((tmp p) (tmp-1 ($sc-dispatch tmp '(any any))))
2094 (if (and tmp-1 (apply (lambda (x dots) (ellipsis? dots)) tmp-1))
2095 (apply (lambda (x dots)
2096 (call-with-values
2097 (lambda () (cvt x (+ n 1) ids))
2098 (lambda (p ids)
2099 (values (if (eq? p 'any) 'each-any (vector 'each p)) ids))))
2100 tmp-1)
2101 (let ((tmp-1 ($sc-dispatch tmp '(any any . any))))
2102 (if (and tmp-1 (apply (lambda (x dots ys) (ellipsis? dots)) tmp-1))
2103 (apply (lambda (x dots ys)
2104 (call-with-values
2105 (lambda () (cvt* ys n ids))
2106 (lambda (ys ids)
2107 (call-with-values
2108 (lambda () (cvt x (+ n 1) ids))
2109 (lambda (x ids)
2110 (call-with-values
2111 (lambda () (v-reverse ys))
2112 (lambda (ys e) (values (vector 'each+ x ys e) ids))))))))
2113 tmp-1)
2114 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
2115 (if tmp-1
2116 (apply (lambda (x y)
2117 (call-with-values
2118 (lambda () (cvt y n ids))
2119 (lambda (y ids)
2120 (call-with-values
2121 (lambda () (cvt x n ids))
2122 (lambda (x ids) (values (cons x y) ids))))))
2123 tmp-1)
2124 (let ((tmp-1 ($sc-dispatch tmp '())))
2125 (if tmp-1
2126 (apply (lambda () (values '() ids)) tmp-1)
2127 (let ((tmp-1 ($sc-dispatch tmp '#(vector each-any))))
2128 (if tmp-1
2129 (apply (lambda (x)
2130 (call-with-values
2131 (lambda () (cvt x n ids))
2132 (lambda (p ids) (values (vector 'vector p) ids))))
2133 tmp-1)
2134 (let ((x tmp)) (values (vector 'atom (strip p '(()))) ids))))))))))))))))
2135 (cvt pattern 0 '()))))
2136 (build-dispatch-call
2137 (lambda (pvars exp y r mod)
2138 (let ((ids (map car pvars)) (levels (map cdr pvars)))
2139 (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
2140 (build-application
2141 #f
2142 (build-primref #f 'apply)
2143 (list (build-simple-lambda
2144 #f
2145 (map syntax->datum ids)
2146 #f
2147 new-vars
2148 '()
2149 (expand
2150 exp
2151 (extend-env
2152 labels
2153 (map (lambda (var level) (cons 'syntax (cons var level)))
2154 new-vars
2155 (map cdr pvars))
2156 r)
2157 (make-binding-wrap ids labels '(()))
2158 mod))
2159 y))))))
2160 (gen-clause
2161 (lambda (x keys clauses r pat fender exp mod)
2162 (call-with-values
2163 (lambda () (convert-pattern pat keys))
2164 (lambda (p pvars)
2165 (cond ((not (distinct-bound-ids? (map car pvars)))
2166 (syntax-violation 'syntax-case "duplicate pattern variable" pat))
2167 ((not (and-map (lambda (x) (not (ellipsis? (car x)))) pvars))
2168 (syntax-violation 'syntax-case "misplaced ellipsis" pat))
2169 (else
2170 (let ((y (gen-var 'tmp)))
2171 (build-application
2172 #f
2173 (build-simple-lambda
2174 #f
2175 (list 'tmp)
2176 #f
2177 (list y)
2178 '()
2179 (let ((y (build-lexical-reference 'value #f 'tmp y)))
2180 (build-conditional
2181 #f
2182 (let* ((tmp fender) (tmp ($sc-dispatch tmp '#(atom #t))))
2183 (if tmp
2184 (apply (lambda () y) tmp)
2185 (build-conditional
2186 #f
2187 y
2188 (build-dispatch-call pvars fender y r mod)
2189 (build-data #f #f))))
2190 (build-dispatch-call pvars exp y r mod)
2191 (gen-syntax-case x keys clauses r mod))))
2192 (list (if (eq? p 'any)
2193 (build-application #f (build-primref #f 'list) (list x))
2194 (build-application
2195 #f
2196 (build-primref #f '$sc-dispatch)
2197 (list x (build-data #f p)))))))))))))
2198 (gen-syntax-case
2199 (lambda (x keys clauses r mod)
2200 (if (null? clauses)
2201 (build-application
2202 #f
2203 (build-primref #f 'syntax-violation)
2204 (list (build-data #f #f)
2205 (build-data #f "source expression failed to match any pattern")
2206 x))
2207 (let* ((tmp-1 (car clauses)) (tmp ($sc-dispatch tmp-1 '(any any))))
2208 (if tmp
2209 (apply (lambda (pat exp)
2210 (if (and (id? pat)
2211 (and-map
2212 (lambda (x) (not (free-id=? pat x)))
2213 (cons '#(syntax-object ... ((top)) (hygiene guile)) keys)))
2214 (if (free-id=? pat '#(syntax-object _ ((top)) (hygiene guile)))
2215 (expand exp r '(()) mod)
2216 (let ((labels (list (gen-label))) (var (gen-var pat)))
2217 (build-application
2218 #f
2219 (build-simple-lambda
2220 #f
2221 (list (syntax->datum pat))
2222 #f
2223 (list var)
2224 '()
2225 (expand
2226 exp
2227 (extend-env labels (list (cons 'syntax (cons var 0))) r)
2228 (make-binding-wrap (list pat) labels '(()))
2229 mod))
2230 (list x))))
2231 (gen-clause x keys (cdr clauses) r pat #t exp mod)))
2232 tmp)
2233 (let ((tmp ($sc-dispatch tmp-1 '(any any any))))
2234 (if tmp
2235 (apply (lambda (pat fender exp)
2236 (gen-clause x keys (cdr clauses) r pat fender exp mod))
2237 tmp)
2238 (syntax-violation 'syntax-case "invalid clause" (car clauses))))))))))
2239 (lambda (e r w s mod)
2240 (let* ((e (source-wrap e w s mod))
2241 (tmp-1 e)
2242 (tmp ($sc-dispatch tmp-1 '(_ any each-any . each-any))))
2243 (if tmp
2244 (apply (lambda (val key m)
2245 (if (and-map (lambda (x) (and (id? x) (not (ellipsis? x)))) key)
2246 (let ((x (gen-var 'tmp)))
2247 (build-application
2248 s
2249 (build-simple-lambda
2250 #f
2251 (list 'tmp)
2252 #f
2253 (list x)
2254 '()
2255 (gen-syntax-case
2256 (build-lexical-reference 'value #f 'tmp x)
2257 key
2258 m
2259 r
2260 mod))
2261 (list (expand val r '(()) mod))))
2262 (syntax-violation 'syntax-case "invalid literals list" e)))
2263 tmp)
2264 (syntax-violation
2265 #f
2266 "source expression failed to match any pattern"
2267 tmp-1))))))
2268 (set! macroexpand
2269 (lambda* (x #:optional (m 'e) (esew '(eval)))
2270 (expand-top-sequence
2271 (list x)
2272 '()
2273 '((top))
2274 #f
2275 m
2276 esew
2277 (cons 'hygiene (module-name (current-module))))))
2278 (set! identifier? (lambda (x) (nonsymbol-id? x)))
2279 (set! datum->syntax
2280 (lambda (id datum)
2281 (make-syntax-object
2282 datum
2283 (syntax-object-wrap id)
2284 (syntax-object-module id))))
2285 (set! syntax->datum (lambda (x) (strip x '(()))))
2286 (set! syntax-source (lambda (x) (source-annotation x)))
2287 (set! generate-temporaries
2288 (lambda (ls)
2289 (let ((x ls))
2290 (if (not (list? x))
2291 (syntax-violation 'generate-temporaries "invalid argument" x)))
2292 (let ((mod (cons 'hygiene (module-name (current-module)))))
2293 (map (lambda (x) (wrap (gensym "t-") '((top)) mod)) ls))))
2294 (set! free-identifier=?
2295 (lambda (x y)
2296 (let ((x x))
2297 (if (not (nonsymbol-id? x))
2298 (syntax-violation 'free-identifier=? "invalid argument" x)))
2299 (let ((x y))
2300 (if (not (nonsymbol-id? x))
2301 (syntax-violation 'free-identifier=? "invalid argument" x)))
2302 (free-id=? x y)))
2303 (set! bound-identifier=?
2304 (lambda (x y)
2305 (let ((x x))
2306 (if (not (nonsymbol-id? x))
2307 (syntax-violation 'bound-identifier=? "invalid argument" x)))
2308 (let ((x y))
2309 (if (not (nonsymbol-id? x))
2310 (syntax-violation 'bound-identifier=? "invalid argument" x)))
2311 (bound-id=? x y)))
2312 (set! syntax-violation
2313 (lambda* (who message form #:optional (subform #f))
2314 (let ((x who))
2315 (if (not (let ((x x)) (or (not x) (string? x) (symbol? x))))
2316 (syntax-violation 'syntax-violation "invalid argument" x)))
2317 (let ((x message))
2318 (if (not (string? x))
2319 (syntax-violation 'syntax-violation "invalid argument" x)))
2320 (throw 'syntax-error
2321 who
2322 message
2323 (or (source-annotation subform) (source-annotation form))
2324 (strip form '(()))
2325 (and subform (strip subform '(()))))))
2326 (letrec*
2327 ((syntax-module
2328 (lambda (id)
2329 (let ((x id))
2330 (if (not (nonsymbol-id? x))
2331 (syntax-violation 'syntax-module "invalid argument" x)))
2332 (cdr (syntax-object-module id))))
2333 (syntax-local-binding
2334 (lambda (id)
2335 (let ((x id))
2336 (if (not (nonsymbol-id? x))
2337 (syntax-violation 'syntax-local-binding "invalid argument" x)))
2338 (with-transformer-environment
2339 (lambda (e r w s rib mod)
2340 (letrec*
2341 ((strip-anti-mark
2342 (lambda (w)
2343 (let ((ms (car w)) (s (cdr w)))
2344 (if (and (pair? ms) (eq? (car ms) #f))
2345 (cons (cdr ms) (if rib (cons rib (cdr s)) (cdr s)))
2346 (cons ms (if rib (cons rib s) s)))))))
2347 (call-with-values
2348 (lambda ()
2349 (resolve-identifier
2350 (syntax-object-expression id)
2351 (strip-anti-mark (syntax-object-wrap id))
2352 r
2353 (syntax-object-module id)))
2354 (lambda (type value mod)
2355 (let ((key type))
2356 (cond ((memv key '(lexical)) (values 'lexical value))
2357 ((memv key '(macro)) (values 'macro value))
2358 ((memv key '(syntax)) (values 'pattern-variable value))
2359 ((memv key '(displaced-lexical)) (values 'displaced-lexical #f))
2360 ((memv key '(global)) (values 'global (cons value (cdr mod))))
2361 (else (values 'other #f)))))))))))
2362 (syntax-locally-bound-identifiers
2363 (lambda (id)
2364 (let ((x id))
2365 (if (not (nonsymbol-id? x))
2366 (syntax-violation
2367 'syntax-locally-bound-identifiers
2368 "invalid argument"
2369 x)))
2370 (locally-bound-identifiers
2371 (syntax-object-wrap id)
2372 (syntax-object-module id)))))
2373 (define! 'syntax-module syntax-module)
2374 (define! 'syntax-local-binding syntax-local-binding)
2375 (define!
2376 'syntax-locally-bound-identifiers
2377 syntax-locally-bound-identifiers))
2378 (letrec*
2379 ((match-each
2380 (lambda (e p w mod)
2381 (cond ((pair? e)
2382 (let ((first (match (car e) p w '() mod)))
2383 (and first
2384 (let ((rest (match-each (cdr e) p w mod)))
2385 (and rest (cons first rest))))))
2386 ((null? e) '())
2387 ((syntax-object? e)
2388 (match-each
2389 (syntax-object-expression e)
2390 p
2391 (join-wraps w (syntax-object-wrap e))
2392 (syntax-object-module e)))
2393 (else #f))))
2394 (match-each+
2395 (lambda (e x-pat y-pat z-pat w r mod)
2396 (let f ((e e) (w w))
2397 (cond ((pair? e)
2398 (call-with-values
2399 (lambda () (f (cdr e) w))
2400 (lambda (xr* y-pat r)
2401 (if r
2402 (if (null? y-pat)
2403 (let ((xr (match (car e) x-pat w '() mod)))
2404 (if xr (values (cons xr xr*) y-pat r) (values #f #f #f)))
2405 (values '() (cdr y-pat) (match (car e) (car y-pat) w r mod)))
2406 (values #f #f #f)))))
2407 ((syntax-object? e)
2408 (f (syntax-object-expression e) (join-wraps w e)))
2409 (else (values '() y-pat (match e z-pat w r mod)))))))
2410 (match-each-any
2411 (lambda (e w mod)
2412 (cond ((pair? e)
2413 (let ((l (match-each-any (cdr e) w mod)))
2414 (and l (cons (wrap (car e) w mod) l))))
2415 ((null? e) '())
2416 ((syntax-object? e)
2417 (match-each-any
2418 (syntax-object-expression e)
2419 (join-wraps w (syntax-object-wrap e))
2420 mod))
2421 (else #f))))
2422 (match-empty
2423 (lambda (p r)
2424 (cond ((null? p) r)
2425 ((eq? p '_) r)
2426 ((eq? p 'any) (cons '() r))
2427 ((pair? p) (match-empty (car p) (match-empty (cdr p) r)))
2428 ((eq? p 'each-any) (cons '() r))
2429 (else
2430 (let ((key (vector-ref p 0)))
2431 (cond ((memv key '(each)) (match-empty (vector-ref p 1) r))
2432 ((memv key '(each+))
2433 (match-empty
2434 (vector-ref p 1)
2435 (match-empty
2436 (reverse (vector-ref p 2))
2437 (match-empty (vector-ref p 3) r))))
2438 ((memv key '(free-id atom)) r)
2439 ((memv key '(vector)) (match-empty (vector-ref p 1) r))))))))
2440 (combine
2441 (lambda (r* r)
2442 (if (null? (car r*)) r (cons (map car r*) (combine (map cdr r*) r)))))
2443 (match*
2444 (lambda (e p w r mod)
2445 (cond ((null? p) (and (null? e) r))
2446 ((pair? p)
2447 (and (pair? e)
2448 (match (car e) (car p) w (match (cdr e) (cdr p) w r mod) mod)))
2449 ((eq? p 'each-any)
2450 (let ((l (match-each-any e w mod))) (and l (cons l r))))
2451 (else
2452 (let ((key (vector-ref p 0)))
2453 (cond ((memv key '(each))
2454 (if (null? e)
2455 (match-empty (vector-ref p 1) r)
2456 (let ((l (match-each e (vector-ref p 1) w mod)))
2457 (and l
2458 (let collect ((l l))
2459 (if (null? (car l)) r (cons (map car l) (collect (map cdr l)))))))))
2460 ((memv key '(each+))
2461 (call-with-values
2462 (lambda ()
2463 (match-each+
2464 e
2465 (vector-ref p 1)
2466 (vector-ref p 2)
2467 (vector-ref p 3)
2468 w
2469 r
2470 mod))
2471 (lambda (xr* y-pat r)
2472 (and r
2473 (null? y-pat)
2474 (if (null? xr*) (match-empty (vector-ref p 1) r) (combine xr* r))))))
2475 ((memv key '(free-id))
2476 (and (id? e) (free-id=? (wrap e w mod) (vector-ref p 1)) r))
2477 ((memv key '(atom)) (and (equal? (vector-ref p 1) (strip e w)) r))
2478 ((memv key '(vector))
2479 (and (vector? e) (match (vector->list e) (vector-ref p 1) w r mod)))))))))
2480 (match (lambda (e p w r mod)
2481 (cond ((not r) #f)
2482 ((eq? p '_) r)
2483 ((eq? p 'any) (cons (wrap e w mod) r))
2484 ((syntax-object? e)
2485 (match*
2486 (syntax-object-expression e)
2487 p
2488 (join-wraps w (syntax-object-wrap e))
2489 r
2490 (syntax-object-module e)))
2491 (else (match* e p w r mod))))))
2492 (set! $sc-dispatch
2493 (lambda (e p)
2494 (cond ((eq? p 'any) (list e))
2495 ((eq? p '_) '())
2496 ((syntax-object? e)
2497 (match*
2498 (syntax-object-expression e)
2499 p
2500 (syntax-object-wrap e)
2501 '()
2502 (syntax-object-module e)))
2503 (else (match* e p '(()) '() #f)))))))
2504
2505 (define with-syntax
2506 (make-syntax-transformer
2507 'with-syntax
2508 'macro
2509 (lambda (x)
2510 (let ((tmp x))
2511 (let ((tmp-1 ($sc-dispatch tmp '(_ () any . each-any))))
2512 (if tmp-1
2513 (apply (lambda (e1 e2)
2514 (cons '#(syntax-object let ((top)) (hygiene guile))
2515 (cons '() (cons e1 e2))))
2516 tmp-1)
2517 (let ((tmp-1 ($sc-dispatch tmp '(_ ((any any)) any . each-any))))
2518 (if tmp-1
2519 (apply (lambda (out in e1 e2)
2520 (list '#(syntax-object syntax-case ((top)) (hygiene guile))
2521 in
2522 '()
2523 (list out
2524 (cons '#(syntax-object let ((top)) (hygiene guile))
2525 (cons '() (cons e1 e2))))))
2526 tmp-1)
2527 (let ((tmp-1 ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
2528 (if tmp-1
2529 (apply (lambda (out in e1 e2)
2530 (list '#(syntax-object syntax-case ((top)) (hygiene guile))
2531 (cons '#(syntax-object list ((top)) (hygiene guile)) in)
2532 '()
2533 (list out
2534 (cons '#(syntax-object let ((top)) (hygiene guile))
2535 (cons '() (cons e1 e2))))))
2536 tmp-1)
2537 (syntax-violation
2538 #f
2539 "source expression failed to match any pattern"
2540 tmp)))))))))))
2541
2542 (define syntax-rules
2543 (make-syntax-transformer
2544 'syntax-rules
2545 'macro
2546 (lambda (xx)
2547 (let ((tmp-1 xx))
2548 (let ((tmp ($sc-dispatch tmp-1 '(_ each-any . #(each ((any . any) any))))))
2549 (if tmp
2550 (apply (lambda (k keyword pattern template)
2551 (list '#(syntax-object lambda ((top)) (hygiene guile))
2552 '(#(syntax-object x ((top)) (hygiene guile)))
2553 (vector
2554 '(#(syntax-object macro-type ((top)) (hygiene guile))
2555 .
2556 #(syntax-object syntax-rules ((top)) (hygiene guile)))
2557 (cons '#(syntax-object patterns ((top)) (hygiene guile)) pattern))
2558 (cons '#(syntax-object syntax-case ((top)) (hygiene guile))
2559 (cons '#(syntax-object x ((top)) (hygiene guile))
2560 (cons k
2561 (map (lambda (tmp-1 tmp)
2562 (list (cons '#(syntax-object dummy ((top)) (hygiene guile)) tmp)
2563 (list '#(syntax-object syntax ((top)) (hygiene guile))
2564 tmp-1)))
2565 template
2566 pattern))))))
2567 tmp)
2568 (let ((tmp ($sc-dispatch tmp-1 '(_ each-any any . #(each ((any . any) any))))))
2569 (if (if tmp
2570 (apply (lambda (k docstring keyword pattern template)
2571 (string? (syntax->datum docstring)))
2572 tmp)
2573 #f)
2574 (apply (lambda (k docstring keyword pattern template)
2575 (list '#(syntax-object lambda ((top)) (hygiene guile))
2576 '(#(syntax-object x ((top)) (hygiene guile)))
2577 docstring
2578 (vector
2579 '(#(syntax-object macro-type ((top)) (hygiene guile))
2580 .
2581 #(syntax-object syntax-rules ((top)) (hygiene guile)))
2582 (cons '#(syntax-object patterns ((top)) (hygiene guile)) pattern))
2583 (cons '#(syntax-object syntax-case ((top)) (hygiene guile))
2584 (cons '#(syntax-object x ((top)) (hygiene guile))
2585 (cons k
2586 (map (lambda (tmp-1 tmp)
2587 (list (cons '#(syntax-object dummy ((top)) (hygiene guile)) tmp)
2588 (list '#(syntax-object syntax ((top)) (hygiene guile))
2589 tmp-1)))
2590 template
2591 pattern))))))
2592 tmp)
2593 (syntax-violation
2594 #f
2595 "source expression failed to match any pattern"
2596 tmp-1)))))))))
2597
2598 (define define-syntax-rule
2599 (make-syntax-transformer
2600 'define-syntax-rule
2601 'macro
2602 (lambda (x)
2603 (let ((tmp-1 x))
2604 (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any))))
2605 (if tmp
2606 (apply (lambda (name pattern template)
2607 (list '#(syntax-object define-syntax ((top)) (hygiene guile))
2608 name
2609 (list '#(syntax-object syntax-rules ((top)) (hygiene guile))
2610 '()
2611 (list (cons '#(syntax-object _ ((top)) (hygiene guile)) pattern)
2612 template))))
2613 tmp)
2614 (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any any))))
2615 (if (if tmp
2616 (apply (lambda (name pattern docstring template)
2617 (string? (syntax->datum docstring)))
2618 tmp)
2619 #f)
2620 (apply (lambda (name pattern docstring template)
2621 (list '#(syntax-object define-syntax ((top)) (hygiene guile))
2622 name
2623 (list '#(syntax-object syntax-rules ((top)) (hygiene guile))
2624 '()
2625 docstring
2626 (list (cons '#(syntax-object _ ((top)) (hygiene guile)) pattern)
2627 template))))
2628 tmp)
2629 (syntax-violation
2630 #f
2631 "source expression failed to match any pattern"
2632 tmp-1)))))))))
2633
2634 (define let*
2635 (make-syntax-transformer
2636 'let*
2637 'macro
2638 (lambda (x)
2639 (let ((tmp-1 x))
2640 (let ((tmp ($sc-dispatch tmp-1 '(any #(each (any any)) any . each-any))))
2641 (if (if tmp
2642 (apply (lambda (let* x v e1 e2) (and-map identifier? x)) tmp)
2643 #f)
2644 (apply (lambda (let* x v e1 e2)
2645 (let f ((bindings (map list x v)))
2646 (if (null? bindings)
2647 (cons '#(syntax-object let ((top)) (hygiene guile))
2648 (cons '() (cons e1 e2)))
2649 (let ((tmp-1 (list (f (cdr bindings)) (car bindings))))
2650 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
2651 (if tmp
2652 (apply (lambda (body binding)
2653 (list '#(syntax-object let ((top)) (hygiene guile))
2654 (list binding)
2655 body))
2656 tmp)
2657 (syntax-violation
2658 #f
2659 "source expression failed to match any pattern"
2660 tmp-1)))))))
2661 tmp)
2662 (syntax-violation
2663 #f
2664 "source expression failed to match any pattern"
2665 tmp-1)))))))
2666
2667 (define quasiquote
2668 (make-syntax-transformer
2669 'quasiquote
2670 'macro
2671 (letrec*
2672 ((quasi (lambda (p lev)
2673 (let ((tmp p))
2674 (let ((tmp-1 ($sc-dispatch
2675 tmp
2676 '(#(free-id #(syntax-object unquote ((top)) (hygiene guile))) any))))
2677 (if tmp-1
2678 (apply (lambda (p)
2679 (if (= lev 0)
2680 (list "value" p)
2681 (quasicons
2682 '("quote" #(syntax-object unquote ((top)) (hygiene guile)))
2683 (quasi (list p) (- lev 1)))))
2684 tmp-1)
2685 (let ((tmp-1 ($sc-dispatch
2686 tmp
2687 '(#(free-id #(syntax-object quasiquote ((top)) (hygiene guile))) any))))
2688 (if tmp-1
2689 (apply (lambda (p)
2690 (quasicons
2691 '("quote" #(syntax-object quasiquote ((top)) (hygiene guile)))
2692 (quasi (list p) (+ lev 1))))
2693 tmp-1)
2694 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
2695 (if tmp-1
2696 (apply (lambda (p q)
2697 (let ((tmp-1 p))
2698 (let ((tmp ($sc-dispatch
2699 tmp-1
2700 '(#(free-id #(syntax-object unquote ((top)) (hygiene guile)))
2701 .
2702 each-any))))
2703 (if tmp
2704 (apply (lambda (p)
2705 (if (= lev 0)
2706 (quasilist*
2707 (map (lambda (tmp) (list "value" tmp)) p)
2708 (quasi q lev))
2709 (quasicons
2710 (quasicons
2711 '("quote" #(syntax-object unquote ((top)) (hygiene guile)))
2712 (quasi p (- lev 1)))
2713 (quasi q lev))))
2714 tmp)
2715 (let ((tmp ($sc-dispatch
2716 tmp-1
2717 '(#(free-id
2718 #(syntax-object unquote-splicing ((top)) (hygiene guile)))
2719 .
2720 each-any))))
2721 (if tmp
2722 (apply (lambda (p)
2723 (if (= lev 0)
2724 (quasiappend
2725 (map (lambda (tmp) (list "value" tmp)) p)
2726 (quasi q lev))
2727 (quasicons
2728 (quasicons
2729 '("quote"
2730 #(syntax-object
2731 unquote-splicing
2732 ((top))
2733 (hygiene guile)))
2734 (quasi p (- lev 1)))
2735 (quasi q lev))))
2736 tmp)
2737 (quasicons (quasi p lev) (quasi q lev))))))))
2738 tmp-1)
2739 (let ((tmp-1 ($sc-dispatch tmp '#(vector each-any))))
2740 (if tmp-1
2741 (apply (lambda (x) (quasivector (vquasi x lev))) tmp-1)
2742 (let ((p tmp)) (list "quote" p)))))))))))))
2743 (vquasi
2744 (lambda (p lev)
2745 (let ((tmp p))
2746 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
2747 (if tmp-1
2748 (apply (lambda (p q)
2749 (let ((tmp-1 p))
2750 (let ((tmp ($sc-dispatch
2751 tmp-1
2752 '(#(free-id #(syntax-object unquote ((top)) (hygiene guile)))
2753 .
2754 each-any))))
2755 (if tmp
2756 (apply (lambda (p)
2757 (if (= lev 0)
2758 (quasilist* (map (lambda (tmp) (list "value" tmp)) p) (vquasi q lev))
2759 (quasicons
2760 (quasicons
2761 '("quote" #(syntax-object unquote ((top)) (hygiene guile)))
2762 (quasi p (- lev 1)))
2763 (vquasi q lev))))
2764 tmp)
2765 (let ((tmp ($sc-dispatch
2766 tmp-1
2767 '(#(free-id #(syntax-object unquote-splicing ((top)) (hygiene guile)))
2768 .
2769 each-any))))
2770 (if tmp
2771 (apply (lambda (p)
2772 (if (= lev 0)
2773 (quasiappend
2774 (map (lambda (tmp) (list "value" tmp)) p)
2775 (vquasi q lev))
2776 (quasicons
2777 (quasicons
2778 '("quote" #(syntax-object unquote-splicing ((top)) (hygiene guile)))
2779 (quasi p (- lev 1)))
2780 (vquasi q lev))))
2781 tmp)
2782 (quasicons (quasi p lev) (vquasi q lev))))))))
2783 tmp-1)
2784 (let ((tmp-1 ($sc-dispatch tmp '())))
2785 (if tmp-1
2786 (apply (lambda () '("quote" ())) tmp-1)
2787 (syntax-violation
2788 #f
2789 "source expression failed to match any pattern"
2790 tmp))))))))
2791 (quasicons
2792 (lambda (x y)
2793 (let ((tmp-1 (list x y)))
2794 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
2795 (if tmp
2796 (apply (lambda (x y)
2797 (let ((tmp y))
2798 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") any))))
2799 (if tmp-1
2800 (apply (lambda (dy)
2801 (let ((tmp x))
2802 (let ((tmp ($sc-dispatch tmp '(#(atom "quote") any))))
2803 (if tmp
2804 (apply (lambda (dx) (list "quote" (cons dx dy))) tmp)
2805 (if (null? dy) (list "list" x) (list "list*" x y))))))
2806 tmp-1)
2807 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . any))))
2808 (if tmp-1
2809 (apply (lambda (stuff) (cons "list" (cons x stuff))) tmp-1)
2810 (let ((tmp ($sc-dispatch tmp '(#(atom "list*") . any))))
2811 (if tmp
2812 (apply (lambda (stuff) (cons "list*" (cons x stuff))) tmp)
2813 (list "list*" x y)))))))))
2814 tmp)
2815 (syntax-violation
2816 #f
2817 "source expression failed to match any pattern"
2818 tmp-1))))))
2819 (quasiappend
2820 (lambda (x y)
2821 (let ((tmp y))
2822 (let ((tmp ($sc-dispatch tmp '(#(atom "quote") ()))))
2823 (if tmp
2824 (apply (lambda ()
2825 (if (null? x)
2826 '("quote" ())
2827 (if (null? (cdr x))
2828 (car x)
2829 (let ((tmp-1 x))
2830 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2831 (if tmp
2832 (apply (lambda (p) (cons "append" p)) tmp)
2833 (syntax-violation
2834 #f
2835 "source expression failed to match any pattern"
2836 tmp-1)))))))
2837 tmp)
2838 (if (null? x)
2839 y
2840 (let ((tmp-1 (list x y)))
2841 (let ((tmp ($sc-dispatch tmp-1 '(each-any any))))
2842 (if tmp
2843 (apply (lambda (p y) (cons "append" (append p (list y)))) tmp)
2844 (syntax-violation
2845 #f
2846 "source expression failed to match any pattern"
2847 tmp-1))))))))))
2848 (quasilist*
2849 (lambda (x y)
2850 (let f ((x x)) (if (null? x) y (quasicons (car x) (f (cdr x)))))))
2851 (quasivector
2852 (lambda (x)
2853 (let ((tmp x))
2854 (let ((tmp ($sc-dispatch tmp '(#(atom "quote") each-any))))
2855 (if tmp
2856 (apply (lambda (x) (list "quote" (list->vector x))) tmp)
2857 (let f ((y x)
2858 (k (lambda (ls)
2859 (let ((tmp-1 ls))
2860 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2861 (if tmp
2862 (apply (lambda (t) (cons "vector" t)) tmp)
2863 (syntax-violation
2864 #f
2865 "source expression failed to match any pattern"
2866 tmp-1)))))))
2867 (let ((tmp y))
2868 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") each-any))))
2869 (if tmp-1
2870 (apply (lambda (y) (k (map (lambda (tmp) (list "quote" tmp)) y)))
2871 tmp-1)
2872 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . each-any))))
2873 (if tmp-1
2874 (apply (lambda (y) (k y)) tmp-1)
2875 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list*") . #(each+ any (any) ())))))
2876 (if tmp-1
2877 (apply (lambda (y z) (f z (lambda (ls) (k (append y ls))))) tmp-1)
2878 (let ((else tmp))
2879 (let ((tmp x)) (let ((t tmp)) (list "list->vector" t)))))))))))))))))
2880 (emit (lambda (x)
2881 (let ((tmp x))
2882 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") any))))
2883 (if tmp-1
2884 (apply (lambda (x) (list '#(syntax-object quote ((top)) (hygiene guile)) x))
2885 tmp-1)
2886 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . each-any))))
2887 (if tmp-1
2888 (apply (lambda (x)
2889 (let ((tmp-1 (map emit x)))
2890 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2891 (if tmp
2892 (apply (lambda (t) (cons '#(syntax-object list ((top)) (hygiene guile)) t))
2893 tmp)
2894 (syntax-violation
2895 #f
2896 "source expression failed to match any pattern"
2897 tmp-1)))))
2898 tmp-1)
2899 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list*") . #(each+ any (any) ())))))
2900 (if tmp-1
2901 (apply (lambda (x y)
2902 (let f ((x* x))
2903 (if (null? x*)
2904 (emit y)
2905 (let ((tmp-1 (list (emit (car x*)) (f (cdr x*)))))
2906 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
2907 (if tmp
2908 (apply (lambda (t-1 t)
2909 (list '#(syntax-object cons ((top)) (hygiene guile)) t-1 t))
2910 tmp)
2911 (syntax-violation
2912 #f
2913 "source expression failed to match any pattern"
2914 tmp-1)))))))
2915 tmp-1)
2916 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "append") . each-any))))
2917 (if tmp-1
2918 (apply (lambda (x)
2919 (let ((tmp-1 (map emit x)))
2920 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2921 (if tmp
2922 (apply (lambda (t)
2923 (cons '#(syntax-object append ((top)) (hygiene guile)) t))
2924 tmp)
2925 (syntax-violation
2926 #f
2927 "source expression failed to match any pattern"
2928 tmp-1)))))
2929 tmp-1)
2930 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "vector") . each-any))))
2931 (if tmp-1
2932 (apply (lambda (x)
2933 (let ((tmp-1 (map emit x)))
2934 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2935 (if tmp
2936 (apply (lambda (t)
2937 (cons '#(syntax-object vector ((top)) (hygiene guile)) t))
2938 tmp)
2939 (syntax-violation
2940 #f
2941 "source expression failed to match any pattern"
2942 tmp-1)))))
2943 tmp-1)
2944 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list->vector") any))))
2945 (if tmp-1
2946 (apply (lambda (x)
2947 (let ((tmp (emit x)))
2948 (let ((t tmp))
2949 (list '#(syntax-object list->vector ((top)) (hygiene guile)) t))))
2950 tmp-1)
2951 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "value") any))))
2952 (if tmp-1
2953 (apply (lambda (x) x) tmp-1)
2954 (syntax-violation
2955 #f
2956 "source expression failed to match any pattern"
2957 tmp)))))))))))))))))))
2958 (lambda (x)
2959 (let ((tmp-1 x))
2960 (let ((tmp ($sc-dispatch tmp-1 '(_ any))))
2961 (if tmp
2962 (apply (lambda (e) (emit (quasi e 0))) tmp)
2963 (syntax-violation
2964 #f
2965 "source expression failed to match any pattern"
2966 tmp-1))))))))
2967
2968 (define include
2969 (make-syntax-transformer
2970 'include
2971 'macro
2972 (lambda (x)
2973 (letrec*
2974 ((read-file
2975 (lambda (fn dir k)
2976 (let ((p (open-input-file
2977 (if (absolute-file-name? fn) fn (in-vicinity dir fn)))))
2978 (let f ((x (read p)) (result '()))
2979 (if (eof-object? x)
2980 (begin (close-input-port p) (reverse result))
2981 (f (read p) (cons (datum->syntax k x) result))))))))
2982 (let ((src (syntax-source x)))
2983 (let ((file (if src (assq-ref src 'filename) #f)))
2984 (let ((dir (if (string? file) (dirname file) #f)))
2985 (let ((tmp-1 x))
2986 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
2987 (if tmp
2988 (apply (lambda (k filename)
2989 (let ((fn (syntax->datum filename)))
2990 (let ((tmp-1 (read-file fn dir filename)))
2991 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2992 (if tmp
2993 (apply (lambda (exp)
2994 (cons '#(syntax-object begin ((top)) (hygiene guile)) exp))
2995 tmp)
2996 (syntax-violation
2997 #f
2998 "source expression failed to match any pattern"
2999 tmp-1))))))
3000 tmp)
3001 (syntax-violation
3002 #f
3003 "source expression failed to match any pattern"
3004 tmp-1)))))))))))
3005
3006 (define include-from-path
3007 (make-syntax-transformer
3008 'include-from-path
3009 'macro
3010 (lambda (x)
3011 (let ((tmp-1 x))
3012 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
3013 (if tmp
3014 (apply (lambda (k filename)
3015 (let ((fn (syntax->datum filename)))
3016 (let ((tmp (datum->syntax
3017 filename
3018 (let ((t (%search-load-path fn)))
3019 (if t
3020 t
3021 (syntax-violation
3022 'include-from-path
3023 "file not found in path"
3024 x
3025 filename))))))
3026 (let ((fn tmp))
3027 (list '#(syntax-object include ((top)) (hygiene guile)) fn)))))
3028 tmp)
3029 (syntax-violation
3030 #f
3031 "source expression failed to match any pattern"
3032 tmp-1)))))))
3033
3034 (define unquote
3035 (make-syntax-transformer
3036 'unquote
3037 'macro
3038 (lambda (x)
3039 (syntax-violation
3040 'unquote
3041 "expression not valid outside of quasiquote"
3042 x))))
3043
3044 (define unquote-splicing
3045 (make-syntax-transformer
3046 'unquote-splicing
3047 'macro
3048 (lambda (x)
3049 (syntax-violation
3050 'unquote-splicing
3051 "expression not valid outside of quasiquote"
3052 x))))
3053
3054 (define make-variable-transformer
3055 (lambda (proc)
3056 (if (procedure? proc)
3057 (let ((trans (lambda (x) (proc x))))
3058 (set-procedure-property! trans 'variable-transformer #t)
3059 trans)
3060 (error "variable transformer not a procedure" proc))))
3061
3062 (define identifier-syntax
3063 (make-syntax-transformer
3064 'identifier-syntax
3065 'macro
3066 (lambda (xx)
3067 (let ((tmp-1 xx))
3068 (let ((tmp ($sc-dispatch tmp-1 '(_ any))))
3069 (if tmp
3070 (apply (lambda (e)
3071 (list '#(syntax-object lambda ((top)) (hygiene guile))
3072 '(#(syntax-object x ((top)) (hygiene guile)))
3073 '#((#(syntax-object macro-type ((top)) (hygiene guile))
3074 .
3075 #(syntax-object identifier-syntax ((top)) (hygiene guile))))
3076 (list '#(syntax-object syntax-case ((top)) (hygiene guile))
3077 '#(syntax-object x ((top)) (hygiene guile))
3078 '()
3079 (list '#(syntax-object id ((top)) (hygiene guile))
3080 '(#(syntax-object identifier? ((top)) (hygiene guile))
3081 (#(syntax-object syntax ((top)) (hygiene guile))
3082 #(syntax-object id ((top)) (hygiene guile))))
3083 (list '#(syntax-object syntax ((top)) (hygiene guile)) e))
3084 (list '(#(syntax-object _ ((top)) (hygiene guile))
3085 #(syntax-object x ((top)) (hygiene guile))
3086 #(syntax-object ... ((top)) (hygiene guile)))
3087 (list '#(syntax-object syntax ((top)) (hygiene guile))
3088 (cons e
3089 '(#(syntax-object x ((top)) (hygiene guile))
3090 #(syntax-object ... ((top)) (hygiene guile)))))))))
3091 tmp)
3092 (let ((tmp ($sc-dispatch
3093 tmp-1
3094 '(_ (any any)
3095 ((#(free-id #(syntax-object set! ((top)) (hygiene guile))) any any)
3096 any)))))
3097 (if (if tmp
3098 (apply (lambda (id exp1 var val exp2)
3099 (if (identifier? id) (identifier? var) #f))
3100 tmp)
3101 #f)
3102 (apply (lambda (id exp1 var val exp2)
3103 (list '#(syntax-object make-variable-transformer ((top)) (hygiene guile))
3104 (list '#(syntax-object lambda ((top)) (hygiene guile))
3105 '(#(syntax-object x ((top)) (hygiene guile)))
3106 '#((#(syntax-object macro-type ((top)) (hygiene guile))
3107 .
3108 #(syntax-object variable-transformer ((top)) (hygiene guile))))
3109 (list '#(syntax-object syntax-case ((top)) (hygiene guile))
3110 '#(syntax-object x ((top)) (hygiene guile))
3111 '(#(syntax-object set! ((top)) (hygiene guile)))
3112 (list (list '#(syntax-object set! ((top)) (hygiene guile)) var val)
3113 (list '#(syntax-object syntax ((top)) (hygiene guile)) exp2))
3114 (list (cons id
3115 '(#(syntax-object x ((top)) (hygiene guile))
3116 #(syntax-object ... ((top)) (hygiene guile))))
3117 (list '#(syntax-object syntax ((top)) (hygiene guile))
3118 (cons exp1
3119 '(#(syntax-object x ((top)) (hygiene guile))
3120 #(syntax-object ... ((top)) (hygiene guile))))))
3121 (list id
3122 (list '#(syntax-object identifier? ((top)) (hygiene guile))
3123 (list '#(syntax-object syntax ((top)) (hygiene guile)) id))
3124 (list '#(syntax-object syntax ((top)) (hygiene guile)) exp1))))))
3125 tmp)
3126 (syntax-violation
3127 #f
3128 "source expression failed to match any pattern"
3129 tmp-1)))))))))
3130
3131 (define define*
3132 (make-syntax-transformer
3133 'define*
3134 'macro
3135 (lambda (x)
3136 (let ((tmp-1 x))
3137 (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any . each-any))))
3138 (if tmp
3139 (apply (lambda (id args b0 b1)
3140 (list '#(syntax-object define ((top)) (hygiene guile))
3141 id
3142 (cons '#(syntax-object lambda* ((top)) (hygiene guile))
3143 (cons args (cons b0 b1)))))
3144 tmp)
3145 (let ((tmp ($sc-dispatch tmp-1 '(_ any any))))
3146 (if (if tmp (apply (lambda (id val) (identifier? id)) tmp) #f)
3147 (apply (lambda (id val)
3148 (list '#(syntax-object define ((top)) (hygiene guile)) id val))
3149 tmp)
3150 (syntax-violation
3151 #f
3152 "source expression failed to match any pattern"
3153 tmp-1)))))))))
3154