Czy możesz wyjaśnić różnice między trzema symbolami: proclaim
, declaim
i declare
?Głoszenie, deklamacja, deklaracja
Odpowiedz
Są to symbols, a nie keywords.
proclaim
podając nazwę funkcyjne dokonywania globalnegodeclarations. W miarę możliwości powinieneś używaćdeclaim
.declaim
podając nazwę makro dokonywania globalnych deklaracji (jakproclaim
), które są również skuteczne w kompilacji.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.
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
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
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