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