54 lines
1.7 KiB
Scheme
54 lines
1.7 KiB
Scheme
#lang scheme/base
|
|
|
|
(require scheme/list)
|
|
|
|
(provide read-module)
|
|
|
|
(define (read-module [port (current-input-port)])
|
|
`(lambda *argv*
|
|
,@(let iter ([forms (read-forms port)]
|
|
[bindings '()])
|
|
(cond
|
|
[(null? forms) (if (null? bindings)
|
|
'()
|
|
`(letrec ,bindings))]
|
|
[(simple-define-form? (first forms))
|
|
(iter (cdr forms) (cons (cdr (first forms))
|
|
bindings))]
|
|
[(lambda-define-form? (first forms))
|
|
(iter (cdr forms) (cons `(,(first (second (first forms)))
|
|
(lambda ,(cdr (second (first forms)))
|
|
,@(cddr (first forms))))
|
|
bindings))]
|
|
[(begin-form? (first forms))
|
|
(iter (append (cdr (first forms)) (cdr forms)) bindings)]
|
|
[(null? bindings)
|
|
(cons (first forms) (iter (cdr forms) '()))]
|
|
[else
|
|
`((letrec ,bindings ,@(iter forms '())))]))))
|
|
|
|
(define (read-forms [port (current-input-port)])
|
|
(reverse (let iter ([form (read port)]
|
|
[forms '()])
|
|
(if (eof-object? form)
|
|
forms
|
|
(iter (read port) (cons form forms))))))
|
|
|
|
(define (simple-define-form? form)
|
|
(and (pair? form)
|
|
(eq? (first form) 'define)
|
|
(symbol? (second form))
|
|
(null? (cdddr form))))
|
|
|
|
(define (lambda-define-form? form)
|
|
(and (pair? form)
|
|
(eq? (first form) 'define)
|
|
(pair? (second form))
|
|
(symbol? (first (second form)))))
|
|
|
|
(define (begin-form? form)
|
|
(and (pair? form)
|
|
(eq? (first form) 'begin)))
|
|
|
|
; vim:set sw=2 expandtab:
|