rosella/libcompiler/reader.scm

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-declare-form? (first forms))
(iter (cdr forms) (cons (cdr (first forms))
bindings))]
[(lambda-declare-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-declare-form? form)
(and (pair? form)
(eq? (first form) 'declare)
(symbol? (second form))
(null? (cdddr form))))
(define (lambda-declare-form? form)
(and (pair? form)
(eq? (first form) 'declare)
(pair? (second form))
(symbol? (first (second form)))))
(define (begin-form? form)
(and (pair? form)
(eq? (first form) 'begin)))
; vim:set sw=2 expandtab: