2013-02-11 12 views

Odpowiedz

25

Są to symbols, a nie keywords.

  1. proclaim podając nazwę funkcyjne dokonywania globalnegodeclarations. W miarę możliwości powinieneś używać declaim.

  2. declaim podając nazwę makro dokonywania globalnych deklaracji (jak proclaim), które są również skuteczne w kompilacji.

  3. declare tylko symbol (ig, to nie nazwa funkcji, makro, lub specjalnego operatora) dokonywania lokalne deklaracje na początku niektóre formularze (można go zobaczyć jako element z składnia tych formularzy).

Tak więc, pierwsze dwa mają wpływ na global environment, a ostatni jest lokalny.

declaim jest preferowane nad proclaim, ponieważ ma bezpośredni wpływ na środowisko kompilacji:

Chociaż wykonanie proclaim formularza ma skutki, które mogą wpływają kompilacji, kompilator nie robi każda próba rozpoznać i specjalnie przetwarzać formularze proklamacji. Proklamacja takie jak dodaje się, nawet jeśli na górnym poziomie formy, nie ma żadnego wpływu dopóki nie zostanie wykonane:

(proclaim '(special *x*))

Jeśli kompilacji efektów ubocznych pożądane, eval-when mogą być użyteczne. Na przykład:

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

W większości takich przypadków jest jednak preferuje użycie declaim do tego celu.

To znaczy, jeśli kod jest

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

kompilator będzie narzekać, że foo czyta nieznaną specjalną zmienną *x*, while

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

spowoduje żadnych ostrzeżeń.

PS.Jeśli zastanawiasz się, dlaczego CL ma jeszcze proclaim: po pierwsze, historycznie był tam przed declaim, a po drugie, proclaim jest prostszy i użyteczny w makrach.

+1

Dziękuję sds! Czy możesz wyjaśnić różnicę między 'prokleniem' i' declaim'? Zmieniłem słowo "słowo kluczowe" w moim pytaniu, było to mylące. Starałem się zdecydowanie ukryć ten symbol, ale symbol słowa był równie dobry. – tuscland

+0

Różnica między nimi jest taka: jedna jest funkcją i zwykle nie ma wpływu na czas kompilacji, podczas gdy druga jest makrem, który wpływa na środowisko kompilacji. Naprawdę musisz przeczytać specyfikację, by poznać szczegóły. – sds

+0

Dobra, rozumiem, dzięki. Szczerze mówiąc, [Hyperspec] (http://clhs.lisp.se/Body/f_procla.htm) jest trochę trudny do zrozumienia, ale spróbuję odnieść się do niego w przyszłości. – tuscland