2016-10-23 141 views

回答

2

這些是一個讀取時間條件化設施:#+#-讓您根據Feature Expressions根據read決定什麼表達式。

例如,

#+:allegro (require :osi) 
#+:sbcl (require :sb-executable) 

意味着allegro下運行時,該模塊:osi將被加載,但sbcl下運行時,該模塊:sb-executable將由require被加載。

在所有其他實施中require根本不會被調用,因爲read將跳過表單。

您可以檢查不只是實現的名字,而是一個特定的功能,例如,

#+(<= (integer-length most-positive-fixnum) 32) 
code for a 32-bit lisp 
#+(> (integer-length most-positive-fixnum) 32) 
code for a 64-bit lisp 

除了根據具體的情況選擇的代碼,這使人們可以輕鬆地「註釋掉」你的代碼段(即,下一SEXP):

#+(or) (this code will be skipped over by any lisp reader 
     because (or) returns nil) 
+0

對於「註釋」,我也發現'#+ nil'工作。 – rogual

+0

@rogual:它只適用於你沒有使用[NIL](https://en.wikipedia.org/wiki/NIL_(programming_language)) – sds

1

這是基於該列表特徵上讀者宏,這個宏指示來執行的形式或不如果符號存在於特徵列表

顯示功能列表:

CL-USER> *features* 
(:SWANK :QUICKLISP :QUICKLISP-SUPPORT-HTTPS :ROS.INIT :ASDF-PACKAGE-SYSTEM :ASDF3.1 :ASDF3 :ASDF2 :ASDF :OS-MACOSX :OS-UNIX :ASDF-UNICODE :PRIMARY-CLASSES :COMMON-LISP :OPENMCL :CCL :CCL-1.2 :CCL-1.3 :CCL-1.4 :CCL-1.5 :CCL-1.6 :CCL-1.7 :CCL-1.8 :CCL-1.9 :CCL-1.10 :CCL-1.11 :CLOZURE :CLOZURE-COMMON-LISP :ANSI-CL :UNIX :OPENMCL-UNICODE-STRINGS :IPV6 :OPENMCL-NATIVE-THREADS :OPENMCL-PARTIAL-MOP :MCL-COMMON-MOP-SUBSET :OPENMCL-MOP-2 :OPENMCL-PRIVATE-HASH-TABLES :STATIC-CONSES-SHOULD-WORK-WITH-EGC-IN-CCL :X86-64 :X86_64 :X86-TARGET :X86-HOST :X8664-TARGET :X8664-HOST :DARWIN-HOST :DARWIN-TARGET :DARWINX86-TARGET :DARWINX8664-TARGET :DARWINX8664-HOST :64-BIT-TARGET :64-BIT-HOST :DARWIN :LITTLE-ENDIAN-TARGET :LITTLE-ENDIAN-HOST) 

在我來說,我是運行:

CL-USER> (lisp-implementation-type) 
"Clozure Common Lisp" 

CL-USER> (lisp-implementation-version) 
"Version 1.11-r16635 (DarwinX8664)" 

讓我們執行的形式,如果我使用CCL

CL-USER> #+CCL (1+ 1) 
2 

它的工作原理,因爲我的CCL上的功能列表

CL-USER> #-CCL (1+ 1) 
; No value 

這行的也工作,因爲我有CCL在功能列表

或者你能想到的oppsite,如果我不」只有執行,在格蘭功能列表

CL-USER> #-calimero (1+ 1) 
2 

你可以添加任何符號:單詞的功能列表,你也可以添加邏輯

讓我們執行,如果我在CCL上,並使用達爾文主機(即MAC OS X)

CL-USER> #+(and ccl darwin-host) (1+ 1)