2012-02-26 67 views
4

我盯着Steele的Common Lisp語言直到我臉色蒼白,仍然有這個問題。如果我編譯:如何讓Lisp編譯器忽略(標籤變量)函數?

(defun x() 
    (labels ((y())) 
    5)) 
(princ (x)) 
(terpri) 

發生這種情況:

home:~/clisp/experiments$ clisp -c -q x.lisp 
;; Compiling file /u/home/clisp/experiments/x.lisp ... 
WARNING in lines 1..3 : 
function X-Y is not used. 
Misspelled or missing IGNORE declaration? 
;; Wrote file /u/home/clisp/experiments/x.fas 
0 errors, 1 warning 
home:~/clisp/experiments$ 

很公平。那麼我該如何讓編譯器忽略函數y?我嘗試這樣做:

(defun x() 
    (labels (#+ignore(y())) 
    5)) 
(princ (x)) 
(terpri) 

和它的工作:

home:~/clisp/experiments$ clisp -c -q y.lisp 
;; Compiling file /u/home/clisp/experiments/y.lisp ... 
;; Wrote file /u/home/clisp/experiments/y.fas 
0 errors, 0 warnings 
home:~/clisp/experiments$ 

但不知何故,我不認爲這是什麼警告提示我做的。

我該怎麼辦?

+1

僅供參考,'#+ ignore'可讓讀者跳過整個下一個表格(當然,除非'* features *'中有'ignore'), 。 – Svante 2012-02-26 22:47:29

+0

Ed Zachary。那是我的邪惡計劃。但是,下面答案中列出的好計劃佔了上風。 :) – 2012-02-27 00:43:22

+0

CLtl和CLtl2都是過時的書籍,只會將它們推薦給對lisp歷史感興趣的人,而不是用作參考或學習材料。對於現代ANSI常見的lisp閱讀,我會推薦Peter Seibel的Practical Common Lisp和Conrad Barski的Lisp Land。 – 2012-03-02 13:38:32

回答

8

GNU CLISP要求您將declare的功能設爲ignored

(defun x() 
    (labels ((y())) 
    (declare (ignore (function y))) 
    5)) 

可選地(尤其是如果這是一個宏擴展,其中這取決於用戶y是否實際使用或不使用的結果),

(defun x() 
    (labels ((y())) 
    (declare (ignorable (function y))) 
    5)) 

(不管你預計寫(function y),您可以自由使用讀取器的縮寫#'y

+0

這裏所說的一切都和你說的完全一樣。謝謝! – 2012-02-26 22:11:29