lisp.lsp revision 5dfecf96
1;; 2;; Copyright (c) 2001 by The XFree86 Project, Inc. 3;; 4;; Permission is hereby granted, free of charge, to any person obtaining a 5;; copy of this software and associated documentation files (the "Software"), 6;; to deal in the Software without restriction, including without limitation 7;; the rights to use, copy, modify, merge, publish, distribute, sublicense, 8;; and/or sell copies of the Software, and to permit persons to whom the 9;; Software is furnished to do so, subject to the following conditions: 10;; 11;; The above copyright notice and this permission notice shall be included in 12;; all copies or substantial portions of the Software. 13;; 14;; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15;; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16;; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17;; THE XFREE86 PROJECT BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18;; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19;; OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20;; SOFTWARE. 21;; 22;; Except as contained in this notice, the name of the XFree86 Project shall 23;; not be used in advertising or otherwise to promote the sale, use or other 24;; dealings in this Software without prior written authorization from the 25;; XFree86 Project. 26;; 27;; Author: Paulo César Pereira de Andrade 28;; 29;; 30;; $XFree86: xc/programs/xedit/lisp/modules/lisp.lsp,v 1.9 2002/12/04 05:28:01 paulo Exp $ 31;; 32(provide "lisp") 33 34(in-package "LISP") 35 36(export '( 37 second third fourth fifth sixth seventh eighth ninth tenth 38 pathname merge-pathnames 39 logtest signum 40 alphanumericp copy-seq push pop prog prog* 41 with-open-file with-output-to-string 42)) 43 44(defun second (a) (nth 1 a)) 45(defun third (a) (nth 2 a)) 46(defun fourth (a) (nth 3 a)) 47(defun fifth (a) (nth 4 a)) 48(defun sixth (a) (nth 5 a)) 49(defun seventh (a) (nth 6 a)) 50(defun eighth (a) (nth 7 a)) 51(defun ninth (a) (nth 8 a)) 52(defun tenth (a) (nth 9 a)) 53 54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 55;; pathnames 56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 57(defun pathname (filename) 58 (values (parse-namestring filename))) 59 60(defun merge-pathnames (pathname &optional defaults default-version) 61 (if (null default-version) 62 (parse-namestring pathname nil defaults) 63 (parse-namestring pathname nil 64 (make-pathname :defaults defaults :version default-version)))) 65 66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 67;; math 68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 69(defun logtest (integer1 integer2) 70 (not (zerop (logand integer1 integer2)))) 71 72(defun signum (number) 73 (if (zerop number) number (/ number (abs number)))) 74 75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 76;; misc functions/macros 77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 78(defun alphanumericp (char) 79 (or (alpha-char-p char) (not (null (digit-char-p char))))) 80 81(defun copy-seq (sequence) 82 (subseq sequence 0)) 83 84(defmacro prog (init &rest body) 85 `(block nil (let ,init (tagbody ,@body)))) 86 87(defmacro prog* (init &rest body) 88 `(block nil (let* ,init (tagbody ,@body)))) 89 90(defmacro with-open-file (file &rest body) 91 `(let ((,(car file) (open ,@(cdr file)))) 92 (unwind-protect 93 (progn ,@body) 94 (if ,(car file) (close ,(car file)))))) 95 96(defmacro with-output-to-string (stream &rest body) 97 `(let ((,(car stream) (make-string-output-stream))) 98 (unwind-protect 99 (progn ,@body (get-output-stream-string ,(car stream))) 100 (and ,(car stream) (close ,(car stream)))))) 101 102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 103;; setf 104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 105(defsetf car (list) (value) `(progn (rplaca ,list ,value) ,value)) 106(defsetf cdr (list) (value) `(progn (rplacd ,list ,value) ,value)) 107 108(defsetf caar (list) (value) `(progn (rplaca (car ,list) ,value) ,value)) 109(defsetf cadr (list) (value) `(progn (rplaca (cdr ,list) ,value) ,value)) 110(defsetf cdar (list) (value) `(progn (rplacd (car ,list) ,value) ,value)) 111(defsetf cddr (list) (value) `(progn (rplacd (cdr ,list) ,value) ,value)) 112(defsetf caaar (list) (value) `(progn (rplaca (caar ,list) ,value) ,value)) 113(defsetf caadr (list) (value) `(progn (rplaca (cadr ,list) ,value) ,value)) 114(defsetf cadar (list) (value) `(progn (rplaca (cdar ,list) ,value) ,value)) 115(defsetf caddr (list) (value) `(progn (rplaca (cddr ,list) ,value) ,value)) 116(defsetf cdaar (list) (value) `(progn (rplacd (caar ,list) ,value) ,value)) 117(defsetf cdadr (list) (value) `(progn (rplacd (cadr ,list) ,value) ,value)) 118(defsetf cddar (list) (value) `(progn (rplacd (cdar ,list) ,value) ,value)) 119(defsetf cdddr (list) (value) `(progn (rplacd (cddr ,list) ,value) ,value)) 120(defsetf caaaar (list) (value) `(progn (rplaca (caaar ,list) ,value) ,value)) 121(defsetf caaadr (list) (value) `(progn (rplaca (caadr ,list) ,value) ,value)) 122(defsetf caadar (list) (value) `(progn (rplaca (cadar ,list) ,value) ,value)) 123(defsetf caaddr (list) (value) `(progn (rplaca (caddr ,list) ,value) ,value)) 124(defsetf cadaar (list) (value) `(progn (rplaca (cdaar ,list) ,value) ,value)) 125(defsetf cadadr (list) (value) `(progn (rplaca (cdadr ,list) ,value) ,value)) 126(defsetf caddar (list) (value) `(progn (rplaca (cddar ,list) ,value) ,value)) 127(defsetf cadddr (list) (value) `(progn (rplaca (cdddr ,list) ,value) ,value)) 128(defsetf cdaaar (list) (value) `(progn (rplacd (caaar ,list) ,value) ,value)) 129(defsetf cdaadr (list) (value) `(progn (rplacd (caadr ,list) ,value) ,value)) 130(defsetf cdadar (list) (value) `(progn (rplacd (cadar ,list) ,value) ,value)) 131(defsetf cdaddr (list) (value) `(progn (rplacd (caddr ,list) ,value) ,value)) 132(defsetf cddaar (list) (value) `(progn (rplacd (cdaar ,list) ,value) ,value)) 133(defsetf cddadr (list) (value) `(progn (rplacd (cdadr ,list) ,value) ,value)) 134(defsetf cdddar (list) (value) `(progn (rplacd (cddar ,list) ,value) ,value)) 135(defsetf cddddr (list) (value) `(progn (rplacd (cdddr ,list) ,value) ,value)) 136 137(defsetf first (list) (value) `(progn (rplaca ,list ,value) ,value)) 138(defsetf second (list) (value) `(progn (rplaca (nthcdr 1 ,list) ,value) ,value)) 139(defsetf third (list) (value) `(progn (rplaca (nthcdr 2 ,list) ,value) ,value)) 140(defsetf fourth (list) (value) `(progn (rplaca (nthcdr 3 ,list) ,value) ,value)) 141(defsetf fifth (list) (value) `(progn (rplaca (nthcdr 4 ,list) ,value) ,value)) 142(defsetf sixth (list) (value) `(progn (rplaca (nthcdr 5 ,list) ,value) ,value)) 143(defsetf seventh (list) (value) `(progn (rplaca (nthcdr 6 ,list) ,value) ,value)) 144(defsetf eighth (list) (value) `(progn (rplaca (nthcdr 7 ,list) ,value) ,value)) 145(defsetf ninth (list) (value) `(progn (rplaca (nthcdr 8 ,list) ,value) ,value)) 146(defsetf tenth (list) (value) `(progn (rplaca (nthcdr 9 ,list) ,value) ,value)) 147 148(defsetf rest (list) (value) `(progn (rplacd ,list ,value) ,value)) 149 150(defun lisp::nth-store (index list value) 151 (rplaca (nthcdr index list) value) value) 152(defsetf nth lisp::nth-store) 153 154(defsetf aref (array &rest indices) (value) 155 `(lisp::vector-store ,array ,@indices ,value)) 156 157(defsetf get (symbol key &optional default) (value) 158 `(lisp::put ,symbol ,key ,value)) 159 160(defsetf symbol-plist lisp::set-symbol-plist) 161 162(defsetf gethash (key hash-table &optional default) (value) 163 `(lisp::puthash ,key ,hash-table ,value)) 164 165(defsetf char lisp::char-store) 166(defsetf schar lisp::char-store) 167(defsetf elt lisp::elt-store) 168(defsetf svref lisp::elt-store) 169(defsetf documentation lisp::documentation-store) 170 171(defsetf symbol-value set) 172 173(defsetf subseq (sequence start &optional end) (value) 174 `(progn (replace ,sequence ,value :start1 ,start :end1 ,end) ,value)) 175