2010-07-09 13 views
14

Geçenlerde Scheme okuyan ve şu şekilde tanımlanan bir fonksiyonun rastlamak oldum ? null? ya cdr bu bir izin bloğu olmayan bir fonksiyondur tanımı mevcuttur fonksiyonları inşa edildiğinde, CDR için? bir hız optimizasyonu varamacı (cdr cdr) ((let)

cevap

30

Düz R5RS Şeması'nda, modül sistemi yoktur - sadece üst seviye. termore, zihniyet her şeyin değiştirilebileceğidir, böylece dili istediğiniz şekilde "özelleştirebilirsiniz". Ancak bir modül sistemi olmadan bu iyi çalışmıyor. Örneğin, ben yüklemek bir kütüphanede

(define (sub1 x) (- x 1)) 

yazma - ve şimdi - yeniden tanımlayabilirsiniz:

(define - +) ; either this 
(set! - +) ; or this 

ve şimdi istemeden teker girişini eksiltim sub1 dayanıyordu Kitaplığımı kırdı Ve sonuç olarak, pencerelerinizi aşağı doğru sürüklediğinizde ya da her neyse.

Şimdi
(define sub1 (let ((- -)) (lambda (x) (- x 1)))) 

şeyler "daha cezası çalışacaktır: Birisi değiştirebilirsiniz önce

çeşitli kütüphanelerle tarafından kullanılan bu çevrede tek yolu, toplama, çıkarma fonksiyonunun ilgili tanımını "kapmak" için "sub1 işlevimin anlamını - değiştirerek değiştiremezsiniz. (Hariç ... sen benim kütüphanesini ... yük önce bunu değiştirirseniz) Bunun sonucu olarak,

Neyse (ve - kütüphane yüklenir orjinal biri olduğunu biliyorsanız), Bazı derleyiciler bunu algılayacak ve - aramasının her zaman gerçek çıkarma fonksiyonu olacağını görecekler ve bu nedenle de çağrıları satır içi satırlara yönlendireceklerdir (ve - numaralı telefona yapılan çağrı sonunda iki sayıyı çıkarmak için montaj koduna neden olabilir) büyük bir hız artışı). Ama yukarıdaki yorumda söylediğim gibi, bu yukarıdaki gerçek sebeple daha rastlantısaldır.

Son olarak, R6RS (ve bundan önce birkaç şema uygulamaları) bu sabit ve kütüphane sistemini ekledi, bu nedenle bu numara için bir anlamı yoktur etti: sub1 kodun kütüphanede başka bir kod sürece güvenlidir içinde - yeniden tanımlanması değil bir şekilde ve derleyici, buna dayanarak kodu güvenli bir şekilde optimize edebilir. Akıllı hilelere gerek yok.

+0

Tam yanıt için teşekkür ederiz! – redwoolf

2

. Yerel değişken erişim genellikle daha hızlı global değişkenler daha olduğunu.

+0

Daha ayrıntılı olarak açıklayabilir misiniz? Görünüşe göre, ciltleme süreci, bir arama kadar çok zaman alacaktır. – redwoolf

+0

@redwoolf: "Let" ile bağlanırken arama sadece bir kez olur, ancak 'cdr' işlevde birçok kez kullanılabilir (ve yukarı bakar). – Teddy

+3

Bu, bazı uygulamalarda hız avantajına sahip olsa da, bunu yapmak için daha önemli nedenin bir yan ürünüdür. Bunu ayrı bir cevapta yazacağım. –