X-Git-Url: http://git.kpe.io/?p=kmrcl.git;a=blobdiff_plain;f=functions.lisp;h=e9b30741de3378117d0c0e3507881d290fd48321;hp=d470866e22406eeb84f75a09bf3d36eb7f4efc87;hb=54cd6cb1b9550ac2310e2c6dffc9cdecd2bdccd3;hpb=a5e8d90b159f1a8dcef4e954a97cae6eb5396423 diff --git a/functions.lisp b/functions.lisp index d470866..e9b3074 100644 --- a/functions.lisp +++ b/functions.lisp @@ -7,8 +7,6 @@ ;;;; Programmer: Kevin M. Rosenberg ;;;; Date Started: Apr 2000 ;;;; -;;;; $Id: functions.lisp,v 1.3 2003/05/16 13:05:28 kevin Exp $ -;;;; ;;;; This file, part of KMRCL, is Copyright (c) 2002 by Kevin M. Rosenberg ;;;; ;;;; KMRCL users are granted the rights to distribute and use this software @@ -18,24 +16,24 @@ (in-package :kmrcl) -(defun memo-proc (fn &optional (test #'equal)) +(defun memo-proc (fn) "Memoize results of call to fn, returns a closure with hash-table" - (let ((cache (make-hash-table :test test))) + (let ((cache (make-hash-table :test #'equal))) #'(lambda (&rest args) (multiple-value-bind (val foundp) (gethash args cache) (if foundp val - (setf (gethash args cache) (apply fn args))))))) + (setf (gethash args cache) (apply fn args))))))) -(defun memoize (fn-name &optional (test #'equal)) - (setf (fdefinition fn-name) (memo-proc (fdefinition fn-name) test))) +(defun memoize (fn-name) + (setf (fdefinition fn-name) (memo-proc (fdefinition fn-name)))) (defmacro defun-memo (fn args &body body) "Define a memoized function" `(memoize (defun ,fn ,args . ,body))) (defmacro _f (op place &rest args) - (multiple-value-bind (vars forms var set access) + (multiple-value-bind (vars forms var set access) (get-setf-expansion place) `(let* (,@(mapcar #'list vars forms) (,(car var) (,op ,access ,@args))) @@ -46,7 +44,7 @@ (let ((fn1 (car (last fns))) (fns (butlast fns))) #'(lambda (&rest args) - (reduce #'funcall fns + (reduce #'funcall fns :from-end t :initial-value (apply fn1 args)))) #'identity))