]> git.jsancho.org Git - gacela.git/blobdiff - gacela_misc.lisp
(no commit message)
[gacela.git] / gacela_misc.lisp
index ac7b479db805ded3532e7725e0cc4bd87168a74e..e19f3a2fe5e4aa0213ee8fd9e7710ff312109244 100755 (executable)
 ;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 
-(in-package :gacela)
+(eval-when (compile load eval)
+          (when (not (find-package 'gacela)) (make-package 'gacela :nicknames '(gg) :use '(lisp)))
+          (in-package 'gacela :nicknames '(gg) :use '(lisp)))
+
 
 (defconstant INFINITY MOST-POSITIVE-LONG-FLOAT)
 
                        (t (power (* p 2) n)))))
          (power 1 n)))
 
-(defmacro mapcconst (type c-type name)
-  `(progn
-     (defcfun ,(concatenate 'string c-type " gacela_" name " (void)") 0
-       ,(concatenate 'string "return " name ";"))
-     (defentry ,(intern (string-upcase name)) ()
-       (,type ,(concatenate 'string "gacela_" name)))))
-
+(defmacro secure-block (output-stream &rest forms)
+  (let ((error-handler #'si::universal-error-handler))
+    `(block secure
+       (defun si::universal-error-handler (error-name correctable function-name continue-format-string error-format-string &rest args)
+        ,(when output-stream
+           `(write-line
+             (cond ((eq error-name :WRONG-TYPE-ARGUMENT) (string error-name))
+                   (t error-format-string))
+             ,output-stream))
+        (setf (symbol-function 'si::universal-error-handler) ,error-handler)
+        (return-from secure))
+       (let (result-eval)
+        (setq result-eval (progn ,@forms))
+        (setf (symbol-function 'si::universal-error-handler) ,error-handler)
+        result-eval))))
+
+(defmacro persistent-let (name vars &rest forms)
+  (labels ((get-vars (vars)
+                    (cond ((null vars) nil)
+                          (t (cons (if (consp (car vars)) (caar vars) (car vars))
+                                   (get-vars (cdr vars)))))))
+   
+         `(let ,(cond ((functionp name)
+                       (let ((old-vars (funcall name)))
+                         (cond ((equal (get-vars vars) (get-vars old-vars)) old-vars)
+                               (t vars))))
+                      (t vars))
+            (defun ,name ()
+              ,(let ((lvars (get-vars vars)))
+                 `(mapcar (lambda (x y) (list x y)) ',lvars ,(cons 'list lvars))))
+            ,@forms)))
 
 ;Geometry
 (defun dotp (dot)