#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: