r11481: make vff macro more efficient
authorKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 8 Jan 2007 13:19:15 +0000 (13:19 +0000)
committerKevin M. Rosenberg <kevin@rosenberg.net>
Mon, 8 Jan 2007 13:19:15 +0000 (13:19 +0000)
parse-common.lisp
parse-rrf.lisp

index f712e7627dd632b3ad651cc69d29f1303043764e..4c2855e282b6fa877e5789d399ccaeda3bbd9d09 100644 (file)
@@ -230,14 +230,8 @@ Currently, these are the LEX and NET files."
   "Returns umls-file structure for a filename"
   (find-if #'(lambda (f) (string= filename (fil f))) *umls-files*))
 
-(defvar *position-hash* (make-hash-table :test 'eq))
-
-(defun position-field-file (filename fieldname key)
+(defun position-field-file (filename fieldname)
   "Returns the position of a field in a file"
-  (multiple-value-bind (pos found) (gethash key *position-hash*)
-    (if found
-        (return-from position-field-file pos)))
-
   (let ((ufile (find-ufile filename)))
     (unless ufile
       (warn "Unable to find ufile for filename ~A." filename)
@@ -246,7 +240,6 @@ Currently, these are the LEX and NET files."
       (unless pos
         (warn "Unable to find field ~A in ufile ~S." fieldname ufile)
         (return-from position-field-file nil))
-      (setf (gethash key *position-hash*) pos)
       pos)))
 
 (defun find-ucols-for-ufile (ufile)
index e8e919de245a0e34da419ac546bf35b7072cfc9c..90a11fcc5a63e3e34843b68bd7ce6fd79f532993 100644 (file)
@@ -187,14 +187,24 @@ used in the United States. We create a new scale (SRLUS) where SRL to SRLUS mapp
   '(("KCON" "SELECT CUI,STR FROM MRCONSO WHERE STT='PF' AND TS='P' AND ISPREF='Y' AND LAT='ENG'"))
   "Custom tables to create")
 
+(defvar *vff-position-hash* (make-hash-table :size 100 :test 'eq))
+
+
 (defmacro vff (filename fieldname record)
   (let ((pos (gensym "POS-"))
+        (found (gensym "FOUND-"))
         (key (kmrcl:ensure-keyword (concatenate 'string filename "^" fieldname))))
-    `(let ((,pos (position-field-file ,filename ,fieldname ,key)))
-      (unless ,pos
-        (error "Did not find fieldname ~A in filename ~A." ,fieldname ,filename))
-      (locally (declare (type (integer 0 100000) ,pos))
-        (nth ,pos ,record)))))
+    `(locally (declare (optimize (speed 3) (size 0) (safety 0)))
+      (multiple-value-bind (,pos ,found) (gethash ,key *vff-position-hash*)
+        (if ,pos
+            (locally (declare (type (integer 0 100000) ,pos))
+              (nth ,pos ,record))
+            (let ((,pos (position-field-file ,filename ,fieldname)))
+              (unless ,pos
+                (error "Did not find fieldname ~A in filename ~A." ,fieldname ,filename))
+              (locally (declare (type (integer 0 100000) ,pos))
+                (setf (gethash ,key *vff-position-hash*) ,pos)
+                (nth ,pos ,record))))))))
 
 (defparameter +custom-cols+
     '(#+nil ("MRCONSO.RRF" "KPFSTR" "TEXT"