;; 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)))))