After learn Stefan's function , rewrite my old codes .
(defun ss:lookup (n l / b c r)
;; learn from Stefan's function , rewrite my old function
;|(setq l (vl-sort l (function (lambda (a b) (< (car a) (car b))))));_here must be added , we don't know a dimension of the Nd-list is descending . |;
(if (and (numberp (car n))
(vl-consp l)
(cadar l)
(<= (caar l) (car n) (car (last l)))
(setq l (mapcar (function (lambda (i)
(nth i l))) (f2 (car n) (mapcar (function car) l))))
;_ if loops goon one by one , when the given list is superlarge will take long time to get the suit items .
;_because the given list is sort by first item of every terms , so here can use Dichotomy to reduce computation .
)
(progn
(setq b (car l)
c (cadr l))
(if (<= (car b) (car n) (car c))
(cond
((not (cadr b));_1st term is no 2nd item , quit routine
nil)
((= (car n) (car b));_1st term's 1st item = para
(if (numberp (cadr b))
(setq r (cadr b));_2nd item is number
(setq r (f (cdr n) (cdr b)));_inter next recursion
)
)
((and (cadr c) (= (car n) (car c)));_2nd term's 1st item = para
(if (numberp (cadr c))
(setq r (cadr c));_2nd item is number
(setq r (f (cdr n) (cdr c)));_inter next recursion
))
((and (cadr b) (cadr c) (< (car b) (car n) (car c)));_para between 1st_term's 1st item and 2nd_term's 1st item
(if (and (numberp (cadr b)) (numberp (cadr c)));_2nd item is number
(setq
r (f1 (car n) (car b) (cadr b) (car c) (cadr c)))
(if (and (vl-consp (cadr b)) (vl-consp (cadr c)));_the 2 terms's 2nd item is a list
(setq r (f1 (car n)
(car b)
(ss:lookup (cdr n) (cdr b))
(car c)
(ss:lookup (cdr n) (cdr c))))
)))
))
)
)
)