如何禁用sbcl
中的所有警告?額外的輸出是相當煩人的。如何在lisp(sbcl)中禁用警告
回答
這是我用來裹住編譯時和運行時(加載時)重新定義警告:以下這個模式,你可以像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
))
:風格預警裹住所有樣式警告。
你可能想看看SB-EXT:MUFFLE-CONDITIONS
。
哪裏可以悶悶不樂?我想消除所有樣式警告,並且這個文檔很薄弱。 – 2010-03-29 02:55:04
現在得到了404。 – 2016-05-04 10:44:24
@Owen_R此時鏈接似乎正在工作。 – 2017-09-05 17:13:12
您可以使用SB-EXT:MUFFLE-CONDITIONS
Pillsy說,另一種方法是通讀警告並使用它們修改代碼以刪除警告。特別是如果他們實際上是警告(而不是優化說明)。
即使經過大量的搜索,我也無法獲得SB-EXT:MUFFLE-CONDITIONS的工作,以應對非常令人討厭的未定義變量警告。在REPL進行實驗時,這個警告讓我感到非常緊張,所以我做了所有書籍建議我們應該做的事情:擴展lisp以滿足我的需求/偏好!
我寫了自己的setq,關閉了sbcl警告,我的第一個宏曾經:)。我相信有更好的方法來做到這一點,但這對我來說很好,而且它正好進入我的〜/ .sbclrc!
(defmacro sq (var value)
`(progn
(defvar ,var ,value)
(setq ,var ,value)))
多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
,我猜。
]
如果警告是所有你關心你可以設置:
(setf sb-ext:*muffled-warnings* 'style-warning)
這將僅適用於樣式警告,並允許其他警告和條件打印出來。共享相同父級的任何警告將自動消隱。
- 1. SBCL Common Lisp的INCF警告
- 2. 如何在common lisp(SBCL)中execve()?
- 3. 禁止sbcl中的make-instance上的樣式警告
- 4. 如何在bash中禁用「zip」警告?
- 5. 如何在GAE中禁用Datanucleus警告?
- 6. 如何禁用#pragma警告?
- 7. 如何禁用python警告
- 8. 如何禁用keras警告?
- 9. 在sbcl lisp中使用線程時在lisp中變量unbound
- 10. 在VIM中禁用警告?
- 11. 在C++中禁用警告
- 12. SBCL - 通用Lisp的錯誤
- 13. spyder:python:theano:如何禁用spyder中的警告?
- 14. 如何禁用pylint中的「TODO」警告?
- 15. 如何在msbuild中禁止DISPPARAMS警告?
- 16. 如何禁止StyleCop警告?
- 17. 如何將宏存儲在Common Lisp [sbcl]中的變量中?
- 18. 禁用警告2008
- 19. 禁用IntelliJ警告
- 20. 禁用PHP警告
- 21. IntelliJ禁用警告
- 22. 在xcode中禁用和啓用警告
- 23. 如何在sbcl(或common lisp)向量中指定元素類型?
- 24. 如何禁用svnnotify的Perl警告?
- 25. 如何禁用角度翻譯警告?
- 26. 如何禁用存儲密碼警告?
- 27. 如何禁用SystemC運行時警告?
- 28. 如何禁用這兩個警告?
- 29. 如何禁用 「警告:javax.ejb.EJBException異常」
- 30. 如何禁用Xcode C++ 11警告?
這是否應該工作,如果我只是將它添加到我的'.sbclrc'文件的末尾? Cuz我這樣做了,從命令行啓動了REPL,進入了'(setq x 1)',並且它仍然發出警告......('; in:SETQ X;(SETQ X 1);; caught警告: ;未定義變量:X;;編譯單元完成;未定義變量:; X;捕獲1 WARNING condition1 *') – 2016-05-04 11:29:40
仔細閱讀。 '(本地 (聲明#+ SBCL(SB-EXT:馬弗條件CL:警告)) (處理程序綁定 (#+ SBCL(CL:警告#'馬弗警告)) (setq X 1 )))' – 2016-05-07 19:27:16