(import (scheme base) (only (scheme read) read) (only (csc compiler) *library-search-dirs* compile) (only (csc flag) *args* bool-flag define-flag parse-error-flag parse-error-msg parse-error? parse-flags) (only (csc format) printf) (only (csc loop) loop) (only (csc match) match)) (define-flag *include* "include" (lambda (s) (cons s *include*)) '()) (define-flag *output* "output" string-copy "") (define-flag *help* "help" bool-flag #f) (define *help-msg* "Usage: csc [OPTION]... [FILE] --include DIRECTORY Search in the given directory for libraries. This flag can be passed more than once. --output FILE Write output to the given file. The default is to immediately execute. ") (define (read-file f) (call-with-input-file f (lambda (p) (loop for expr = (read p) until (eof-object? expr) collect expr)))) (define (write-file f bytes) (call-with-port (open-binary-output-file f) (lambda (p) (write-bytevector bytes p)))) (define (main) (guard (e ((parse-error? e) (printf "Error: could not parse flag {}: {}\n{}" (parse-error-flag e) (parse-error-msg e) *help-msg*) (exit 2))) (parse-flags)) (when *help* (printf "{}" *help-msg*) (exit 0)) (when (string=? "" *output*) (printf "For now, the option --output is required. In the future, we will be able to execute code directly.\n") (exit 2)) (define input-file (match *args* ((file) file) (_ (printf "Error: must pass exactly one file to csc.\n{}" *help-msg*) (exit 2)))) (set! *library-search-dirs* *include*) (write-file *output* (compile (read-file input-file))))