Регистрация | Войти
Lisp — программируемый язык программирования

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 пакета.

@2009-2013 lisper.ru