2013-02-11 32 views

cevap

25

Bunlar symbols, keywords değil.

  1. proclaim isimleri küreseldeclarations yapmak için bir işlev. Mümkün olduğunda declaim kullanmalısınız. Ayrıca derleme zamanında de etkilidir

  2. declaim isimleri küresel bildirimleri yapmak için bir makro (gibi proclaim).

  3. declarebaşında yerel beyanları yapılmasına bazı formları (bir unsur olarak görüntüleyebilirsiniz için (bir işlevi, makro veya özel operatörünü isim vermez, ig) sadece sembolü olduğunu Bu formların sözdizimi.

Yani, ilk ikisi global environment ve sonuncusu yereldir. o derleme ortamımızda anında etkiye sahiptir çünkü

declaimproclaim üzerinde tercih edilir: a proclaim formun yürütme olabilir derleme etkileyen etkileri vardır rağmen

, derleyici için herhangi bir girişimde yapmaz Talep formlarını tanır ve özel olarak işler. yürütüldüğünde kadar aşağıdaki bile üst düzey bir biçimde ise, herhangi bir etkisi sahip olmayan böyle bir gibi bir ilan: derleme zaman yan etkilere sahip olmaları istenen

(proclaim '(special *x*))

ise, eval-when yararlı olabilir. Örneğin: Çoğu tür durumlarda

(eval-when (:execute :compile-toplevel :load-toplevel) (proclaim '(special *x*)))

, ancak bu amaçla declaim kullanmak tercih edilebilir.

kodunuzu

(proclaim '(special *x*)) 
(defun foo() (print *x*)) 

ise yanı, derleyici foo hiçbir uyarılarına neden olur bilinmeyen özel değişkeni *x*,

(declaim (special *x*)) 
(defun foo() (print *x*)) 

ise okur şikayet edecektir.

PS.Eğer CL bile neden proclaim olduğunu merak ediyorsanız: ilk olarak, tarihsel olarak declaim'dan önce vardı ve ikincisi, proclaim, makrolarda daha basit ve kullanışlıdır.

+1

Teşekkürler sds! "Proclaim" ve "declaim" arasındaki farkı açıklayabilir misiniz? Sorgumda "anahtar kelime" kelimesini değiştirdim, kafa karıştırıcıydı. Sembol türünü gizlice gizlemeye çalışıyordum, ama kelime sembolü de aynı derecede güzeldi. – tuscland

+0

Aralarındaki fark şu şekildedir: Biri bir işlevdir ve normalde derleme zamanında hiçbir etkisi yoktur, diğeri ise derleme ortamını etkileyen bir makrodur. Ayrıntılar için spekülasyonu gerçekten okumanız gerekiyor. – sds

+0

Tamam, şimdi anladım, teşekkürler. Dürüst olmak gerekirse, [Hyperspec] (http://clhs.lisp.se/Body/f_procla.htm) anlamak biraz zor, ama gelecekte bunu anlamaya çalışacağım. – tuscland