(defpackage #:app-constants (:use #:cl) (:export #:define-constant #:+false+ #:+true+)) (in-package #:app-constants) #| Switched to `DEFINE-CONSTANT' from `DEFCONSTANT'. ================================================================================ Because this website uses Steel Bank Common Lisp (SBCL), I need to go through a cycle of confirming changes to the constant values even though they have not changed. This behaviour is explained in the SBCL Manual 2.1.3 2021-03 (Section 2.3.4 Defining Constants, page 5 (printed) page 13 (PDF)). The key part of the section is, 'ANSI says that doing `DEFCONSTANT' of the same symbol more than once is undefined unless the new value is eql to the old value.' http://www.sbcl.org/manual/#Defining-Constants (this URL should provide the latest information of the subject). A workaround, provided by the SBCL Manual is to use the `DEFINE-CONSTANT' macro instead of `DEFCONST'. By doing this, I can use Quickload to reload the code (after a big change for example) and not have to repeat the cycle of 'updating' the constants when they have not changed. |# (defmacro define-constant (name value &optional doc) `(defconstant ,name (if (boundp ',name) (symbol-value ',name) ,value) ,@(when doc (list doc)))) #| SQLite does not have Boolean value types. ================================================================================ At the time of writing (February 2022), the website uses SQLite as its database. So, I have made these constants to reduce hard-coded `1' and/or `0' values when `TRUE' and `NIL'/`FALSE' values are want is meant (in the code-base). |# (define-constant +false+ 0 "An integer representing 'false' (for SQLite mostly).") (define-constant +true+ 1 "An integer representing 'true' (for SQLite mostly.")