Üç sembol proclaim
, declaim
ve declare
arasındaki farkları açıklayabilir misiniz?Bildirimi, bildirimi, bildirme
cevap
Bunlar symbols, keywords değil.
proclaim
isimleri küreseldeclarations yapmak için bir işlev. Mümkün olduğundadeclaim
kullanmalısınız. Ayrıca derleme zamanında de etkilidirdeclaim
isimleri küresel bildirimleri yapmak için bir makro (gibiproclaim
).declare
başı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ü
declaim
proclaim
ü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.
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
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
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