;; test why when usual-integrations is in effect, rebinding list->vector seems ;; to cause a procedure lookup in BINARY-SEARCH in extras.scm ;; compile: csc -t usual.scm ;; by zb ;; result: LET is a win for external procedures not covered by usual-integrations. ;; LET is a lose for usual-integrations, as it disables certain optimizations. ;; The latter is the case with binary-search and is probably a holdover ;; from pre-usual-integrations days. ;(declare (not usual-integrations list->vector)) ;; findings: both calls to list->vector are looked up with C_retrieve_proc ;; the effective call is C_cons(C_retrieve_proc(x)(C_list(3,1,2,3)) ;; C_retrieve_proc(x)(C_list(3,4,5,6))) ;; the global binding is only looked up once via C_intern and ;; stored in the closure. adding -O2 has no effect. ;; ;; with (not usual-integrations list->vector), a C_retrieve() is done only once ;; when foo is mutated with the closure, and thereafter a single C_retrieve_proc ;; for every call of list->vector. (define foo (let ((list->vector list->vector)) (lambda () (cons (list->vector '(1 2 3)) (list->vector '(4 5 6)))))) ;; findings: with usual-integrations, the list->vector is done at compile time, ;; so the call is [pseudocode] C_cons(C_vector(3,1,2,3), C_vector(3,4,5,6)) ;; ;; with (not usual-integrations list->vector), a C_retrieve() and a C_retrieve_proc ;; are done on every call. (define bar (lambda () (cons (list->vector '(1 2 3)) (list->vector '(4 5 6)))))