--- /dev/null
+(declare (unit desugar) (uses core-forms))
+
+(define (desugar frm)
+ (if (not (pair? frm)) frm
+ (case (car frm)
+ [(def) (desugar-def frm)]
+ [(begin) (desugar-begin frm)]
+ [else (map desugar frm)])))
+
+(define (desugar-def frm)
+ (if (and (>= (length frm) 3) (pair? (cadr frm)))
+ (let* [(args* (cadr frm))
+ (name (car args*))
+ (args (cdr args*))]
+ (list 'def name
+ (append (list 'func args) (cddr frm))))
+ (map desugar frm)))
+
+(define (desugar-begin frm)
+ (define defs (map desugar (cdr frm)))
+ (if (not (list-of? defs definition?))
+ (list (append (list 'lambda '()) defs))
+ (cons 'begin defs)))
+
-(declare (uses library eval core-forms srfi-13 extras))
+(declare (uses library eval core-forms desugar srfi-13 extras))
(define (compile-file fname)
(define ofname (get-output-file-name fname))
(map core-form->scheme (read-forms (open-input-file fname))))
(define (read-forms port)
- (define form (read port))
+ (define form (desugar (read port)))
(if (eof-object? form)
'()
(let [(errs (core-syntax-errors form))]