]> git.jsancho.org Git - gacela.git/commitdiff
(no commit message)
authorjsancho <devnull@localhost>
Wed, 11 Nov 2009 11:27:42 +0000 (11:27 +0000)
committerjsancho <devnull@localhost>
Wed, 11 Nov 2009 11:27:42 +0000 (11:27 +0000)
gacela_misc.lisp

index 9a017877b2391a30bd2fae934f760d8dea22c35a..7010b0965f32bc23941e53181b89fa51d1d58c8a 100755 (executable)
@@ -14,8 +14,6 @@
 ;;; You should have received a copy of the GNU General Public License
 ;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-(in-package :gacela)
-
 (defconstant INFINITY MOST-POSITIVE-LONG-FLOAT)
 
 (defun append-if (new test tree &key (key #'first) (test-if #'equal))
         (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)
   (match-pattern dot '(0 0)))