X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Futils.lisp;h=5cb702c6f385d79d8f045ecc1409f981b90ad943;hb=91fd1e39d4f509e13fcab3ce3a2dd5a17ddcdcc5;hp=73fc55126b99818530de9c1245b142cc36413b6c;hpb=8464d7110c70c0056a45b1076cc2f50971e0b5d7;p=jscl.git diff --git a/src/utils.lisp b/src/utils.lisp index 73fc551..5cb702c 100644 --- a/src/utils.lisp +++ b/src/utils.lisp @@ -16,30 +16,33 @@ ;; You should have received a copy of the GNU General Public License ;; along with JSCL. If not, see . -(defvar *newline* (string (code-char 10))) +(/debug "loading utils.lisp!") + +(defvar *newline* " +") (defmacro concatf (variable &body form) `(setq ,variable (concat ,variable (progn ,@form)))) ;;; This couple of helper functions will be defined in both Common -;;; Lisp and in Ecmalisp. +;;; Lisp and in JSCL (defun ensure-list (x) (if (listp x) x (list x))) -(defun !reduce (func list &key initial-value) - (if (null list) - initial-value - (!reduce func - (cdr list) - :initial-value (funcall func initial-value (car list))))) +(defun !reduce (func list initial-value) + (let ((result initial-value)) + (dolist (element list result) + (setq result (funcall func result element))))) ;;; Concatenate a list of strings, with a separator (defun join (list &optional (separator "")) - (!reduce (lambda (s o) (concat s separator o)) - (cdr list) - :initial-value (car list))) + (if (null list) + "" + (!reduce (lambda (s o) (concat s separator o)) + (cdr list) + (car list)))) (defun join-trailing (list &optional (separator "")) (if (null list) @@ -82,4 +85,11 @@ (defun float-to-string (x) #+jscl (float-to-string x) - #+common-lisp (format nil "~f" x)) + #-jscl (format nil "~f" x)) + +(defun satisfies-test-p (x y &key key (test #'eql) testp (test-not #'eql) test-not-p) + (when (and testp test-not-p) + (error "Both test and test-not are set")) + (let ((key-val (if key (funcall key y) y)) + (fn (if test-not-p (complement test-not) test))) + (funcall fn x key-val)))