962f003d33eb9f27c72b24ceb2eacc8548ce2924
[lineal.git] / src / globals.lisp
blob962f003d33eb9f27c72b24ceb2eacc8548ce2924
2 (defpackage :lineal.client-vars)
4 (defpackage :lineal
5 (:use :cl :lineal.overload)
6 (:export *saved-numbers*
7 *saved-tuples* *saved-matrices*
8 recall-vrbl store-vrbl
9 process-input-from-stream
10 process-input-from-string
11 process-infix-from-string
12 save-to-stream restore-from-stream))
14 (in-package :lineal)
16 (defparameter *saved-numbers* nil)
17 (defparameter *saved-tuples* nil)
18 (defparameter *saved-matrices* nil)
20 ;V Get a variable out of memory.V
21 (defun recall-vrbl
22 (k &optional (ksym (find-symbol k :lineal.client-vars)))
23 (macrolet
24 ((del-k-from
25 (lis)
26 `(setf ,lis (delete k ,lis :test #'string=))))
27 (when (and ksym (boundp ksym))
28 (typecase (symbol-value ksym)
29 (number (del-k-from *saved-numbers*))
30 (tuple (del-k-from *saved-tuples*))
31 (mtrix (del-k-from *saved-matrices*)))
32 (makunbound ksym))))
34 (defun over-recall (&rest args)
35 (mapc #'recall-vrbl args)
36 (format nil "Recalled: ~{~A~#[~:;, ~]~}" args))
38 (defun store-vrbl
39 (k v &optional (ksym (intern k :lineal.client-vars)))
40 (macrolet
41 ((add-k-to
42 (lis)
43 `(setf ,lis (merge 'list ,lis (list k)
44 #'string<))))
45 ;V If something's already stored V
46 ;V under the name, recall it. V
47 (when (boundp ksym)
48 (recall-vrbl k ksym))
49 (typecase v
50 (number (add-k-to *saved-numbers*))
51 (tuple (add-k-to *saved-tuples*))
52 (mtrix (add-k-to *saved-matrices*))))
53 (set ksym v))
55 (defun over-store (k v)
56 (if (stringp k)
57 (store-vrbl k v)
58 (throw
59 'wtfvar
60 "Store usage: (store \"[name]\" [value])
61 where [name] is what you want the variable to be called
62 and [value] is its desired value.")))