picrin/contrib/30.main/main.scm

56 lines
1.5 KiB
Scheme

(define-library (picrin main)
(import (scheme base)
(scheme read)
(scheme write)
(scheme process-context)
(scheme load)
(scheme eval)
(picrin repl))
(define (print-help)
(display "picrin scheme\n")
(display "\n")
(display "Usage: picrin [options] [file]\n")
(display "\n")
(display "Options:\n")
(display " -e [program] run one liner script\n")
(display " -l [file] load the file then enter repl\n")
(display " -h or --help show this help\n"))
(define (getopt)
(let ((args (cdr (command-line))))
(if (null? args)
(values 'repl #f)
(case (string->symbol (car args))
((-h --help)
(print-help)
(exit 1))
((-e)
(values 'line (cadr args)))
((-l)
(values 'load (cadr args)))
(else
(values 'file (car args)))))))
(define (exec-file filename)
(load filename))
(define (exec-line str)
(call-with-port (open-input-string str)
(lambda (in)
(let loop ((expr (read in)))
(unless (eof-object? expr)
(eval expr '(picrin user))
(loop (read in)))))))
(define (main)
(call-with-values getopt
(lambda (type dat)
(case type
((repl) (repl))
((load) (load dat) (repl))
((line) (exec-line dat))
((file) (exec-file dat))))))
(export main))