+Most files' packages determined in src/devvars
[lineal.git] / src / prefix-parser.lisp
blob7a791ee3f37f56de8f2c655dd1a37df295570c45
2 (defun fail (arg)
3 (format nil "What is this \"~A\" of which you speak?~%" arg))
5 (defgeneric expr-parse (expr))
7 (defmethod expr-parse ((expr list))
8 (unless (boundp (car expr))
9 (throw 'wtfvar (fail (symbol-name (car expr)))))
10 (loop
11 :for x :in (cdr expr)
12 :collect (expr-parse x) :into to-eval
13 :finally (return (cons (symbol-value (car expr))
14 to-eval))))
16 (defmethod expr-parse ((expr symbol))
17 (if (boundp expr) (symbol-value expr)
18 (throw 'wtfvar (fail (symbol-name expr)))))
20 (defmethod expr-parse ((expr number)) expr)
21 (defmethod expr-parse ((expr string)) expr)
23 (defun eval-parsed (s-exprs)
24 (handler-case
25 (catch 'over-ex (eval s-exprs))
26 (error (conditn)
27 (declare (ignore conditn))
28 (format nil "Something went wrong during eval, ~
29 you probably used a function with bad parameters."))))
31 (defun process-prefix-from-stream (strm)
32 (let ((*readtable* (copy-readtable)))
33 (setf (readtable-case *readtable*) :preserve)
34 (handler-case
35 (catch
36 'wtfvar
37 (do (expr result)
38 (nil)
39 (let ((*package*
40 (find-package :lineal.client-vars)))
41 (setq expr (read strm nil nil)))
42 (unless expr (return result))
43 (setq result (eval-parsed (expr-parse expr)))))
44 (error (conditn)
45 (declare (ignore conditn))
46 "You probably forgot to add a closing parenthesis."))))