1 (eval-when (compile) (set-current-module (resolve-module (quote (guile)))))
6 (lambda (src) (make-struct (vector-ref %expanded-vtables 0) 0 src)))
9 (make-struct (vector-ref %expanded-vtables 1) 0 src exp)))
12 (make-struct (vector-ref %expanded-vtables 2) 0 src name)))
14 (lambda (src name gensym)
15 (make-struct (vector-ref %expanded-vtables 3) 0 src name gensym)))
17 (lambda (src name gensym exp)
18 (make-struct (vector-ref %expanded-vtables 4) 0 src name gensym exp)))
20 (lambda (src mod name public?)
21 (make-struct (vector-ref %expanded-vtables 5) 0 src mod name public?)))
23 (lambda (src mod name public? exp)
25 (vector-ref %expanded-vtables 6)
34 (make-struct (vector-ref %expanded-vtables 7) 0 src name)))
36 (lambda (src name exp)
37 (make-struct (vector-ref %expanded-vtables 8) 0 src name exp)))
39 (lambda (src name exp)
40 (make-struct (vector-ref %expanded-vtables 9) 0 src name exp)))
42 (lambda (src test consequent alternate)
44 (vector-ref %expanded-vtables 10)
51 (lambda (src proc args)
52 (make-struct (vector-ref %expanded-vtables 11) 0 src proc args)))
55 (make-struct (vector-ref %expanded-vtables 12) 0 src exps)))
57 (lambda (src meta body)
58 (make-struct (vector-ref %expanded-vtables 13) 0 src meta body)))
60 (lambda (src req opt rest kw inits gensyms body alternate)
62 (vector-ref %expanded-vtables 14)
74 (lambda (src names gensyms vals body)
76 (vector-ref %expanded-vtables 15)
84 (lambda (src in-order? names gensyms vals body)
86 (vector-ref %expanded-vtables 16)
95 (lambda (src fluids vals body)
97 (vector-ref %expanded-vtables 17)
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)))
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)
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))
129 (let ((val (variable-ref v)))
132 (cons (macro-type val) (macro-binding val))))))))
135 (if (and s (supports-source-properties? e))
136 (set-source-properties! e s))
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)))
146 (lambda (source fun-exp arg-exps)
147 (make-application source fun-exp arg-exps)))
149 (lambda (source test-exp then-exp else-exp)
150 (make-conditional source test-exp then-exp else-exp)))
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)))
161 (lambda (mod var modref-cont bare-cont)
164 (let ((kind (car mod)) (mod (cdr mod)))
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)
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)
177 (else (syntax-violation #f "bad module kind" var mod))))))))
178 (build-global-reference
179 (lambda (source var mod)
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)
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)))
199 (lambda (src req rest vars meta exp)
203 (make-lambda-case src req #f rest #f '() vars exp #f))))
205 (lambda (src meta body) (make-lambda src meta body)))
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)))
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)))
217 (if (null? (cdr exps)) (car exps) (make-sequence src exps))))
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))))
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)
236 (build-lexical-reference 'fun src f-name f)
239 (lambda (src in-order? ids vars val-exps body-exp)
243 (for-each maybe-name-value! ids val-exps)
244 (make-letrec src in-order? ids vars val-exps body-exp)))))
246 (lambda (expression wrap module)
247 (vector 'syntax-object expression wrap module)))
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)))
264 (let ((props (source-properties
265 (if (syntax-object? x) (syntax-object-expression x) x))))
266 (and (pair? props) props))))
268 (lambda (labels bindings r)
274 (cons (cons (car labels) (car bindings)) r)))))
276 (lambda (labels vars r)
282 (cons (cons (car labels) (cons 'lexical (car vars))) r)))))
288 (if (eq? (cadr a) 'macro)
289 (cons a (macros-only-env (cdr r)))
290 (macros-only-env (cdr r)))))))
293 (let ((t (assq x r)))
295 ((symbol? x) (or (get-global-definition-hook x mod) '(global)))
296 (else '(displaced-lexical))))))
298 (lambda (type sym val) (put-global-definition-hook sym type val)))
301 (and (syntax-object? x) (symbol? (syntax-object-expression x)))))
305 (and (syntax-object? x) (symbol? (syntax-object-expression x))))))
308 (if (syntax-object? x)
310 (syntax-object-expression x)
311 (join-marks (car w) (car (syntax-object-wrap x))))
312 (values x (car w)))))
315 (string-append "l-" (session-id) (symbol->string (gensym "-")))))
318 (if (null? ls) '() (cons (gen-label) (gen-labels (cdr ls))))))
320 (lambda (symnames marks labels)
321 (vector 'ribcage symnames marks labels)))
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)))
334 (lambda (w) (cons (cons #f (car w)) (cons 'shift (cdr w)))))
336 (lambda (ribcage id label)
337 (set-ribcage-symnames!
339 (cons (syntax-object-expression id) (ribcage-symnames ribcage)))
342 (cons (car (syntax-object-wrap id)) (ribcage-marks ribcage)))
343 (set-ribcage-labels! ribcage (cons label (ribcage-labels ribcage)))))
345 (lambda (ids labels 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))
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)))
361 (smart-append (lambda (m1 m2) (if (null? m2) m1 (append m1 m2))))
364 (let ((m1 (car w1)) (s1 (cdr w1)))
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)))
374 (eq? (car x) (car y))
375 (same-marks? (cdr x) (cdr y))))))
380 (lambda (sym subst marks)
383 (let ((fst (car subst)))
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))))))))
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)))))))
399 (lambda (sym subst marks symnames ribcage)
400 (let ((n (vector-length symnames)))
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))
409 (let ((id (syntax-object-expression id)) (w1 (syntax-object-wrap id)))
410 (let ((marks (join-marks (car w) (car w1))))
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
418 ((scan (lambda (subst results)
421 (let ((fst (car subst)))
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))))))))
429 (lambda (subst symnames marks results)
430 (let f ((symnames symnames) (marks marks) (results results))
432 (scan (cdr subst) results)
435 (cons (wrap (car symnames) (anti-mark (cons (car marks) subst)) mod)
438 (lambda (subst symnames marks results)
439 (let ((n (vector-length symnames)))
440 (let f ((i 0) (results results))
442 (scan (cdr subst) results)
444 (cons (wrap (vector-ref symnames i)
445 (anti-mark (cons (vector-ref marks i) subst))
448 (scan (cdr w) '()))))
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)))))
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)))
466 (if (syntax-object? id) (syntax-object-module id) mod)))
470 (if (syntax-object? id) (syntax-object-module id) mod)))
471 (else (error "unexpected id-var-name" id w n)))))))
472 (transformer-environment
475 (error "called outside the dynamic extent of a syntax transformer"))))
476 (with-transformer-environment
477 (lambda (k) ((fluid-ref transformer-environment) k)))
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 '(()))))))
485 (if (and (syntax-object? i) (syntax-object? j))
486 (and (eq? (syntax-object-expression i) (syntax-object-expression j))
488 (car (syntax-object-wrap i))
489 (car (syntax-object-wrap j))))
493 (and (let all-ids? ((ids ids))
494 (or (null? ids) (and (id? (car ids)) (all-ids? (cdr ids)))))
495 (distinct-bound-ids? ids))))
498 (let distinct? ((ids ids))
500 (and (not (bound-id-member? (car ids) (cdr ids)))
501 (distinct? (cdr ids)))))))
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)
510 (syntax-object-expression x)
511 (join-wraps w (syntax-object-wrap x))
512 (syntax-object-module x)))
514 (else (make-syntax-object x w defmod)))))
516 (lambda (x w s defmod) (wrap (decorate-source x s) w defmod)))
518 (lambda (body r w s mod)
521 (let dobody ((body body) (r r) (w w) (mod mod))
524 (let ((first (expand (car body) r w mod)))
525 (cons first (dobody (cdr body) r w mod))))))))
527 (lambda (body r w s m esew mod)
529 ((scan (lambda (body r w s m esew mod exps)
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)
540 (cond ((memv key '(begin-form))
541 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_))))
543 (apply (lambda () exps) tmp-1)
544 (let ((tmp-1 ($sc-dispatch tmp '(_ any . each-any))))
546 (apply (lambda (e1 e2) (scan (cons e1 e2) r w s m esew mod exps))
550 "source expression failed to match any pattern"
552 ((memv key '(local-syntax-form))
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))))
564 (apply (lambda (x e1 e2)
565 (let ((when-list (parse-when-list e x)) (body (cons e1 e2)))
567 (if (memq 'eval when-list)
572 (if (memq 'expand when-list) 'c&e 'e)
577 (if (memq 'expand when-list)
579 (expand-top-sequence body r w s 'e '(eval) mod)
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))
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)))
594 (expand-top-sequence body r w s 'e '(eval) mod)
597 (else (values exps)))))
601 "source expression failed to match any pattern"
603 ((memv key '(define-syntax-form define-syntax-parameter-form))
604 (let ((n (id-var-name value w)) (r (macros-only-env r)))
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))))
613 (cons (expand-install-global n (expand e r w mod)) exps)))
614 (else (values exps))))
616 (let ((e (expand-install-global n (expand e r w mod))))
617 (top-level-eval-hook e mod)
618 (values (cons e exps))))
620 (if (memq 'eval esew)
622 (expand-install-global n (expand e r w mod))
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))
631 (let ((old (module-variable (current-module) n)))
632 (if (and (variable? old) (variable-bound? old))
633 (module-define! (current-module) n (variable-ref old))
634 (module-add! (current-module) n (make-undefined-variable)))))
636 (cons (if (eq? m 'c&e)
637 (let ((x (build-global-definition s n (expand e r w mod))))
638 (top-level-eval-hook x mod)
640 (lambda () (build-global-definition s n (expand e r w mod))))
642 ((memv key '(displaced-lexical))
645 "identifier out of context"
646 (source-wrap form w s mod)
651 "cannot define keyword at top level"
652 (source-wrap form w s mod)
653 (wrap value w mod))))))
656 (cons (if (eq? m 'c&e)
657 (let ((x (expand-expr type value form e r w s mod)))
658 (top-level-eval-hook x mod)
660 (lambda () (expand-expr type value form e r w s mod)))
662 (lambda (exps) (scan (cdr body) r w s m esew mod exps)))))))
664 (lambda () (scan body r w s m esew mod '()))
670 (let lp ((in exps) (out '()))
674 (lp (cdr in) (cons (if (procedure? e) (e) e) out))))))))))))
675 (expand-install-global
677 (build-global-definition
682 (build-primref #f 'make-syntax-transformer)
683 (list (build-data #f name) (build-data #f 'macro) e)))))
685 (lambda (e when-list)
686 (let ((result (strip when-list '(()))))
688 (cond ((null? l) result)
689 ((memq (car l) '(compile load eval expand)) (lp (cdr l)))
690 (else (syntax-violation 'eval-when "invalid situation" e (car l))))))))
692 (lambda (e r w s rib mod for-car?)
694 (let* ((n (id-var-name e w))
698 (cond ((memv key '(lexical)) (values type (cdr b) e e w s mod))
699 ((memv key '(global)) (values type n e e w s mod))
702 (values type (cdr b) e e w s mod)
704 (expand-macro (cdr b) e r w s rib mod)
711 (else (values type (cdr b) e e w s mod)))))
713 (let ((first (car e)))
715 (lambda () (syntax-type first r w s rib mod #t))
716 (lambda (ftype fval fform fe fw fs fmod)
718 (cond ((memv key '(lexical)) (values 'lexical-call fval e e w s mod))
719 ((memv key '(global))
720 (values 'global-call (make-syntax-object fval w fmod) e e w s mod))
723 (expand-macro fval e r w s rib mod)
730 ((memv key '(module-ref))
732 (lambda () (fval e r w))
733 (lambda (e r w s mod) (syntax-type e r w s rib mod for-car?))))
734 ((memv key '(core)) (values 'core-form fval e e w s mod))
735 ((memv key '(local-syntax))
736 (values 'local-syntax-form fval e e w s mod))
737 ((memv key '(begin)) (values 'begin-form #f e e w s mod))
738 ((memv key '(eval-when)) (values 'eval-when-form #f e e w s mod))
739 ((memv key '(define))
740 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any any))))
741 (if (and tmp-1 (apply (lambda (name val) (id? name)) tmp-1))
742 (apply (lambda (name val) (values 'define-form name e val w s mod))
744 (let ((tmp-1 ($sc-dispatch tmp '(_ (any . any) any . each-any))))
746 (apply (lambda (name args e1 e2)
747 (and (id? name) (valid-bound-ids? (lambda-var-list args))))
749 (apply (lambda (name args e1 e2)
755 (cons '#(syntax-object lambda ((top)) (hygiene guile))
756 (wrap (cons args (cons e1 e2)) w mod))
762 (let ((tmp-1 ($sc-dispatch tmp '(_ any))))
763 (if (and tmp-1 (apply (lambda (name) (id? name)) tmp-1))
764 (apply (lambda (name)
769 '(#(syntax-object if ((top)) (hygiene guile)) #f #f)
776 "source expression failed to match any pattern"
778 ((memv key '(define-syntax))
779 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
780 (if (and tmp (apply (lambda (name val) (id? name)) tmp))
781 (apply (lambda (name val) (values 'define-syntax-form name e val w s mod))
785 "source expression failed to match any pattern"
787 ((memv key '(define-syntax-parameter))
788 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
789 (if (and tmp (apply (lambda (name val) (id? name)) tmp))
790 (apply (lambda (name val)
791 (values 'define-syntax-parameter-form name e val w s mod))
795 "source expression failed to match any pattern"
797 (else (values 'call #f e e w s mod))))))))
800 (syntax-object-expression e)
802 (join-wraps w (syntax-object-wrap e))
803 (or (source-annotation e) s)
805 (or (syntax-object-module e) mod)
807 ((self-evaluating? e) (values 'constant #f e e w s mod))
808 (else (values 'other #f e e w s mod)))))
812 (lambda () (syntax-type e r w (source-annotation e) #f mod #f))
813 (lambda (type value form e w s mod)
814 (expand-expr type value form e r w s mod)))))
816 (lambda (type value form e r w s mod)
818 (cond ((memv key '(lexical)) (build-lexical-reference 'value s e value))
819 ((memv key '(core core-form)) (value e r w s mod))
820 ((memv key '(module-ref))
822 (lambda () (value e r w))
823 (lambda (e r w s mod) (expand e r w mod))))
824 ((memv key '(lexical-call))
827 (build-lexical-reference
829 (source-annotation id)
830 (if (syntax-object? id) (syntax->datum id) id)
837 ((memv key '(global-call))
839 (build-global-reference
840 (source-annotation (car e))
841 (if (syntax-object? value) (syntax-object-expression value) value)
842 (if (syntax-object? value) (syntax-object-module value) mod))
848 ((memv key '(constant))
849 (build-data s (strip (source-wrap e w s mod) '(()))))
850 ((memv key '(global)) (build-global-reference s value mod))
852 (expand-application (expand (car e) r w mod) e r w s mod))
853 ((memv key '(begin-form))
854 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any . each-any))))
856 (apply (lambda (e1 e2) (expand-sequence (cons e1 e2) r w s mod))
858 (let ((tmp-1 ($sc-dispatch tmp '(_))))
861 (if (include-deprecated-features)
863 (issue-deprecation-warning
864 "Sequences of zero expressions are deprecated. Use *unspecified*.")
868 "sequence of zero expressions"
869 (source-wrap e w s mod))))
873 "source expression failed to match any pattern"
875 ((memv key '(local-syntax-form))
876 (expand-local-syntax value e r w s mod expand-sequence))
877 ((memv key '(eval-when-form))
878 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any . each-any))))
880 (apply (lambda (x e1 e2)
881 (let ((when-list (parse-when-list e x)))
882 (if (memq 'eval when-list)
883 (expand-sequence (cons e1 e2) r w s mod)
888 "source expression failed to match any pattern"
891 '(define-form define-syntax-form define-syntax-parameter-form))
894 "definition in expression context, where definitions are not allowed,"
895 (source-wrap form w s mod)))
896 ((memv key '(syntax))
899 "reference to pattern variable outside syntax form"
900 (source-wrap e w s mod)))
901 ((memv key '(displaced-lexical))
904 "reference to identifier outside its scope"
905 (source-wrap e w s mod)))
907 (syntax-violation #f "unexpected syntax" (source-wrap e w s mod)))))))
909 (lambda (x e r w s mod)
910 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(any . each-any))))
912 (apply (lambda (e0 e1)
913 (build-application s x (map (lambda (e) (expand e r w mod)) e1)))
917 "source expression failed to match any pattern"
920 (lambda (p e r w s rib mod)
922 ((rebuild-macro-output
926 (cons (rebuild-macro-output (car x) m)
927 (rebuild-macro-output (cdr x) m))
930 (let ((w (syntax-object-wrap x)))
931 (let ((ms (car w)) (ss (cdr w)))
932 (if (and (pair? ms) (eq? (car ms) #f))
934 (syntax-object-expression x)
935 (cons (cdr ms) (if rib (cons rib (cdr ss)) (cdr ss)))
936 (syntax-object-module x))
938 (decorate-source (syntax-object-expression x) s)
940 (if rib (cons rib (cons 'shift ss)) (cons 'shift ss)))
941 (syntax-object-module x))))))
943 (let* ((n (vector-length x)) (v (decorate-source (make-vector n) s)))
948 (vector-set! v i (rebuild-macro-output (vector-ref x i) m))
953 "encountered raw symbol in macro output"
954 (source-wrap e w (cdr w) mod)
956 (else (decorate-source x s))))))
958 ((transformer-environment (lambda (k) (k e r w s rib mod))))
959 (rebuild-macro-output
960 (p (source-wrap e (anti-mark w) s mod))
961 (gensym (string-append "m-" (session-id) "-")))))))
963 (lambda (body outer-form r w mod)
964 (let* ((r (cons '("placeholder" placeholder) r))
965 (ribcage (make-ribcage '() '() '()))
966 (w (cons (car w) (cons ribcage (cdr w)))))
967 (let parse ((body (map (lambda (x) (cons r (wrap x w mod))) body))
975 (syntax-violation #f "no expressions in body" outer-form)
976 (let ((e (cdar body)) (er (caar body)))
979 (syntax-type e er '(()) (source-annotation e) ribcage mod #f))
980 (lambda (type value form e w s mod)
982 (cond ((memv key '(define-form))
983 (let ((id (wrap value w mod)) (label (gen-label)))
984 (let ((var (gen-var id)))
985 (extend-ribcage! ribcage id label)
991 (cons (cons er (wrap e w mod)) vals)
992 (cons (cons 'lexical var) bindings)))))
993 ((memv key '(define-syntax-form define-syntax-parameter-form))
994 (let ((id (wrap value w mod))
996 (trans-r (macros-only-env er)))
997 (extend-ribcage! ribcage id label)
1002 (list (cons 'macro (eval-local-transformer (expand e trans-r w mod) mod)))
1004 (parse (cdr body) (cons id ids) labels var-ids vars vals bindings)))
1005 ((memv key '(begin-form))
1006 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . each-any))))
1009 (parse (let f ((forms e1))
1012 (cons (cons er (wrap (car forms) w mod)) (f (cdr forms)))))
1022 "source expression failed to match any pattern"
1024 ((memv key '(local-syntax-form))
1025 (expand-local-syntax
1032 (lambda (forms er w s mod)
1033 (parse (let f ((forms forms))
1036 (cons (cons er (wrap (car forms) w mod)) (f (cdr forms)))))
1046 (map (lambda (x) (expand (cdr x) (car x) '(()) mod))
1047 (cons (cons er (source-wrap e w s mod)) (cdr body)))))
1049 (if (not (valid-bound-ids? ids))
1052 "invalid or duplicate identifier in definition"
1054 (set-cdr! r (extend-env labels bindings (cdr r)))
1058 (reverse (map syntax->datum var-ids))
1060 (map (lambda (x) (expand (cdr x) (car x) '(()) mod)) (reverse vals))
1063 (map (lambda (x) (expand (cdr x) (car x) '(()) mod))
1064 (cons (cons er (source-wrap e w s mod)) (cdr body))))))))))))))))
1065 (expand-local-syntax
1066 (lambda (rec? e r w s mod k)
1068 (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
1070 (apply (lambda (id val e1 e2)
1072 (if (not (valid-bound-ids? ids))
1073 (syntax-violation #f "duplicate bound keyword" e)
1074 (let* ((labels (gen-labels ids)) (new-w (make-binding-wrap ids labels w)))
1078 (let ((w (if rec? new-w w)) (trans-r (macros-only-env r)))
1080 (cons 'macro (eval-local-transformer (expand x trans-r w mod) mod)))
1089 "bad local syntax definition"
1090 (source-wrap e w s mod))))))
1091 (eval-local-transformer
1092 (lambda (expanded mod)
1093 (let ((p (local-eval-hook expanded mod)))
1096 (syntax-violation #f "nonprocedure transformer" p)))))
1097 (expand-void (lambda () (build-void #f)))
1100 (and (nonsymbol-id? x)
1101 (free-id=? x '#(syntax-object ... ((top)) (hygiene guile))))))
1105 ((req (lambda (args rreq)
1106 (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
1108 (apply (lambda () (check (reverse rreq) #f)) tmp-1)
1109 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1110 (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
1111 (apply (lambda (a b) (req b (cons a rreq))) tmp-1)
1112 (let ((tmp-1 (list tmp)))
1113 (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
1114 (apply (lambda (r) (check (reverse rreq) r)) tmp-1)
1116 (syntax-violation 'lambda "invalid argument list" orig-args args))))))))))
1117 (check (lambda (req rest)
1118 (if (distinct-bound-ids? (if rest (cons rest req) req))
1119 (values req #f rest #f)
1122 "duplicate identifier in argument list"
1124 (req orig-args '()))))
1125 (expand-simple-lambda
1126 (lambda (e r w s mod req rest meta body)
1127 (let* ((ids (if rest (append req (list rest)) req))
1128 (vars (map gen-var ids))
1129 (labels (gen-labels ids)))
1130 (build-simple-lambda
1132 (map syntax->datum req)
1133 (and rest (syntax->datum rest))
1138 (source-wrap e w s mod)
1139 (extend-var-env labels vars r)
1140 (make-binding-wrap ids labels w)
1145 ((req (lambda (args rreq)
1146 (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
1148 (apply (lambda () (check (reverse rreq) '() #f '())) tmp-1)
1149 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1150 (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
1151 (apply (lambda (a b) (req b (cons a rreq))) tmp-1)
1152 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1154 (apply (lambda (a b) (eq? (syntax->datum a) #:optional)) tmp-1))
1155 (apply (lambda (a b) (opt b (reverse rreq) '())) tmp-1)
1156 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1158 (apply (lambda (a b) (eq? (syntax->datum a) #:key)) tmp-1))
1159 (apply (lambda (a b) (key b (reverse rreq) '() '())) tmp-1)
1160 (let ((tmp-1 ($sc-dispatch tmp '(any any))))
1162 (apply (lambda (a b) (eq? (syntax->datum a) #:rest)) tmp-1))
1163 (apply (lambda (a b) (rest b (reverse rreq) '() '())) tmp-1)
1164 (let ((tmp-1 (list tmp)))
1165 (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
1166 (apply (lambda (r) (rest r (reverse rreq) '() '())) tmp-1)
1170 "invalid argument list"
1172 args))))))))))))))))
1173 (opt (lambda (args req ropt)
1174 (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
1176 (apply (lambda () (check req (reverse ropt) #f '())) tmp-1)
1177 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1178 (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
1179 (apply (lambda (a b) (opt b req (cons (cons a '(#f)) ropt))) tmp-1)
1180 (let ((tmp-1 ($sc-dispatch tmp '((any any) . any))))
1181 (if (and tmp-1 (apply (lambda (a init b) (id? a)) tmp-1))
1182 (apply (lambda (a init b) (opt b req (cons (list a init) ropt)))
1184 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1186 (apply (lambda (a b) (eq? (syntax->datum a) #:key)) tmp-1))
1187 (apply (lambda (a b) (key b req (reverse ropt) '())) tmp-1)
1188 (let ((tmp-1 ($sc-dispatch tmp '(any any))))
1190 (apply (lambda (a b) (eq? (syntax->datum a) #:rest)) tmp-1))
1191 (apply (lambda (a b) (rest b req (reverse ropt) '())) tmp-1)
1192 (let ((tmp-1 (list tmp)))
1193 (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
1194 (apply (lambda (r) (rest r req (reverse ropt) '())) tmp-1)
1198 "invalid optional argument list"
1200 args))))))))))))))))
1201 (key (lambda (args req opt rkey)
1202 (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
1204 (apply (lambda () (check req opt #f (cons #f (reverse rkey)))) tmp-1)
1205 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1206 (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
1207 (apply (lambda (a b)
1208 (let* ((tmp (symbol->keyword (syntax->datum a))) (k tmp))
1209 (key b req opt (cons (cons k (cons a '(#f))) rkey))))
1211 (let ((tmp-1 ($sc-dispatch tmp '((any any) . any))))
1212 (if (and tmp-1 (apply (lambda (a init b) (id? a)) tmp-1))
1213 (apply (lambda (a init b)
1214 (let* ((tmp (symbol->keyword (syntax->datum a))) (k tmp))
1215 (key b req opt (cons (list k a init) rkey))))
1217 (let ((tmp-1 ($sc-dispatch tmp '((any any any) . any))))
1219 (apply (lambda (a init k b) (and (id? a) (keyword? (syntax->datum k))))
1221 (apply (lambda (a init k b) (key b req opt (cons (list k a init) rkey)))
1223 (let ((tmp-1 ($sc-dispatch tmp '(any))))
1225 (apply (lambda (aok) (eq? (syntax->datum aok) #:allow-other-keys))
1227 (apply (lambda (aok) (check req opt #f (cons #t (reverse rkey))))
1229 (let ((tmp-1 ($sc-dispatch tmp '(any any any))))
1231 (apply (lambda (aok a b)
1232 (and (eq? (syntax->datum aok) #:allow-other-keys)
1233 (eq? (syntax->datum a) #:rest)))
1235 (apply (lambda (aok a b) (rest b req opt (cons #t (reverse rkey))))
1237 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1239 (apply (lambda (aok r)
1240 (and (eq? (syntax->datum aok) #:allow-other-keys) (id? r)))
1242 (apply (lambda (aok r) (rest r req opt (cons #t (reverse rkey))))
1244 (let ((tmp-1 ($sc-dispatch tmp '(any any))))
1246 (apply (lambda (a b) (eq? (syntax->datum a) #:rest)) tmp-1))
1247 (apply (lambda (a b) (rest b req opt (cons #f (reverse rkey))))
1249 (let ((tmp-1 (list tmp)))
1250 (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
1251 (apply (lambda (r) (rest r req opt (cons #f (reverse rkey))))
1256 "invalid keyword argument list"
1258 args))))))))))))))))))))))
1259 (rest (lambda (args req opt kw)
1260 (let* ((tmp-1 args) (tmp (list tmp-1)))
1261 (if (and tmp (apply (lambda (r) (id? r)) tmp))
1262 (apply (lambda (r) (check req opt r kw)) tmp)
1264 (syntax-violation 'lambda* "invalid rest argument" orig-args args))))))
1265 (check (lambda (req opt rest kw)
1266 (if (distinct-bound-ids?
1270 (if rest (list rest) '())
1271 (if (pair? kw) (map cadr (cdr kw)) '())))
1272 (values req opt rest kw)
1275 "duplicate identifier in argument list"
1277 (req orig-args '()))))
1279 (lambda (e r w s mod get-formals clauses)
1282 (lambda (req opt rest kw body)
1283 (let ((vars (map gen-var req)) (labels (gen-labels req)))
1284 (let ((r* (extend-var-env labels vars r))
1285 (w* (make-binding-wrap req labels w)))
1287 (map syntax->datum req)
1298 (lambda (req opt rest kw body vars r* w* out inits)
1300 (let* ((tmp-1 (car opt)) (tmp ($sc-dispatch tmp-1 '(any any))))
1302 (apply (lambda (id i)
1303 (let* ((v (gen-var id))
1304 (l (gen-labels (list v)))
1305 (r** (extend-var-env l (list v) r*))
1306 (w** (make-binding-wrap (list id) l w*)))
1316 (cons (syntax->datum id) out)
1317 (cons (expand i r* w* mod) inits))))
1321 "source expression failed to match any pattern"
1324 (let* ((v (gen-var rest))
1325 (l (gen-labels (list v)))
1326 (r* (extend-var-env l (list v) r*))
1327 (w* (make-binding-wrap (list rest) l w*)))
1330 (and (pair? out) (reverse out))
1331 (syntax->datum rest)
1332 (if (pair? kw) (cdr kw) kw)
1337 (and (pair? kw) (car kw))
1343 (and (pair? out) (reverse out))
1345 (if (pair? kw) (cdr kw) kw)
1350 (and (pair? kw) (car kw))
1354 (lambda (req opt rest kw body vars r* w* aok out inits)
1356 (let* ((tmp-1 (car kw)) (tmp ($sc-dispatch tmp-1 '(any any any))))
1358 (apply (lambda (k id i)
1359 (let* ((v (gen-var id))
1360 (l (gen-labels (list v)))
1361 (r** (extend-var-env l (list v) r*))
1362 (w** (make-binding-wrap (list id) l w*)))
1373 (cons (list (syntax->datum k) (syntax->datum id) v) out)
1374 (cons (expand i r* w* mod) inits))))
1378 "source expression failed to match any pattern"
1384 (and (or aok (pair? out)) (cons aok (reverse out)))
1392 (lambda (req opt rest kw body vars r* w* inits meta)
1393 (let* ((tmp body) (tmp-1 ($sc-dispatch tmp '(any any . each-any))))
1395 (apply (lambda (docstring e1 e2) (string? (syntax->datum docstring)))
1397 (apply (lambda (docstring e1 e2)
1408 (append meta (list (cons 'documentation (syntax->datum docstring))))))
1410 (let ((tmp-1 ($sc-dispatch tmp '(#(vector #(each (any . any))) any . each-any))))
1412 (apply (lambda (k v e1 e2)
1423 (append meta (syntax->datum (map cons k v)))))
1425 (let ((tmp-1 ($sc-dispatch tmp '(any . each-any))))
1427 (apply (lambda (e1 e2)
1436 (expand-body (cons e1 e2) (source-wrap e w s mod) r* w* mod)))
1440 "source expression failed to match any pattern"
1442 (let* ((tmp clauses) (tmp-1 ($sc-dispatch tmp '())))
1444 (apply (lambda () (values '() #f)) tmp-1)
1445 (let ((tmp-1 ($sc-dispatch
1447 '((any any . each-any) . #(each (any any . each-any))))))
1449 (apply (lambda (args e1 e2 args* e1* e2*)
1451 (lambda () (get-formals args))
1452 (lambda (req opt rest kw)
1454 (lambda () (parse-req req opt rest kw (cons e1 e2)))
1455 (lambda (meta req opt rest kw inits vars body)
1465 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1469 (lambda (meta* else*)
1472 (build-lambda-case s req opt rest kw inits vars body else*)))))))))
1476 "source expression failed to match any pattern"
1478 (strip (lambda (x w)
1479 (if (memq 'top (car w))
1482 (cond ((syntax-object? x)
1483 (strip (syntax-object-expression x) (syntax-object-wrap x)))
1485 (let ((a (f (car x))) (d (f (cdr x))))
1486 (if (and (eq? a (car x)) (eq? d (cdr x))) x (cons a d))))
1488 (let* ((old (vector->list x)) (new (map f old)))
1489 (let lp ((l1 old) (l2 new))
1490 (cond ((null? l1) x)
1491 ((eq? (car l1) (car l2)) (lp (cdr l1) (cdr l2)))
1492 (else (list->vector new))))))
1496 (let ((id (if (syntax-object? id) (syntax-object-expression id) id)))
1497 (gensym (string-append (symbol->string id) "-")))))
1500 (let lvl ((vars vars) (ls '()) (w '(())))
1501 (cond ((pair? vars) (lvl (cdr vars) (cons (wrap (car vars) w #f) ls) w))
1502 ((id? vars) (cons (wrap vars w #f) ls))
1504 ((syntax-object? vars)
1505 (lvl (syntax-object-expression vars)
1507 (join-wraps w (syntax-object-wrap vars))))
1508 (else (cons vars ls)))))))
1509 (global-extend 'local-syntax 'letrec-syntax #t)
1510 (global-extend 'local-syntax 'let-syntax #f)
1513 'syntax-parameterize
1514 (lambda (e r w s mod)
1516 (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
1517 (if (and tmp (apply (lambda (var val e1 e2) (valid-bound-ids? var)) tmp))
1518 (apply (lambda (var val e1 e2)
1519 (let ((names (map (lambda (x) (id-var-name x w)) var)))
1522 (let ((key (car (lookup n r mod))))
1523 (if (memv key '(displaced-lexical))
1525 'syntax-parameterize
1526 "identifier out of context"
1528 (source-wrap id w s mod)))))
1533 (source-wrap e w s mod)
1536 (let ((trans-r (macros-only-env r)))
1538 (cons 'macro (eval-local-transformer (expand x trans-r w mod) mod)))
1545 'syntax-parameterize
1547 (source-wrap e w s mod))))))
1551 (lambda (e r w s mod)
1552 (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any))))
1554 (apply (lambda (e) (build-data s (strip e w))) tmp)
1555 (syntax-violation 'quote "bad syntax" (source-wrap e w s mod))))))
1561 (lambda (src e r maps ellipsis? mod)
1563 (let* ((label (id-var-name e '(()))) (b (lookup label r mod)))
1564 (cond ((eq? (car b) 'syntax)
1567 (let ((var.lev (cdr b)))
1568 (gen-ref src (car var.lev) (cdr var.lev) maps)))
1569 (lambda (var maps) (values (list 'ref var) maps))))
1570 ((ellipsis? e) (syntax-violation 'syntax "misplaced ellipsis" src))
1571 (else (values (list 'quote e) maps))))
1572 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(any any))))
1573 (if (and tmp-1 (apply (lambda (dots e) (ellipsis? dots)) tmp-1))
1574 (apply (lambda (dots e) (gen-syntax src e r maps (lambda (x) #f) mod))
1576 (let ((tmp-1 ($sc-dispatch tmp '(any any . any))))
1577 (if (and tmp-1 (apply (lambda (x dots y) (ellipsis? dots)) tmp-1))
1578 (apply (lambda (x dots y)
1582 (lambda () (gen-syntax src x r (cons '() maps) ellipsis? mod))
1584 (if (null? (car maps))
1585 (syntax-violation 'syntax "extra ellipsis" src)
1586 (values (gen-map x (car maps)) (cdr maps))))))))
1587 (let* ((tmp y) (tmp ($sc-dispatch tmp '(any . any))))
1588 (if (and tmp (apply (lambda (dots y) (ellipsis? dots)) tmp))
1589 (apply (lambda (dots y)
1593 (lambda () (k (cons '() maps)))
1595 (if (null? (car maps))
1596 (syntax-violation 'syntax "extra ellipsis" src)
1597 (values (gen-mappend x (car maps)) (cdr maps))))))))
1600 (lambda () (gen-syntax src y r maps ellipsis? mod))
1603 (lambda () (k maps))
1604 (lambda (x maps) (values (gen-append x y) maps)))))))))
1606 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
1608 (apply (lambda (x y)
1610 (lambda () (gen-syntax src x r maps ellipsis? mod))
1613 (lambda () (gen-syntax src y r maps ellipsis? mod))
1614 (lambda (y maps) (values (gen-cons x y) maps))))))
1616 (let ((tmp ($sc-dispatch tmp '#(vector (any . each-any)))))
1618 (apply (lambda (e1 e2)
1620 (lambda () (gen-syntax src (cons e1 e2) r maps ellipsis? mod))
1621 (lambda (e maps) (values (gen-vector e) maps))))
1623 (values (list 'quote e) maps))))))))))))
1625 (lambda (src var level maps)
1626 (cond ((= level 0) (values var maps))
1627 ((null? maps) (syntax-violation 'syntax "missing ellipsis" src))
1630 (lambda () (gen-ref src var (- level 1) (cdr maps)))
1631 (lambda (outer-var outer-maps)
1632 (let ((b (assq outer-var (car maps))))
1634 (values (cdr b) maps)
1635 (let ((inner-var (gen-var 'tmp)))
1638 (cons (cons (cons outer-var inner-var) (car maps)) outer-maps)))))))))))
1641 (list 'apply '(primitive append) (gen-map e map-env))))
1644 (let ((formals (map cdr map-env))
1645 (actuals (map (lambda (x) (list 'ref (car x))) map-env)))
1646 (cond ((eq? (car e) 'ref) (car actuals))
1648 (lambda (x) (and (eq? (car x) 'ref) (memq (cadr x) formals)))
1651 (cons (list 'primitive (car e))
1652 (map (let ((r (map cons formals actuals)))
1653 (lambda (x) (cdr (assq (cadr x) r))))
1655 (else (cons 'map (cons (list 'lambda formals e) actuals)))))))
1658 (let ((key (car y)))
1659 (cond ((memv key '(quote))
1660 (cond ((eq? (car x) 'quote) (list 'quote (cons (cadr x) (cadr y))))
1661 ((eq? (cadr y) '()) (list 'list x))
1662 (else (list 'cons x y))))
1663 ((memv key '(list)) (cons 'list (cons x (cdr y))))
1664 (else (list 'cons x y))))))
1665 (gen-append (lambda (x y) (if (equal? y ''()) x (list 'append x y))))
1668 (cond ((eq? (car x) 'list) (cons 'vector (cdr x)))
1669 ((eq? (car x) 'quote) (list 'quote (list->vector (cadr x))))
1670 (else (list 'list->vector x)))))
1672 (let ((key (car x)))
1673 (cond ((memv key '(ref))
1674 (build-lexical-reference 'value #f (cadr x) (cadr x)))
1675 ((memv key '(primitive)) (build-primref #f (cadr x)))
1676 ((memv key '(quote)) (build-data #f (cadr x)))
1677 ((memv key '(lambda))
1678 (if (list? (cadr x))
1679 (build-simple-lambda #f (cadr x) #f (cadr x) '() (regen (caddr x)))
1680 (error "how did we get here" x)))
1682 (build-application #f (build-primref #f (car x)) (map regen (cdr x)))))))))
1683 (lambda (e r w s mod)
1684 (let* ((e (source-wrap e w s mod))
1686 (tmp ($sc-dispatch tmp '(_ any))))
1690 (lambda () (gen-syntax e x r '() ellipsis? mod))
1691 (lambda (e maps) (regen e))))
1693 (syntax-violation 'syntax "bad `syntax' form" e))))))
1697 (lambda (e r w s mod)
1698 (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any any . each-any))))
1700 (apply (lambda (args e1 e2)
1702 (lambda () (lambda-formals args))
1703 (lambda (req opt rest kw)
1704 (let lp ((body (cons e1 e2)) (meta '()))
1705 (let* ((tmp-1 body) (tmp ($sc-dispatch tmp-1 '(any any . each-any))))
1707 (apply (lambda (docstring e1 e2) (string? (syntax->datum docstring)))
1709 (apply (lambda (docstring e1 e2)
1711 (append meta (list (cons 'documentation (syntax->datum docstring))))))
1713 (let ((tmp ($sc-dispatch tmp-1 '(#(vector #(each (any . any))) any . each-any))))
1715 (apply (lambda (k v e1 e2)
1716 (lp (cons e1 e2) (append meta (syntax->datum (map cons k v)))))
1718 (expand-simple-lambda e r w s mod req rest meta body)))))))))
1720 (syntax-violation 'lambda "bad lambda" e)))))
1724 (lambda (e r w s mod)
1725 (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any any . each-any))))
1727 (apply (lambda (args e1 e2)
1737 (list (cons args (cons e1 e2)))))
1738 (lambda (meta lcase) (build-case-lambda s meta lcase))))
1740 (syntax-violation 'lambda "bad lambda*" e)))))
1744 (lambda (e r w s mod)
1747 (lambda (meta clauses)
1749 (lambda () (expand-lambda-case e r w s mod lambda-formals clauses))
1750 (lambda (meta* lcase)
1751 (build-case-lambda s (append meta meta*) lcase))))))
1753 (tmp ($sc-dispatch tmp-1 '(_ . #(each (any any . each-any))))))
1755 (apply (lambda (args e1 e2)
1758 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1763 (let ((tmp ($sc-dispatch tmp-1 '(_ any . #(each (any any . each-any))))))
1765 (apply (lambda (docstring args e1 e2) (string? (syntax->datum docstring)))
1767 (apply (lambda (docstring args e1 e2)
1769 (list (cons 'documentation (syntax->datum docstring)))
1770 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1775 (syntax-violation 'case-lambda "bad case-lambda" e))))))))
1779 (lambda (e r w s mod)
1782 (lambda (meta clauses)
1784 (lambda () (expand-lambda-case e r w s mod lambda*-formals clauses))
1785 (lambda (meta* lcase)
1786 (build-case-lambda s (append meta meta*) lcase))))))
1788 (tmp ($sc-dispatch tmp-1 '(_ . #(each (any any . each-any))))))
1790 (apply (lambda (args e1 e2)
1793 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1798 (let ((tmp ($sc-dispatch tmp-1 '(_ any . #(each (any any . each-any))))))
1800 (apply (lambda (docstring args e1 e2) (string? (syntax->datum docstring)))
1802 (apply (lambda (docstring args e1 e2)
1804 (list (cons 'documentation (syntax->datum docstring)))
1805 (map (lambda (tmp-2 tmp-1 tmp) (cons tmp (cons tmp-1 tmp-2)))
1810 (syntax-violation 'case-lambda "bad case-lambda*" e))))))))
1816 (lambda (e r w s mod constructor ids vals exps)
1817 (if (not (valid-bound-ids? ids))
1818 (syntax-violation 'let "duplicate bound variable" e)
1819 (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
1820 (let ((nw (make-binding-wrap ids labels w))
1821 (nr (extend-var-env labels new-vars r)))
1824 (map syntax->datum ids)
1826 (map (lambda (x) (expand x r w mod)) vals)
1827 (expand-body exps (source-wrap e nw s mod) nr nw mod))))))))
1828 (lambda (e r w s mod)
1830 (tmp ($sc-dispatch tmp-1 '(_ #(each (any any)) any . each-any))))
1831 (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
1832 (apply (lambda (id val e1 e2)
1833 (expand-let e r w s mod build-let id val (cons e1 e2)))
1835 (let ((tmp ($sc-dispatch tmp-1 '(_ any #(each (any any)) any . each-any))))
1837 (apply (lambda (f id val e1 e2) (and (id? f) (and-map id? id))) tmp))
1838 (apply (lambda (f id val e1 e2)
1839 (expand-let e r w s mod build-named-let (cons f id) val (cons e1 e2)))
1841 (syntax-violation 'let "bad let" (source-wrap e w s mod)))))))))
1845 (lambda (e r w s mod)
1847 (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
1848 (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
1849 (apply (lambda (id val e1 e2)
1851 (if (not (valid-bound-ids? ids))
1852 (syntax-violation 'letrec "duplicate bound variable" e)
1853 (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
1854 (let ((w (make-binding-wrap ids labels w))
1855 (r (extend-var-env labels new-vars r)))
1859 (map syntax->datum ids)
1861 (map (lambda (x) (expand x r w mod)) val)
1862 (expand-body (cons e1 e2) (source-wrap e w s mod) r w mod)))))))
1864 (syntax-violation 'letrec "bad letrec" (source-wrap e w s mod))))))
1868 (lambda (e r w s mod)
1870 (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
1871 (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
1872 (apply (lambda (id val e1 e2)
1874 (if (not (valid-bound-ids? ids))
1875 (syntax-violation 'letrec* "duplicate bound variable" e)
1876 (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
1877 (let ((w (make-binding-wrap ids labels w))
1878 (r (extend-var-env labels new-vars r)))
1882 (map syntax->datum ids)
1884 (map (lambda (x) (expand x r w mod)) val)
1885 (expand-body (cons e1 e2) (source-wrap e w s mod) r w mod)))))))
1887 (syntax-violation 'letrec* "bad letrec*" (source-wrap e w s mod))))))
1891 (lambda (e r w s mod)
1892 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
1893 (if (and tmp (apply (lambda (id val) (id? id)) tmp))
1894 (apply (lambda (id val)
1895 (let ((n (id-var-name id w))
1896 (id-mod (if (syntax-object? id) (syntax-object-module id) mod)))
1897 (let* ((b (lookup n r id-mod)) (key (car b)))
1898 (cond ((memv key '(lexical))
1899 (build-lexical-assignment
1903 (expand val r w mod)))
1904 ((memv key '(global))
1905 (build-global-assignment s n (expand val r w mod) id-mod))
1906 ((memv key '(macro))
1908 (if (procedure-property p 'variable-transformer)
1909 (expand (expand-macro p e r w s #f mod) r '(()) mod)
1912 "not a variable transformer"
1914 (wrap id w id-mod)))))
1915 ((memv key '(displaced-lexical))
1916 (syntax-violation 'set! "identifier out of context" (wrap id w mod)))
1917 (else (syntax-violation 'set! "bad set!" (source-wrap e w s mod)))))))
1919 (let ((tmp ($sc-dispatch tmp-1 '(_ (any . each-any) any))))
1921 (apply (lambda (head tail val)
1923 (lambda () (syntax-type head r '(()) #f #f mod #t))
1924 (lambda (type value formform ee ww ss modmod)
1926 (if (memv key '(module-ref))
1927 (let ((val (expand val r w mod)))
1929 (lambda () (value (cons head tail) r w))
1930 (lambda (e r w s* mod)
1931 (let* ((tmp-1 e) (tmp (list tmp-1)))
1932 (if (and tmp (apply (lambda (e) (id? e)) tmp))
1933 (apply (lambda (e) (build-global-assignment s (syntax->datum e) val mod))
1937 "source expression failed to match any pattern"
1942 (list '#(syntax-object setter ((top)) (hygiene guile)) head)
1946 (map (lambda (e) (expand e r w mod)) (append tail (list val)))))))))
1948 (syntax-violation 'set! "bad set!" (source-wrap e w s mod))))))))
1953 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any))))
1955 (apply (lambda (mod id) (and (and-map id? mod) (id? id))) tmp))
1956 (apply (lambda (mod id)
1963 (cons '#(syntax-object public ((top)) (hygiene guile)) mod))))
1967 "source expression failed to match any pattern"
1976 (cond ((pair? x) (cons (remodulate (car x) mod) (remodulate (cdr x) mod)))
1979 (remodulate (syntax-object-expression x) mod)
1980 (syntax-object-wrap x)
1983 (let* ((n (vector-length x)) (v (make-vector n)))
1986 (begin (if #f #f) v)
1988 (vector-set! v i (remodulate (vector-ref x i) mod))
1991 (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any))))
1993 (apply (lambda (mod id) (and (and-map id? mod) (id? id))) tmp))
1994 (apply (lambda (mod id)
2001 (cons '#(syntax-object private ((top)) (hygiene guile)) mod))))
2003 (let ((tmp ($sc-dispatch
2005 '(_ #(free-id #(syntax-object @@ ((top)) (hygiene guile)))
2008 (if (and tmp (apply (lambda (mod exp) (and-map id? mod)) tmp))
2009 (apply (lambda (mod exp)
2010 (let ((mod (syntax->datum
2011 (cons '#(syntax-object private ((top)) (hygiene guile)) mod))))
2012 (values (remodulate exp mod) r w (source-annotation exp) mod)))
2016 "source expression failed to match any pattern"
2021 (lambda (e r w s mod)
2022 (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any any))))
2024 (apply (lambda (test then)
2027 (expand test r w mod)
2028 (expand then r w mod)
2031 (let ((tmp-1 ($sc-dispatch tmp '(_ any any any))))
2033 (apply (lambda (test then else)
2036 (expand test r w mod)
2037 (expand then r w mod)
2038 (expand else r w mod)))
2042 "source expression failed to match any pattern"
2047 (lambda (e r w s mod)
2049 (tmp ($sc-dispatch tmp-1 '(_ #(each (any any)) any . each-any))))
2051 (apply (lambda (fluid val b b*)
2054 (map (lambda (x) (expand x r w mod)) fluid)
2055 (map (lambda (x) (expand x r w mod)) val)
2056 (expand-body (cons b b*) (source-wrap e w s mod) r w mod)))
2060 "source expression failed to match any pattern"
2062 (global-extend 'begin 'begin '())
2063 (global-extend 'define 'define '())
2064 (global-extend 'define-syntax 'define-syntax '())
2065 (global-extend 'define-syntax-parameter 'define-syntax-parameter '())
2066 (global-extend 'eval-when 'eval-when '())
2072 (lambda (pattern keys)
2074 ((cvt* (lambda (p* n ids)
2075 (if (not (pair? p*))
2078 (lambda () (cvt* (cdr p*) n ids))
2081 (lambda () (cvt (car p*) n ids))
2082 (lambda (x ids) (values (cons x y) ids))))))))
2085 (let loop ((r '()) (x x))
2086 (if (not (pair? x)) (values r x) (loop (cons (car x) r) (cdr x))))))
2087 (cvt (lambda (p n ids)
2089 (cond ((bound-id-member? p keys) (values (vector 'free-id p) ids))
2090 ((free-id=? p '#(syntax-object _ ((top)) (hygiene guile)))
2092 (else (values 'any (cons (cons p n) ids))))
2093 (let* ((tmp p) (tmp-1 ($sc-dispatch tmp '(any any))))
2094 (if (and tmp-1 (apply (lambda (x dots) (ellipsis? dots)) tmp-1))
2095 (apply (lambda (x dots)
2097 (lambda () (cvt x (+ n 1) ids))
2099 (values (if (eq? p 'any) 'each-any (vector 'each p)) ids))))
2101 (let ((tmp-1 ($sc-dispatch tmp '(any any . any))))
2102 (if (and tmp-1 (apply (lambda (x dots ys) (ellipsis? dots)) tmp-1))
2103 (apply (lambda (x dots ys)
2105 (lambda () (cvt* ys n ids))
2108 (lambda () (cvt x (+ n 1) ids))
2111 (lambda () (v-reverse ys))
2112 (lambda (ys e) (values (vector 'each+ x ys e) ids))))))))
2114 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
2116 (apply (lambda (x y)
2118 (lambda () (cvt y n ids))
2121 (lambda () (cvt x n ids))
2122 (lambda (x ids) (values (cons x y) ids))))))
2124 (let ((tmp-1 ($sc-dispatch tmp '())))
2126 (apply (lambda () (values '() ids)) tmp-1)
2127 (let ((tmp-1 ($sc-dispatch tmp '#(vector each-any))))
2131 (lambda () (cvt x n ids))
2132 (lambda (p ids) (values (vector 'vector p) ids))))
2134 (let ((x tmp)) (values (vector 'atom (strip p '(()))) ids))))))))))))))))
2135 (cvt pattern 0 '()))))
2136 (build-dispatch-call
2137 (lambda (pvars exp y r mod)
2138 (let ((ids (map car pvars)) (levels (map cdr pvars)))
2139 (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
2142 (build-primref #f 'apply)
2143 (list (build-simple-lambda
2145 (map syntax->datum ids)
2153 (map (lambda (var level) (cons 'syntax (cons var level)))
2157 (make-binding-wrap ids labels '(()))
2161 (lambda (x keys clauses r pat fender exp mod)
2163 (lambda () (convert-pattern pat keys))
2165 (cond ((not (distinct-bound-ids? (map car pvars)))
2166 (syntax-violation 'syntax-case "duplicate pattern variable" pat))
2167 ((not (and-map (lambda (x) (not (ellipsis? (car x)))) pvars))
2168 (syntax-violation 'syntax-case "misplaced ellipsis" pat))
2170 (let ((y (gen-var 'tmp)))
2173 (build-simple-lambda
2179 (let ((y (build-lexical-reference 'value #f 'tmp y)))
2182 (let* ((tmp fender) (tmp ($sc-dispatch tmp '#(atom #t))))
2184 (apply (lambda () y) tmp)
2188 (build-dispatch-call pvars fender y r mod)
2189 (build-data #f #f))))
2190 (build-dispatch-call pvars exp y r mod)
2191 (gen-syntax-case x keys clauses r mod))))
2192 (list (if (eq? p 'any)
2193 (build-application #f (build-primref #f 'list) (list x))
2196 (build-primref #f '$sc-dispatch)
2197 (list x (build-data #f p)))))))))))))
2199 (lambda (x keys clauses r mod)
2203 (build-primref #f 'syntax-violation)
2204 (list (build-data #f #f)
2205 (build-data #f "source expression failed to match any pattern")
2207 (let* ((tmp-1 (car clauses)) (tmp ($sc-dispatch tmp-1 '(any any))))
2209 (apply (lambda (pat exp)
2212 (lambda (x) (not (free-id=? pat x)))
2213 (cons '#(syntax-object ... ((top)) (hygiene guile)) keys)))
2214 (if (free-id=? pat '#(syntax-object _ ((top)) (hygiene guile)))
2215 (expand exp r '(()) mod)
2216 (let ((labels (list (gen-label))) (var (gen-var pat)))
2219 (build-simple-lambda
2221 (list (syntax->datum pat))
2227 (extend-env labels (list (cons 'syntax (cons var 0))) r)
2228 (make-binding-wrap (list pat) labels '(()))
2231 (gen-clause x keys (cdr clauses) r pat #t exp mod)))
2233 (let ((tmp ($sc-dispatch tmp-1 '(any any any))))
2235 (apply (lambda (pat fender exp)
2236 (gen-clause x keys (cdr clauses) r pat fender exp mod))
2238 (syntax-violation 'syntax-case "invalid clause" (car clauses))))))))))
2239 (lambda (e r w s mod)
2240 (let* ((e (source-wrap e w s mod))
2242 (tmp ($sc-dispatch tmp-1 '(_ any each-any . each-any))))
2244 (apply (lambda (val key m)
2245 (if (and-map (lambda (x) (and (id? x) (not (ellipsis? x)))) key)
2246 (let ((x (gen-var 'tmp)))
2249 (build-simple-lambda
2256 (build-lexical-reference 'value #f 'tmp x)
2261 (list (expand val r '(()) mod))))
2262 (syntax-violation 'syntax-case "invalid literals list" e)))
2266 "source expression failed to match any pattern"
2269 (lambda* (x #:optional (m 'e) (esew '(eval)))
2270 (expand-top-sequence
2277 (cons 'hygiene (module-name (current-module))))))
2278 (set! identifier? (lambda (x) (nonsymbol-id? x)))
2283 (syntax-object-wrap id)
2284 (syntax-object-module id))))
2285 (set! syntax->datum (lambda (x) (strip x '(()))))
2286 (set! syntax-source (lambda (x) (source-annotation x)))
2287 (set! generate-temporaries
2291 (syntax-violation 'generate-temporaries "invalid argument" x)))
2292 (let ((mod (cons 'hygiene (module-name (current-module)))))
2293 (map (lambda (x) (wrap (gensym "t-") '((top)) mod)) ls))))
2294 (set! free-identifier=?
2297 (if (not (nonsymbol-id? x))
2298 (syntax-violation 'free-identifier=? "invalid argument" x)))
2300 (if (not (nonsymbol-id? x))
2301 (syntax-violation 'free-identifier=? "invalid argument" x)))
2303 (set! bound-identifier=?
2306 (if (not (nonsymbol-id? x))
2307 (syntax-violation 'bound-identifier=? "invalid argument" x)))
2309 (if (not (nonsymbol-id? x))
2310 (syntax-violation 'bound-identifier=? "invalid argument" x)))
2312 (set! syntax-violation
2313 (lambda* (who message form #:optional (subform #f))
2315 (if (not (let ((x x)) (or (not x) (string? x) (symbol? x))))
2316 (syntax-violation 'syntax-violation "invalid argument" x)))
2318 (if (not (string? x))
2319 (syntax-violation 'syntax-violation "invalid argument" x)))
2320 (throw 'syntax-error
2323 (or (source-annotation subform) (source-annotation form))
2325 (and subform (strip subform '(()))))))
2330 (if (not (nonsymbol-id? x))
2331 (syntax-violation 'syntax-module "invalid argument" x)))
2332 (cdr (syntax-object-module id))))
2333 (syntax-local-binding
2336 (if (not (nonsymbol-id? x))
2337 (syntax-violation 'syntax-local-binding "invalid argument" x)))
2338 (with-transformer-environment
2339 (lambda (e r w s rib mod)
2343 (let ((ms (car w)) (s (cdr w)))
2344 (if (and (pair? ms) (eq? (car ms) #f))
2345 (cons (cdr ms) (if rib (cons rib (cdr s)) (cdr s)))
2346 (cons ms (if rib (cons rib s) s)))))))
2350 (syntax-object-expression id)
2351 (strip-anti-mark (syntax-object-wrap id))
2353 (syntax-object-module id)))
2354 (lambda (type value mod)
2356 (cond ((memv key '(lexical)) (values 'lexical value))
2357 ((memv key '(macro)) (values 'macro value))
2358 ((memv key '(syntax)) (values 'pattern-variable value))
2359 ((memv key '(displaced-lexical)) (values 'displaced-lexical #f))
2360 ((memv key '(global)) (values 'global (cons value (cdr mod))))
2361 (else (values 'other #f)))))))))))
2362 (syntax-locally-bound-identifiers
2365 (if (not (nonsymbol-id? x))
2367 'syntax-locally-bound-identifiers
2370 (locally-bound-identifiers
2371 (syntax-object-wrap id)
2372 (syntax-object-module id)))))
2373 (define! 'syntax-module syntax-module)
2374 (define! 'syntax-local-binding syntax-local-binding)
2376 'syntax-locally-bound-identifiers
2377 syntax-locally-bound-identifiers))
2382 (let ((first (match (car e) p w '() mod)))
2384 (let ((rest (match-each (cdr e) p w mod)))
2385 (and rest (cons first rest))))))
2389 (syntax-object-expression e)
2391 (join-wraps w (syntax-object-wrap e))
2392 (syntax-object-module e)))
2395 (lambda (e x-pat y-pat z-pat w r mod)
2396 (let f ((e e) (w w))
2399 (lambda () (f (cdr e) w))
2400 (lambda (xr* y-pat r)
2403 (let ((xr (match (car e) x-pat w '() mod)))
2404 (if xr (values (cons xr xr*) y-pat r) (values #f #f #f)))
2405 (values '() (cdr y-pat) (match (car e) (car y-pat) w r mod)))
2406 (values #f #f #f)))))
2408 (f (syntax-object-expression e) (join-wraps w e)))
2409 (else (values '() y-pat (match e z-pat w r mod)))))))
2413 (let ((l (match-each-any (cdr e) w mod)))
2414 (and l (cons (wrap (car e) w mod) l))))
2418 (syntax-object-expression e)
2419 (join-wraps w (syntax-object-wrap e))
2426 ((eq? p 'any) (cons '() r))
2427 ((pair? p) (match-empty (car p) (match-empty (cdr p) r)))
2428 ((eq? p 'each-any) (cons '() r))
2430 (let ((key (vector-ref p 0)))
2431 (cond ((memv key '(each)) (match-empty (vector-ref p 1) r))
2432 ((memv key '(each+))
2436 (reverse (vector-ref p 2))
2437 (match-empty (vector-ref p 3) r))))
2438 ((memv key '(free-id atom)) r)
2439 ((memv key '(vector)) (match-empty (vector-ref p 1) r))))))))
2442 (if (null? (car r*)) r (cons (map car r*) (combine (map cdr r*) r)))))
2444 (lambda (e p w r mod)
2445 (cond ((null? p) (and (null? e) r))
2448 (match (car e) (car p) w (match (cdr e) (cdr p) w r mod) mod)))
2450 (let ((l (match-each-any e w mod))) (and l (cons l r))))
2452 (let ((key (vector-ref p 0)))
2453 (cond ((memv key '(each))
2455 (match-empty (vector-ref p 1) r)
2456 (let ((l (match-each e (vector-ref p 1) w mod)))
2458 (let collect ((l l))
2459 (if (null? (car l)) r (cons (map car l) (collect (map cdr l)))))))))
2460 ((memv key '(each+))
2471 (lambda (xr* y-pat r)
2474 (if (null? xr*) (match-empty (vector-ref p 1) r) (combine xr* r))))))
2475 ((memv key '(free-id))
2476 (and (id? e) (free-id=? (wrap e w mod) (vector-ref p 1)) r))
2477 ((memv key '(atom)) (and (equal? (vector-ref p 1) (strip e w)) r))
2478 ((memv key '(vector))
2479 (and (vector? e) (match (vector->list e) (vector-ref p 1) w r mod)))))))))
2480 (match (lambda (e p w r mod)
2483 ((eq? p 'any) (cons (wrap e w mod) r))
2486 (syntax-object-expression e)
2488 (join-wraps w (syntax-object-wrap e))
2490 (syntax-object-module e)))
2491 (else (match* e p w r mod))))))
2494 (cond ((eq? p 'any) (list e))
2498 (syntax-object-expression e)
2500 (syntax-object-wrap e)
2502 (syntax-object-module e)))
2503 (else (match* e p '(()) '() #f)))))))
2506 (make-syntax-transformer
2511 (let ((tmp-1 ($sc-dispatch tmp '(_ () any . each-any))))
2513 (apply (lambda (e1 e2)
2514 (cons '#(syntax-object let ((top)) (hygiene guile))
2515 (cons '() (cons e1 e2))))
2517 (let ((tmp-1 ($sc-dispatch tmp '(_ ((any any)) any . each-any))))
2519 (apply (lambda (out in e1 e2)
2520 (list '#(syntax-object syntax-case ((top)) (hygiene guile))
2524 (cons '#(syntax-object let ((top)) (hygiene guile))
2525 (cons '() (cons e1 e2))))))
2527 (let ((tmp-1 ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
2529 (apply (lambda (out in e1 e2)
2530 (list '#(syntax-object syntax-case ((top)) (hygiene guile))
2531 (cons '#(syntax-object list ((top)) (hygiene guile)) in)
2534 (cons '#(syntax-object let ((top)) (hygiene guile))
2535 (cons '() (cons e1 e2))))))
2539 "source expression failed to match any pattern"
2542 (define syntax-rules
2543 (make-syntax-transformer
2548 (let ((tmp ($sc-dispatch tmp-1 '(_ each-any . #(each ((any . any) any))))))
2550 (apply (lambda (k keyword pattern template)
2551 (list '#(syntax-object lambda ((top)) (hygiene guile))
2552 '(#(syntax-object x ((top)) (hygiene guile)))
2554 '(#(syntax-object macro-type ((top)) (hygiene guile))
2556 #(syntax-object syntax-rules ((top)) (hygiene guile)))
2557 (cons '#(syntax-object patterns ((top)) (hygiene guile)) pattern))
2558 (cons '#(syntax-object syntax-case ((top)) (hygiene guile))
2559 (cons '#(syntax-object x ((top)) (hygiene guile))
2561 (map (lambda (tmp-1 tmp)
2562 (list (cons '#(syntax-object dummy ((top)) (hygiene guile)) tmp)
2563 (list '#(syntax-object syntax ((top)) (hygiene guile))
2568 (let ((tmp ($sc-dispatch tmp-1 '(_ each-any any . #(each ((any . any) any))))))
2570 (apply (lambda (k docstring keyword pattern template)
2571 (string? (syntax->datum docstring)))
2574 (apply (lambda (k docstring keyword pattern template)
2575 (list '#(syntax-object lambda ((top)) (hygiene guile))
2576 '(#(syntax-object x ((top)) (hygiene guile)))
2579 '(#(syntax-object macro-type ((top)) (hygiene guile))
2581 #(syntax-object syntax-rules ((top)) (hygiene guile)))
2582 (cons '#(syntax-object patterns ((top)) (hygiene guile)) pattern))
2583 (cons '#(syntax-object syntax-case ((top)) (hygiene guile))
2584 (cons '#(syntax-object x ((top)) (hygiene guile))
2586 (map (lambda (tmp-1 tmp)
2587 (list (cons '#(syntax-object dummy ((top)) (hygiene guile)) tmp)
2588 (list '#(syntax-object syntax ((top)) (hygiene guile))
2595 "source expression failed to match any pattern"
2598 (define define-syntax-rule
2599 (make-syntax-transformer
2604 (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any))))
2606 (apply (lambda (name pattern template)
2607 (list '#(syntax-object define-syntax ((top)) (hygiene guile))
2609 (list '#(syntax-object syntax-rules ((top)) (hygiene guile))
2611 (list (cons '#(syntax-object _ ((top)) (hygiene guile)) pattern)
2614 (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any any))))
2616 (apply (lambda (name pattern docstring template)
2617 (string? (syntax->datum docstring)))
2620 (apply (lambda (name pattern docstring template)
2621 (list '#(syntax-object define-syntax ((top)) (hygiene guile))
2623 (list '#(syntax-object syntax-rules ((top)) (hygiene guile))
2626 (list (cons '#(syntax-object _ ((top)) (hygiene guile)) pattern)
2631 "source expression failed to match any pattern"
2635 (make-syntax-transformer
2640 (let ((tmp ($sc-dispatch tmp-1 '(any #(each (any any)) any . each-any))))
2642 (apply (lambda (let* x v e1 e2) (and-map identifier? x)) tmp)
2644 (apply (lambda (let* x v e1 e2)
2645 (let f ((bindings (map list x v)))
2646 (if (null? bindings)
2647 (cons '#(syntax-object let ((top)) (hygiene guile))
2648 (cons '() (cons e1 e2)))
2649 (let ((tmp-1 (list (f (cdr bindings)) (car bindings))))
2650 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
2652 (apply (lambda (body binding)
2653 (list '#(syntax-object let ((top)) (hygiene guile))
2659 "source expression failed to match any pattern"
2664 "source expression failed to match any pattern"
2668 (make-syntax-transformer
2672 ((quasi (lambda (p lev)
2674 (let ((tmp-1 ($sc-dispatch
2676 '(#(free-id #(syntax-object unquote ((top)) (hygiene guile))) any))))
2682 '("quote" #(syntax-object unquote ((top)) (hygiene guile)))
2683 (quasi (list p) (- lev 1)))))
2685 (let ((tmp-1 ($sc-dispatch
2687 '(#(free-id #(syntax-object quasiquote ((top)) (hygiene guile))) any))))
2691 '("quote" #(syntax-object quasiquote ((top)) (hygiene guile)))
2692 (quasi (list p) (+ lev 1))))
2694 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
2696 (apply (lambda (p q)
2698 (let ((tmp ($sc-dispatch
2700 '(#(free-id #(syntax-object unquote ((top)) (hygiene guile)))
2707 (map (lambda (tmp) (list "value" tmp)) p)
2711 '("quote" #(syntax-object unquote ((top)) (hygiene guile)))
2712 (quasi p (- lev 1)))
2715 (let ((tmp ($sc-dispatch
2718 #(syntax-object unquote-splicing ((top)) (hygiene guile)))
2725 (map (lambda (tmp) (list "value" tmp)) p)
2734 (quasi p (- lev 1)))
2737 (quasicons (quasi p lev) (quasi q lev))))))))
2739 (let ((tmp-1 ($sc-dispatch tmp '#(vector each-any))))
2741 (apply (lambda (x) (quasivector (vquasi x lev))) tmp-1)
2742 (let ((p tmp)) (list "quote" p)))))))))))))
2746 (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
2748 (apply (lambda (p q)
2750 (let ((tmp ($sc-dispatch
2752 '(#(free-id #(syntax-object unquote ((top)) (hygiene guile)))
2758 (quasilist* (map (lambda (tmp) (list "value" tmp)) p) (vquasi q lev))
2761 '("quote" #(syntax-object unquote ((top)) (hygiene guile)))
2762 (quasi p (- lev 1)))
2765 (let ((tmp ($sc-dispatch
2767 '(#(free-id #(syntax-object unquote-splicing ((top)) (hygiene guile)))
2774 (map (lambda (tmp) (list "value" tmp)) p)
2778 '("quote" #(syntax-object unquote-splicing ((top)) (hygiene guile)))
2779 (quasi p (- lev 1)))
2782 (quasicons (quasi p lev) (vquasi q lev))))))))
2784 (let ((tmp-1 ($sc-dispatch tmp '())))
2786 (apply (lambda () '("quote" ())) tmp-1)
2789 "source expression failed to match any pattern"
2793 (let ((tmp-1 (list x y)))
2794 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
2796 (apply (lambda (x y)
2798 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") any))))
2802 (let ((tmp ($sc-dispatch tmp '(#(atom "quote") any))))
2804 (apply (lambda (dx) (list "quote" (cons dx dy))) tmp)
2805 (if (null? dy) (list "list" x) (list "list*" x y))))))
2807 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . any))))
2809 (apply (lambda (stuff) (cons "list" (cons x stuff))) tmp-1)
2810 (let ((tmp ($sc-dispatch tmp '(#(atom "list*") . any))))
2812 (apply (lambda (stuff) (cons "list*" (cons x stuff))) tmp)
2813 (list "list*" x y)))))))))
2817 "source expression failed to match any pattern"
2822 (let ((tmp ($sc-dispatch tmp '(#(atom "quote") ()))))
2830 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2832 (apply (lambda (p) (cons "append" p)) tmp)
2835 "source expression failed to match any pattern"
2840 (let ((tmp-1 (list x y)))
2841 (let ((tmp ($sc-dispatch tmp-1 '(each-any any))))
2843 (apply (lambda (p y) (cons "append" (append p (list y)))) tmp)
2846 "source expression failed to match any pattern"
2850 (let f ((x x)) (if (null? x) y (quasicons (car x) (f (cdr x)))))))
2854 (let ((tmp ($sc-dispatch tmp '(#(atom "quote") each-any))))
2856 (apply (lambda (x) (list "quote" (list->vector x))) tmp)
2860 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2862 (apply (lambda (t) (cons "vector" t)) tmp)
2865 "source expression failed to match any pattern"
2868 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") each-any))))
2870 (apply (lambda (y) (k (map (lambda (tmp) (list "quote" tmp)) y)))
2872 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . each-any))))
2874 (apply (lambda (y) (k y)) tmp-1)
2875 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list*") . #(each+ any (any) ())))))
2877 (apply (lambda (y z) (f z (lambda (ls) (k (append y ls))))) tmp-1)
2879 (let ((tmp x)) (let ((t tmp)) (list "list->vector" t)))))))))))))))))
2882 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") any))))
2884 (apply (lambda (x) (list '#(syntax-object quote ((top)) (hygiene guile)) x))
2886 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . each-any))))
2889 (let ((tmp-1 (map emit x)))
2890 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2892 (apply (lambda (t) (cons '#(syntax-object list ((top)) (hygiene guile)) t))
2896 "source expression failed to match any pattern"
2899 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list*") . #(each+ any (any) ())))))
2901 (apply (lambda (x y)
2905 (let ((tmp-1 (list (emit (car x*)) (f (cdr x*)))))
2906 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
2908 (apply (lambda (t-1 t)
2909 (list '#(syntax-object cons ((top)) (hygiene guile)) t-1 t))
2913 "source expression failed to match any pattern"
2916 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "append") . each-any))))
2919 (let ((tmp-1 (map emit x)))
2920 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2923 (cons '#(syntax-object append ((top)) (hygiene guile)) t))
2927 "source expression failed to match any pattern"
2930 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "vector") . each-any))))
2933 (let ((tmp-1 (map emit x)))
2934 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2937 (cons '#(syntax-object vector ((top)) (hygiene guile)) t))
2941 "source expression failed to match any pattern"
2944 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list->vector") any))))
2947 (let ((tmp (emit x)))
2949 (list '#(syntax-object list->vector ((top)) (hygiene guile)) t))))
2951 (let ((tmp-1 ($sc-dispatch tmp '(#(atom "value") any))))
2953 (apply (lambda (x) x) tmp-1)
2956 "source expression failed to match any pattern"
2957 tmp)))))))))))))))))))
2960 (let ((tmp ($sc-dispatch tmp-1 '(_ any))))
2962 (apply (lambda (e) (emit (quasi e 0))) tmp)
2965 "source expression failed to match any pattern"
2969 (make-syntax-transformer
2976 (let ((p (open-input-file
2977 (if (absolute-file-name? fn) fn (in-vicinity dir fn)))))
2978 (let f ((x (read p)) (result '()))
2980 (begin (close-input-port p) (reverse result))
2981 (f (read p) (cons (datum->syntax k x) result))))))))
2982 (let ((src (syntax-source x)))
2983 (let ((file (if src (assq-ref src 'filename) #f)))
2984 (let ((dir (if (string? file) (dirname file) #f)))
2986 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
2988 (apply (lambda (k filename)
2989 (let ((fn (syntax->datum filename)))
2990 (let ((tmp-1 (read-file fn dir filename)))
2991 (let ((tmp ($sc-dispatch tmp-1 'each-any)))
2993 (apply (lambda (exp)
2994 (cons '#(syntax-object begin ((top)) (hygiene guile)) exp))
2998 "source expression failed to match any pattern"
3003 "source expression failed to match any pattern"
3006 (define include-from-path
3007 (make-syntax-transformer
3012 (let ((tmp ($sc-dispatch tmp-1 '(any any))))
3014 (apply (lambda (k filename)
3015 (let ((fn (syntax->datum filename)))
3016 (let ((tmp (datum->syntax
3018 (let ((t (%search-load-path fn)))
3023 "file not found in path"
3027 (list '#(syntax-object include ((top)) (hygiene guile)) fn)))))
3031 "source expression failed to match any pattern"
3035 (make-syntax-transformer
3041 "expression not valid outside of quasiquote"
3044 (define unquote-splicing
3045 (make-syntax-transformer
3051 "expression not valid outside of quasiquote"
3054 (define make-variable-transformer
3056 (if (procedure? proc)
3057 (let ((trans (lambda (x) (proc x))))
3058 (set-procedure-property! trans 'variable-transformer #t)
3060 (error "variable transformer not a procedure" proc))))
3062 (define identifier-syntax
3063 (make-syntax-transformer
3068 (let ((tmp ($sc-dispatch tmp-1 '(_ any))))
3071 (list '#(syntax-object lambda ((top)) (hygiene guile))
3072 '(#(syntax-object x ((top)) (hygiene guile)))
3073 '#((#(syntax-object macro-type ((top)) (hygiene guile))
3075 #(syntax-object identifier-syntax ((top)) (hygiene guile))))
3076 (list '#(syntax-object syntax-case ((top)) (hygiene guile))
3077 '#(syntax-object x ((top)) (hygiene guile))
3079 (list '#(syntax-object id ((top)) (hygiene guile))
3080 '(#(syntax-object identifier? ((top)) (hygiene guile))
3081 (#(syntax-object syntax ((top)) (hygiene guile))
3082 #(syntax-object id ((top)) (hygiene guile))))
3083 (list '#(syntax-object syntax ((top)) (hygiene guile)) e))
3084 (list '(#(syntax-object _ ((top)) (hygiene guile))
3085 #(syntax-object x ((top)) (hygiene guile))
3086 #(syntax-object ... ((top)) (hygiene guile)))
3087 (list '#(syntax-object syntax ((top)) (hygiene guile))
3089 '(#(syntax-object x ((top)) (hygiene guile))
3090 #(syntax-object ... ((top)) (hygiene guile)))))))))
3092 (let ((tmp ($sc-dispatch
3095 ((#(free-id #(syntax-object set! ((top)) (hygiene guile))) any any)
3098 (apply (lambda (id exp1 var val exp2)
3099 (if (identifier? id) (identifier? var) #f))
3102 (apply (lambda (id exp1 var val exp2)
3103 (list '#(syntax-object make-variable-transformer ((top)) (hygiene guile))
3104 (list '#(syntax-object lambda ((top)) (hygiene guile))
3105 '(#(syntax-object x ((top)) (hygiene guile)))
3106 '#((#(syntax-object macro-type ((top)) (hygiene guile))
3108 #(syntax-object variable-transformer ((top)) (hygiene guile))))
3109 (list '#(syntax-object syntax-case ((top)) (hygiene guile))
3110 '#(syntax-object x ((top)) (hygiene guile))
3111 '(#(syntax-object set! ((top)) (hygiene guile)))
3112 (list (list '#(syntax-object set! ((top)) (hygiene guile)) var val)
3113 (list '#(syntax-object syntax ((top)) (hygiene guile)) exp2))
3115 '(#(syntax-object x ((top)) (hygiene guile))
3116 #(syntax-object ... ((top)) (hygiene guile))))
3117 (list '#(syntax-object syntax ((top)) (hygiene guile))
3119 '(#(syntax-object x ((top)) (hygiene guile))
3120 #(syntax-object ... ((top)) (hygiene guile))))))
3122 (list '#(syntax-object identifier? ((top)) (hygiene guile))
3123 (list '#(syntax-object syntax ((top)) (hygiene guile)) id))
3124 (list '#(syntax-object syntax ((top)) (hygiene guile)) exp1))))))
3128 "source expression failed to match any pattern"
3132 (make-syntax-transformer
3137 (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any . each-any))))
3139 (apply (lambda (id args b0 b1)
3140 (list '#(syntax-object define ((top)) (hygiene guile))
3142 (cons '#(syntax-object lambda* ((top)) (hygiene guile))
3143 (cons args (cons b0 b1)))))
3145 (let ((tmp ($sc-dispatch tmp-1 '(_ any any))))
3146 (if (if tmp (apply (lambda (id val) (identifier? id)) tmp) #f)
3147 (apply (lambda (id val)
3148 (list '#(syntax-object define ((top)) (hygiene guile)) id val))
3152 "source expression failed to match any pattern"