2010-03-29 186 views

回答

7

這是我用來裹住編譯時和運行時(加載時)重新定義警告:以下這個模式,你可以像CL超安裝這些處理​​器

(locally 
    (declare #+sbcl(sb-ext:muffle-conditions sb-kernel:redefinition-warning)) 
    (handler-bind 
     (#+sbcl(sb-kernel:redefinition-warning #'muffle-warning)) 
    ;; stuff that emits redefinition-warning's 
    )) 

:風格預警裹住所有樣式警告。

+0

這是否應該工作,如果我只是將它添加到我的'.sbclrc'文件的末尾? Cuz我這樣做了,從命令行啓動了REPL,進入了'(setq x 1)',並且它仍然發出警告......('; in:SETQ X;(SETQ X 1);; caught警告: ;未定義變量:X;;編譯單元完成;未定義變量:; X;捕獲1 WARNING condition1 *') – 2016-05-04 11:29:40

+1

仔細閱讀。 '(本地 (聲明#+ SBCL(SB-EXT:馬弗條件CL:警告)) (處理程序綁定 (#+ SBCL(CL:警告#'馬弗警告)) (setq X 1 )))' – 2016-05-07 19:27:16

2

你可能想看看SB-EXT:MUFFLE-CONDITIONS

+2

哪裏可以悶悶不樂?我想消除所有樣式警告,並且這個文檔很薄弱。 – 2010-03-29 02:55:04

+0

現在得到了404。 – 2016-05-04 10:44:24

+0

@Owen_R此時鏈接似乎正在工作。 – 2017-09-05 17:13:12

10

您可以使用SB-EXT:MUFFLE-CONDITIONS Pillsy說,另一種方法是通讀警告並使用它們修改代碼以刪除警告。特別是如果他們實際上是警告(而不是優化說明)。

3

即使經過大量的搜索,我也無法獲得SB-EXT:MUFFLE-CONDITIONS的工作,以應對非常令人討厭的未定義變量警告。在REPL進行實驗時,這個警告讓我感到非常緊張,所以我做了所有書籍建議我們應該做的事情:擴展lisp以滿足我的需求/偏好!

我寫了自己的setq,關閉了sbcl警告,我的第一個宏曾經:)。我相信有更好的方法來做到這一點,但這對我來說很好,而且它正好進入我的〜/ .sbclrc!

(defmacro sq (var value) 
    `(progn 
     (defvar ,var ,value) 
     (setq ,var ,value))) 
+0

我通常只是在使用它們之前定義變量,或者用defvar('(defvar x 3)'不要比'(setq x 3)'長得多或者讓)。 – 2012-03-03 20:11:42

+3

對於程序來說這不是問題。對於REPL實驗,預定義變量以使警告無效是主要的PITA。 – Bogatyr 2012-03-04 09:35:36

+0

就這樣,你知道,你正在評估價值兩次,這是可憐的形式。見亞歷山德里亞:只有一次 – spacebat 2015-12-18 08:11:12

2

多faffing約
並通過人誰是顯然過敏的簡單具體的例子
(這似乎是大多數的東西大多數文檔)
書面文件苦讀之後,我認爲,所有你需要做禁用所有警告
是你.sbclrc文件中加入這一行:

(declaim (sb-ext:muffle-conditions cl:warning)) 

要禁用僅風格的警告,它是:

(declaim (sb-ext:muffle-conditions cl:style-warning)) 

我嘗試禁用特別是如果你在一個新的REPL

; in: SETQ X 
;  (SETQ X 1) 
; 
; caught WARNING: 
; undefined variable: X 
; 
; compilation unit finished 
; Undefined variable: 
;  X 
; caught 1 WARNING condition 

進入如(setq x 1)利用這一點,出現的警告:

(declaim (sb-ext:muffle-conditions sb-kernel:redefinition-warning)) 

,但它沒有工作,
(顯然redefinition-warning意味着別的東西)
我找不到它應該是什麼。
我猜對了sb-kernel:undefined-warning
但這並不存在。

使用宏

此外,
問候@ Bogatyr的回答
(使用宏來自動運行defvar
和@ spacebat的評論
(即宏觀評估值的兩倍)
我有這樣說:

作爲另一個newb碰到這個,
我想演示顯示t這個宏將會傳遞兩次,
,並顯示僅評估一次的版本。


我本來編輯它在這個問題
結束,但被拒絕,因爲:
「這個編輯的目的是要解決帖子的作者並沒有任何意義爲編輯它應該已經寫成評論或回答。」

好了,你可以不回答的答案,
但意見不能採取的代碼塊,
所以我想我應該把它放在這裏呢?

(defmacro sq (var value) 
    `(progn 
     (defvar ,var ,value) 
     (setq ,var ,value))) 

    (sq v (princ "hi")) 
  • 副作用:打印hihi
  • 返回值:"hi"

改寫2 - 只有evals一次,始終運行defvar

(defmacro sq2 (var value) 
(let 
    ((value-to-set value)) 
    `(progn 
     (defvar ,var) 
     (setq ,var ,value-to-set)))) 

    (sq2 v (princ "hi")) 
  • 副作用:打印hi
  • 返回值:"hi"

重寫3 - 同上,但棘手閱讀

我以前value-to-set爲清楚起見,
但你可以只使用value再次沒有問題:

(defmacro sq3 (var value) 
(let 
    ((value value)) 
    `(progn 
     (defvar ,var) 
     (setq ,var ,value)))) 

    (sq3 v (princ "hi")) 

重寫4 - 只運行defvar如果t他變量綁定

運行這些宏設置之前,總是會定義變量,
所以如果v已經「綁定」,而不是「定義」
(即你曾與setq介紹了吧)
再拿下當您使用變量
或使用setq將其重置時,不會再收到更多錯誤消息。

這裏的宏觀
只有運行defvar的版本,如果變量沒有已綁定:

(defmacro sq4 (var value) 
    (let 
    ((value-to-set value)) 
    (if (boundp var) 
     `(setq ,var ,value-to-set) 
     `(progn 
      (defvar ,var) 
      (setq ,var ,value-to-set))))) 

    (sq4 v (princ "hi")) 

所以,如果你用它來設置綁定,但沒有定義
變量它會不斷給你提供錯誤信息。
(這也許是一件好事嗎?
一樣,出於同樣的原因 - 我 - 不要 - 實際上,知道,爲什麼在第一個地方存在的錯誤消息。)

[
此外,
我測試這些宏:

(sq4 value   1    ) 
(sq4 value   'value  ) 
(sq4 value   'value-to-set ) 
(sq4 value   'var   ) 
(sq4 value-to-set 1    ) 
(sq4 value-to-set 'value  ) 
(sq4 value-to-set 'value-to-set ) 
(sq4 value-to-set 'var   ) 
(sq4 var    1    ) 
(sq4 var   'value   ) 
(sq4 var   'value-to-set ) 
(sq4 var   'var   ) 

(你知道,檢查我沒有搞砸了......做了一些奇怪的。)

,我試圖用var爲那些一個可變的錯誤。

起初我以爲我搞砸了一些東西,
但它實際上只是保留在SBCL(?)本身特殊的東西。

(defvar var)得到:

; debugger invoked on a SYMBOL-PACKAGE-LOCKED-ERROR in thread 
; #<THREAD "main thread" RUNNING {AB5D0A1}>: 
; Lock on package SB-DEBUG violated when globally declaring VAR SPECIAL while 
; in package COMMON-LISP-USER. 
; See also: 
; The SBCL Manual, Node "Package Locks" 

所以......有疑問時,應避免使用符號var,我猜。
]

+0

它已經有一段時間了,但當我注意到這一點時我只是再次感興趣。我同意它在REPL中有這樣的用途。以下是在評估時執行有界性檢查的版本,而不是宏展開時間,並支持設置文檔:https://gist.github.com/4ea0ae200c4cb2ce7a8e4a7fd5f4029a – spacebat 2016-11-10 22:45:20

+0

此處的代碼有雙重評估問題。可能想修復它。 – Gewthen 2017-09-05 05:08:45

0

如果警告是所有你關心你可以設置:

(setf sb-ext:*muffled-warnings* 'style-warning)

這將僅適用於樣式警告,並允許其他警告和條件打印出來。共享相同父級的任何警告將自動消隱。