← Архив: Common Lisp

defconstant, как правильно использовать?

Author: · 18.02.2013 15:26
· original author: dima0905
Записал defconstant, скомпилировал, изменил код, скомпилировал, ошибка естественно, на то она  константа. Как обходить повторную компиляцию defconstant? А если надо значение константы изменить?
· original author: EO
Стоит посмотреть на готовый define-constant в alexandria (файлик definitions.lisp), там рядом как раз и проверка лежит. Если изменить без перезаливки всего начисто, то это implementation defined, как я понимаю, так как в CLHS пишут, что "A constant defined by defconstant can be redefined with defconstant. However, the consequences are undefined if an attempt is made to assign a value to the symbol using another operator, or to assign it to a different value using a subsequent defconstant." http://www.lispworks.com/documentation/HyperSpec/Body/m_defcon.htm#defconstant
· original author: den73
тогда defparameter
· original author: den73
смысл константы - компилятор имеет право предположить, что она никогда не поменяется и смело делает вычисления типа (* константа 5) во время компиляции. Это противоречит идее динамической разработки. В идеале, я бы сделал что-нибудь следующего вида:
- завёл бы фичу :релиз
- завёл бы макрос
(defmacro def-константа (name value &rest doc) `(#+релиз defconstant
                                                             #-релиз defparameter
                                                             ,name ,value ,@doc))
- делал бы пересборку всего для релиза
В реальности лично мне пока не понадобилось.
Есть ещё один вариант: defconstant, а когда надо изменить значение, сделать сначала unintern 'имя-константы.
Но тогда нужно после переопределения пересобрать все исходники, зависящие от константы, иначе часть
из них будет ссылаться на старое значение.
· original author: bach74
Можно еще, наверное, в определенных ситуациях define-symbol-macro использовать, но надо помнить, что это макрос.