229 lines
6.3 KiB
Common Lisp
229 lines
6.3 KiB
Common Lisp
(defvar *cmds* nil)
|
|
(defvar *picn* 0)
|
|
|
|
(defun every (tst lst)
|
|
"(every tst lst)
|
|
Returns t if tst is true for every item in lst, or nil on the first false item."
|
|
(if (null lst) t
|
|
(and (funcall tst (car lst)) (every tst (cdr lst)))))
|
|
|
|
(defun load (filename)
|
|
"(load filename)
|
|
Open the Lisp file on the SD card and load the contents into the workspace."
|
|
(with-sd-card (str filename)
|
|
(let ((forms nil))
|
|
(loop
|
|
(let ((form (read str)))
|
|
(unless form (return))
|
|
(setf forms (cons (cadr form) forms))
|
|
(eval form)))
|
|
(reverse forms))))
|
|
|
|
(defun load-package (filename )
|
|
(let* ((filename (concatenate 'string filename ".pkg"))
|
|
(forms (load filename)))
|
|
forms))
|
|
|
|
(defun save-package (filename lst)
|
|
(with-sd-card (str filename 2)
|
|
(dolist (f lst)
|
|
(symbol-def f str))))
|
|
|
|
(defun add-to-package (filename list)
|
|
(with-sd-card (str filename 1)
|
|
(dolist (f lst)
|
|
(symbol-def f str))))
|
|
|
|
(defun rgb (r g b)
|
|
"(rgb r g b)
|
|
Define a colour from its RGB components."
|
|
(logior (ash (logand r #xf8) 8) (ash (logand g #xfc) 3) (ash b -3)))
|
|
|
|
(defun hsv (h s v)
|
|
"(hsv h s v)
|
|
Specify colours in the alternative HSV colour system."
|
|
(let* ((chroma (* v s))
|
|
(x (* chroma (- 1 (abs (- (mod (/ h 60) 2) 1)))))
|
|
(m (- v chroma))
|
|
(i (truncate h 60))
|
|
(params (list chroma x 0 0 x chroma))
|
|
(r (+ m (nth i params)))
|
|
(g (+ m (nth (mod (+ i 4) 6) params)))
|
|
(b (+ m (nth (mod (+ i 2) 6) params))))
|
|
(rgb (round (* r 255)) (round (* g 255)) (round (* b 255)))))
|
|
|
|
(defun col (n)
|
|
"(col n)
|
|
Defines a different colour for each value of n from 0 to 7."
|
|
(rgb (* (logand n 1) 160) (* (logand n 2) 80) (* (logand n 4) 40)))
|
|
|
|
(defun butlast (lst)
|
|
"(butlast lst)
|
|
Returns all but the last item in lst."
|
|
(unless (null lst) (subseq lst 0 (1- (length lst)))))
|
|
|
|
(defun count (x lst)
|
|
"(count x lst)
|
|
Counts the number of items eq to x in lst."
|
|
(if (null lst) 0
|
|
(+ (if (eq x (car lst)) 1 0) (count x (cdr lst)))))
|
|
|
|
(defun count-if (tst lst)
|
|
"(count-if tst lst)
|
|
Counts the number of items in lst for which tst is true."
|
|
(if (null lst) 0
|
|
(+ (if (funcall tst (car lst)) 1 0) (count-if tst (cdr lst)))))
|
|
|
|
(defun count-if-not (tst lst)
|
|
"(count-if-not tst lst)
|
|
Counts the number of items in lst for which tst is false."
|
|
(if (null lst) 0
|
|
(+ (if (funcall tst (car lst)) 0 1) (count-if-not tst (cdr lst)))))
|
|
|
|
(defun find (x lst)
|
|
"(find x lst)
|
|
Returns x if x is in lst, or nil otherwise."
|
|
(car (member x lst)))
|
|
|
|
(defun find-if (tst lst)
|
|
"(find-if tst lst)
|
|
Returns the first item in lst for which tst is true, or nil otherwise."
|
|
(cond
|
|
((null lst) nil)
|
|
((funcall tst (car lst)) (car lst))
|
|
(t (find-if tst (cdr lst)))))
|
|
|
|
(defun find-if-not (tst lst)
|
|
"(find-if-not tst lst)
|
|
Returns the first item in lst for which tst is false, or nil otherwise."
|
|
(cond
|
|
((null lst) nil)
|
|
((not (funcall tst (car lst))) (car lst))
|
|
(t (find-if-not tst (cdr lst)))))
|
|
|
|
(defun identity (x)
|
|
"(identity x)
|
|
Returns its argument."
|
|
x)
|
|
|
|
(defun last (lst)
|
|
"(last lst)
|
|
Returns the last cdr of lst."
|
|
(unless (null lst) (subseq lst (1- (length lst)))))
|
|
|
|
(defun mapl (fn lst)
|
|
"(mapl fn lst)
|
|
Applies fn to successive cdrs of lst, and returns lst."
|
|
(mapl2 fn lst)
|
|
lst)
|
|
|
|
(defun mapl2 (fn lst)
|
|
(cond
|
|
((null lst) nil)
|
|
(t (funcall fn lst)
|
|
(mapl2 fn (cdr lst)))))
|
|
|
|
(defun maplist (fn lst)
|
|
"(maplist fn lst)
|
|
Applies fn to successive cdrs of lst, and returns a list of the results."
|
|
(if (null lst) nil
|
|
(cons (funcall fn lst) (maplist fn (cdr lst)))))
|
|
|
|
(defun nconc (&rest lst)
|
|
"(nconc lst*)
|
|
Destructively appends its arguments together, which must be lists."
|
|
(mapcan #'(lambda (x) x) lst))
|
|
|
|
(defun nthcdr (n lst)
|
|
"(nthcdr n lst)
|
|
Returns the nth cdr of lst."
|
|
(if (zerop n) lst
|
|
(nthcdr (1- n) (cdr lst))))
|
|
|
|
(defun position (x lst &optional (n 0))
|
|
"(position x lst)
|
|
Returns the position of the first x in lst, or nil if it's not found."
|
|
(cond
|
|
((null lst) nil)
|
|
((eq x (car lst)) n)
|
|
(t (position x (cdr lst) (1+ n)))))
|
|
|
|
(defun position-if (tst lst &optional (n 0))
|
|
"(position-if tst lst)
|
|
Returns the position of the first item in lst for which tst is true,
|
|
or nil if none is found."
|
|
(cond
|
|
((null lst) nil)
|
|
((funcall tst (car lst)) n)
|
|
(t (position-if tst (cdr lst) (1+ n)))))
|
|
|
|
(defun position-if-not (tst lst &optional (n 0))
|
|
"(position-if-not tst lst)
|
|
Returns the position of the first item in lst for which tst is false,
|
|
or nil if none is found."
|
|
(cond
|
|
((null lst) nil)
|
|
((not (funcall tst (car lst))) n)
|
|
(t (position-if-not tst (cdr lst) (1+ n)))))
|
|
|
|
(defun reduce (fn lst)
|
|
"(reduce fn lst)
|
|
Returns the result of applying fn to successive pairs of items from lst."
|
|
(if (null (cdr lst)) (car lst)
|
|
(funcall fn (car lst) (reduce fn (cdr lst)))))
|
|
|
|
(defun remove (x lst)
|
|
"(remove x lst)
|
|
Returns a list with all occurrences of x removed from lst."
|
|
(mapcan #'(lambda (y) (unless (eq x y) (list y))) lst))
|
|
|
|
(defun remove-if (tst lst)
|
|
"(remove-if tst lst)
|
|
Returns a list with all items for which tst is true removed from lst."
|
|
(mapcan #'(lambda (x) (unless (funcall tst x) (list x))) lst))
|
|
|
|
(defun remove-if-not (tst lst)
|
|
"(remove-if-not tst lst)
|
|
Returns a list with all items for which tst is false removed from lst."
|
|
(mapcan #'(lambda (x) (when (funcall tst x) (list x))) lst))
|
|
|
|
|
|
(defun append-to-list (itm lst)
|
|
"(append-to-list itm lst)
|
|
Appends item to list destructively; lst will be altered with
|
|
itm appended to the end of the list."
|
|
(if lst (nconc lst (list itm))
|
|
(setf lst (list itm))))
|
|
|
|
(defun user-symbols ()
|
|
"(user-symbols)
|
|
Returns a list of all the symbols add by a user after boot."
|
|
(let ((library (list-library2)))
|
|
(remove-if (lambda (sym) (member sym library)) (globals))))
|
|
|
|
(defun reset-user-environment ()
|
|
"(reset-user-environment)
|
|
Removes all user-defined symbols."
|
|
(mapcar 'makunbound (user-symbols)))
|
|
|
|
(defun keyword-string (k)
|
|
"(keyword-string k)
|
|
Returns the keyword as a string, or nil if the arg isn't a keyword."
|
|
(when (keywordp k)
|
|
(subseq (string k) 1)))
|
|
|
|
(defun load-platform ()
|
|
"(load-platform)
|
|
Load-platform specific code if present, found on the SD card as
|
|
platform.lsp (e.g. picocalc.lsp)."
|
|
(let ((platform-file (concatenate 'string (keyword-string (platform)) ".lsp")))
|
|
(when (sd-exists-p platform-file)
|
|
(load platform-file))))
|
|
|
|
(load-platform)
|
|
|
|
(defvar *pkg* nil)
|
|
|
|
(defun lp ()
|
|
(setf *pkg* (load "pkg.lsp")))
|