3 ;; Copyright (C) 2012, 2013 David Vazquez
4 ;; Copyright (C) 2012 Raimon Grau
6 ;; This program is free software: you can redistribute it and/or
7 ;; modify it under the terms of the GNU General Public License as
8 ;; published by the Free Software Foundation, either version 3 of the
9 ;; License, or (at your option) any later version.
11 ;; This program is distributed in the hope that it will be useful, but
12 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 ;; General Public License for more details.
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with this program. If not, see <http://www.gnu.org/licenses/>.
19 (defvar *newline* (string (code-char 10)))
21 (defmacro concatf (variable &body form)
22 `(setq ,variable (concat ,variable (progn ,@form))))
24 ;;; This couple of helper functions will be defined in both Common
25 ;;; Lisp and in Ecmalisp.
26 (defun ensure-list (x)
31 (defun !reduce (func list &key initial-value)
36 :initial-value (funcall func initial-value (car list)))))
38 ;;; Concatenate a list of strings, with a separator
39 (defun join (list &optional (separator ""))
48 (join (cdr list) separator)))))
50 (defun join-trailing (list &optional (separator ""))
53 (concat (car list) separator (join-trailing (cdr list) separator))))
55 (defun mapconcat (func list)
56 (join (mapcar func list)))
58 (defun vector-to-list (vector)
60 (size (length vector)))
61 (dotimes (i size (reverse list))
62 (push (aref vector i) list))))
64 (defun list-to-vector (list)
65 (let ((v (make-array (length list)))
71 (defmacro awhen (condition &body body)
72 `(let ((it ,condition))
75 (defun integer-to-string (x)
80 (concat "-" (integer-to-string (- 0 x))))
83 (while (not (zerop x))
84 (push (mod x 10) digits)
85 (setq x (truncate x 10)))
86 (mapconcat (lambda (x) (string (digit-char x)))
89 (defun float-to-string (x)
90 #+jscl (float-to-string x)
91 #+common-lisp (format nil "~f" x))