trivial-features и переменная *FEATURES*
В CL принято помещать в переменную *FEATURES* некоторые данные касающиеся текущей платформы, ОС, реализации, её сборки и т.д. Например для SBCL на платформе x86 под управлением Windows, значение переменной *FEATURES* будет выглядеть примерно так:
* *FEATURES*
(:ANSI-CL :COMMON-LISP :SBCL :SB-DOC :SB-TEST :SB-LDB :SB-PACKAGE-LOCKS
:SB-UNICODE :SB-EVAL :SB-SOURCE-LOCATIONS :IEEE-FLOATING-POINT :X86 :WIN32
:GENCGC :STACK-GROWS-DOWNWARD-NOT-UPWARD :C-STACK-IS-CONTROL-STACK
:COMPARE-AND-SWAP-VOPS :UNWIND-TO-FRAME-AND-CALL-VOP :RAW-INSTANCE-INIT-VOPS
:STACK-ALLOCATABLE-CLOSURES :ALIEN-CALLBACKS :CYCLE-COUNTER :LINKAGE-TABLE
:OS-PROVIDES-DLOPEN :OS-PROVIDES-PUTWC)
Также есть встроенный синтаксис, который активно используется для изоляции кода для разных условий выполнения, он играет роль директив условной компиляции #ifdef в Си.
#+clisp
(; эта форма будет выполнена только для Clisp)
#-clisp
(; а это при его отсутствии)
#+(or openmcl cmu scl sbcl)
(; соответсвенно для любой указанной платформы)
(defvar *os-message* #+win32 "У нас Windows" #-win32 "У нас не Windows")
Библиотека trivial-features служит для устранения несогласованностей в определении имён платформ в разных реализациях CL. Например на MacOS X для разных реализаций в переменной *FEATURES* может быть :DARWIN, :MACOS или :MACOSX, поэтому нужно писать:
#+(or darwin macos macosx) foo
#-(or darwin macos macosx) bar
Библиотека trivial-features решает все подобные проблемы. Поэтому, например, предыдущий пример можно написать так:
#+darwin foo #-darwin bar
Спецификацию значений можно посмотреть в файле SPEC пакета.