2011-07-06 68 views
1

這段代碼是的Ikarus'實施vector-mapIKARUS實現矢量地圖

 (let f ([p p] [v v] [i 0] [n (vector-length v)] [ac '()]) 
     (cond 
     [($fx= i n) (ls->vec ac n)] 
     [else 
      (f p v ($fxadd1 i) n (cons (p (vector-ref v i)) ac))]))] 

爲什麼命名讓利包括參數pvn

vector-map的完整定義如下。

(module (vector-map) 
    (define who 'vector-map) 
    (define (ls->vec ls n) 
     (let f ([v (make-vector n)] 
       [n n] 
       [ls ls]) 
     (cond 
      [(null? ls) v] 
      [else 
      (let ([n ($fxsub1 n)]) 
      ($vector-set! v n ($car ls)) 
      (f v n ($cdr ls)))]))) 
    (define vector-map 
     (case-lambda 
     [(p v) 
     (unless (procedure? p) 
      (die who "not a procedure" p)) 
     (unless (vector? v) 
      (die who "not a vector" v)) 
     (let f ([p p] [v v] [i 0] [n (vector-length v)] [ac '()]) 
      (cond 
      [($fx= i n) (ls->vec ac n)] 
      [else 
       (f p v ($fxadd1 i) n (cons (p (vector-ref v i)) ac))]))] 
     [(p v0 v1) 
     (unless (procedure? p) 
      (die who "not a procedure" p)) 
     (unless (vector? v0) 
      (die who "not a vector" v0)) 
     (unless (vector? v1) 
      (die who "not a vector" v1)) 
     (let ([n (vector-length v0)]) 
      (unless ($fx= n ($vector-length v1)) 
      (die who "length mismatch" v0 v1)) 
      (let f ([p p] [v0 v0] [v1 v1] [i 0] [n n] [ac '()]) 
      (cond 
       [($fx= i n) (ls->vec ac n)] 
       [else 
       (f p v0 v1 ($fxadd1 i) n 
        (cons (p ($vector-ref v0 i) ($vector-ref v1 i)) ac))])))] 
     [(p v0 v1 . v*) 
     (unless (procedure? p) 
      (die who "not a procedure" p)) 
     (unless (vector? v0) 
      (die who "not a vector" v0)) 
     (unless (vector? v1) 
      (die who "not a vector" v1)) 
     (let ([n (vector-length v0)]) 
      (unless ($fx= n ($vector-length v1)) 
      (die who "length mismatch" v0 v1)) 
      (let f ([v* v*] [n n]) 
       (unless (null? v*) 
       (let ([a ($car v*)]) 
       (unless (vector? a) 
        (die who "not a vector" a)) 
       (unless ($fx= ($vector-length a) n) 
        (die who "length mismatch"))) 
       (f ($cdr v*) n))) 
      (let f ([p p] [v0 v0] [v1 v1] [v* v*] [i 0] [n n] [ac '()]) 
      (cond 
       [($fx= i n) (ls->vec ac n)] 
       [else 
       (f p v0 v1 v* ($fxadd1 i) n 
        (cons 
        (apply p ($vector-ref v0 i) ($vector-ref v1 i) 
         (let f ([i i] [v* v*]) 
         (if (null? v*) 
          '() 
          (cons ($vector-ref ($car v*) i) 
             (f i ($cdr v*)))))) 
        ac))])))]))) 

回答

3

很難說出原因,因爲它看起來沒有必要,但可能是減少被引用的自由變量的數量的優化。在這種情況下,p,vn成爲f的詞彙變量,並且不再需要自由變量引用。

但是,由於相應的自由變量實際上是vector-map的詞法變量,並且沒有進一步修改,所以編譯器在內部自動執行這種優化不應該很困難。現在,如果Ikarus沒有編譯器,那麼這可能解釋了手動優化。

+1

Ikarus *是*(優化)編譯器,所以看起來不太可能。 –