1
#| -*- Mode: Scheme; keyword-style: none -*-
3
3
Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994,
4
4
1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
5
2006, 2007, 2008, 2009, 2010 Massachusetts Institute of Technology
5
2006, 2007, 2008, 2009, 2010, 2011 Massachusetts Institute of
7
8
This file is part of MIT/GNU Scheme.
84
85
(define supported-srfi-features
90
SRFI-6 ;Basic String Ports
92
SRFI-9 ;DEFINE-RECORD-TYPE
94
SRFI-27 ;Sources of Random Bits
95
SRFI-30 ;Nested Multi-Line Comments (#| ... |#)
96
SRFI-62 ;S-expression comments
97
SRFI-69 ;Basic Hash Tables
88
SWANK ;Provides SWANK module for SLIME
92
SRFI-6 ;Basic String Ports
94
SRFI-9 ;DEFINE-RECORD-TYPE
96
SRFI-27 ;Sources of Random Bits
97
SRFI-30 ;Nested Multi-Line Comments (#| ... |#)
98
SRFI-62 ;S-expression comments
99
SRFI-69 ;Basic Hash Tables
100
102
(define-syntax :receive
102
104
(lambda (form rename compare)
104
106
(if (syntax-match? '(R4RS-BVL FORM + FORM) (cdr form))
105
`(,(rename 'CALL-WITH-VALUES)
106
(,(rename 'LAMBDA) () ,(caddr form))
107
(,(rename 'LAMBDA) ,(cadr form) ,@(cdddr form)))
107
(let ((r-lambda (rename 'LAMBDA)))
108
`(,(rename 'CALL-WITH-VALUES)
109
(,r-lambda () ,(caddr form))
110
(,r-lambda ,(cadr form) ,@(cdddr form))))
108
111
(ill-formed-syntax form)))))
110
113
(define-syntax :define-record-type
170
175
(let ((name (cadr form))
171
176
(bindings (caddr form))
172
177
(body (cdddr form)))
174
((,name (,(rename 'NAMED-LAMBDA) (,name ,@(map car bindings))
177
,@(map (lambda (binding)
178
(if (pair? (cdr binding))
180
(unassigned-expression)))
178
(case named-let-strategy
181
((,name (,(rename 'NAMED-LAMBDA) (,name ,@(map car bindings))
184
,@(map (lambda (binding)
185
(if (pair? (cdr binding))
187
(unassigned-expression)))
190
(let ((iter (make-synthetic-identifier 'ITER))
191
(kernel (make-synthetic-identifier 'KERNEL))
192
(temps (map (lambda (b)
194
(make-synthetic-identifier 'TEMP)) bindings))
195
(r-lambda (rename 'LAMBDA))
196
(r-declare (rename 'DECLARE)))
197
`((,r-lambda (,kernel)
198
(,kernel ,kernel ,@(map (lambda (binding)
199
(if (pair? (cdr binding))
201
(unassigned-expression)))
203
(,r-lambda (,iter ,@(map car bindings))
205
(,r-declare (INTEGRATE-OPERATOR ,name))
208
(,r-declare (INTEGRATE ,@temps))
209
(,iter ,iter ,@temps)))))))
210
(else (error "Unrecognized named-let-strategy: " named-let-strategy)))))
182
211
((syntax-match? '((* (IDENTIFIER ? EXPRESSION)) + FORM) (cdr form))
183
212
`(,keyword:let ,@(cdr (normalize-let-bindings form))))
195
224
(define-syntax :let*
196
225
(er-macro-transformer
197
226
(lambda (form rename compare)
198
rename compare ;ignore
199
228
(expand/let* form (rename 'LET)))))
201
230
(define-syntax :let*-syntax
202
231
(er-macro-transformer
203
232
(lambda (form rename compare)
204
rename compare ;ignore
205
234
(expand/let* form (rename 'LET-SYNTAX)))))
207
236
(define (expand/let* form let-keyword)
527
556
(lambda (form rename compare)
529
558
(syntax-check '(KEYWORD (* (FORM ? EXPRESSION)) + FORM) form)
530
(let ((names (map car (cadr form)))
559
(let ((left-hand-sides (map car (cadr form)))
560
(right-hand-sides (map cdr (cadr form)))
561
(r-define (rename 'DEFINE))
562
(r-lambda (rename 'LAMBDA))
531
563
(r-let (rename 'LET))
532
(r-lambda (rename 'LAMBDA))
533
(r-set! (rename 'SET!)))
537
(make-synthetic-identifier 'OUT-TEMP))
542
(make-synthetic-identifier 'IN-TEMP))
545
(lambda (tos names froms)
547
,@(map (lambda (to name from)
554
,(unspecific-expression)))))
555
`(,r-let (,@(map cons in-temps (map cdr (cadr form)))
556
,@(map list out-temps))
557
(,(rename 'SHALLOW-FLUID-BIND)
558
,(swap out-temps names in-temps)
559
(,r-lambda () ,@(cddr form))
560
,(swap in-temps names out-temps))))))))
564
(r-set! (rename 'SET!))
565
(r-shallow-fluid-bind (rename 'SHALLOW-FLUID-BIND))
566
(r-unspecific (rename 'UNSPECIFIC)))
569
(make-synthetic-identifier
570
(if (identifier? lhs) lhs 'TEMPORARY)))
572
(swap! (make-synthetic-identifier 'SWAP!))
573
(body `(,r-lambda () ,@(cddr form))))
574
`(,r-let ,(map cons temporaries right-hand-sides)
576
,@(map (lambda (lhs temporary)
577
`(,r-set! ,lhs (,r-set! ,temporary (,r-set! ,lhs))))
581
(,r-shallow-fluid-bind ,swap! ,body ,swap!)))))))
562
583
(define (unspecific-expression)
563
584
`(,keyword:unspecific))
565
586
(define (unassigned-expression)
566
`(,keyword:unassigned))
b'\\ No newline at end of file'
587
`(,keyword:unassigned))
589
(define-syntax :begin0
591
((BEGIN0 form0 form1+ ...)
592
(LET ((RESULT form0))
b'\\ No newline at end of file'