rosella/libcompiler/reader.scm

31 lines
903 B
Scheme

#lang scheme/base
(require scheme/list)
(require scheme/match)
(require scheme/path)
(require scheme/pretty)
(provide read-module)
(define (read-module [port (current-input-port)])
`(lambda *argv*
,@(read-forms port)))
(define (read-forms [port (current-input-port)])
(let iter ([form (read port)]
[forms '()])
(match form
[(? eof-object?)
(reverse forms)]
[`(load ,(? string? pathname))
(let ([loaded-forms (with-input-from-file pathname
(lambda ()
(parameterize ([current-directory (or (path-only pathname) ".")])
(read-forms))))])
(iter (read port) (cons `(begin ,@loaded-forms) forms)))]
[`(load . ,_)
(error "Unrecognized load-form:" (first forms))]
[_ (iter (read port) (cons form forms))])))
; vim:set sw=2 expandtab: