X-Git-Url: http://git.kpe.io/?a=blobdiff_plain;f=parse-rrf.lisp;h=9a1c4fe78a3df32d67ed917e05578b7a825cfb5a;hb=fee295eedafd4f070b8290d2861d6b2cae06fccb;hp=8a1bb1ebd47f116fcd5cdc7710a50d9634cdf83e;hpb=88be55a3921b3078570bb737da197c671117a719;p=umlisp.git diff --git a/parse-rrf.lisp b/parse-rrf.lisp index 8a1bb1e..9a1c4fe 100644 --- a/parse-rrf.lisp +++ b/parse-rrf.lisp @@ -187,13 +187,25 @@ 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") -(declaim (inline vff)) -(defun vff (filename fieldname record) - (let ((pos (position-field-file filename fieldname))) - (unless pos - (error "Did not find fieldname ~A in filename ~A." fieldname filename)) - (locally (declare (fixnum pos)) - (nth pos record)))) +(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)))) + `(locally (declare (optimize (speed 3) (safety 0))) + (multiple-value-bind (,pos ,found) (gethash ,key *vff-position-hash*) + (declare (ignore ,found)) + (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"