のすべての警告を無効にするにはどうすればよいsbcl
ですか?余分な出力はかなり面倒です。
8 に答える
Pillsyが言ったように使用することもできますがSB-EXT:MUFFLE-CONDITIONS
、もう1つの方法は、警告を読み、それらを使用してコードを変更し、警告を削除することです。特に、それらが実際に警告である場合(たとえば、最適化のメモではなく)。
単純な具体的な例(ほとんどの場合、ほとんどのドキュメントのようです)
にアレルギーがあると思われる人々によって書かれたドキュメントをよく調べて調べた後、すべての警告
を無効にするために必要なのは、ファイルに次
の行を追加することだけだと思います。.sbclrc
(declaim (sb-ext:muffle-conditions cl:warning))
スタイル警告のみを無効にするには、次のようにします。
(declaim (sb-ext:muffle-conditions cl:style-warning))
(setq x 1)
たとえば、新しいREPLで入力した場合に表示される警告を、特に無効にしようとしました。
; in: SETQ X
; (SETQ X 1)
;
; caught WARNING:
; undefined variable: X
;
; compilation unit finished
; Undefined variable:
; X
; caught 1 WARNING condition
これを使用することによって:
(declaim (sb-ext:muffle-conditions sb-kernel:redefinition-warning))
しかし、それは機能しませんでした
(明らかにredefinition-warning
何か他のものを意味します)
そして私はそれがどうあるべきかを見つけることができません。
推測sb-kernel:undefined-warning
しましたが、それは存在しません。
マクロの使用
また、
@ Bogatyrの回答
(マクロを使用して自動的に実行するdefvar
)
と@spacebatのコメント
(マクロが値を2回評価した)に関して、
私は次のように述べています。
これに出くわした別の初心者として、マクロが2回
評価され、1回だけ評価されるバージョンを示す
デモを作成したいと思いました。
(
私はもともと質問の最後に編集しましたが、次の
理由で却下されました:
「この編集は投稿の作成者に宛てたものであり、編集としては意味がありません。コメントまたは回答として書かれている必要があります。 「」
ええと、答えに答えることはできません
が、コメントはコードのブロックを取ることができない
ので、代わりにここに置くべきだと思いますか?
)。
オリジナル
(defmacro sq (var value)
`(progn
(defvar ,var ,value)
(setq ,var ,value)))
(sq v (princ "hi"))
- 副作用:プリント
hihi
- 戻り値:
"hi"
書き直し2-評価は1回だけで、常に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"))
rewrite4-変数がバインドされていない場合にのみdefvarを実行します
これらのマクロを実行すると、設定する前に常に変数が定義される
ため、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
。
]
これは、コンパイル時と実行時(ロード時)の両方の再定義警告を消音するために使用するものです。
(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
))
このパターンに従って、これらのハンドラーをcl:style-warningなどのスーパークラスにインストールして、すべてのスタイル警告を消音することができます。
何度もグーグルした後でも、非常に迷惑な未定義の変数警告に対してSB-EXT:MUFFLE-CONDITIONSを機能させることができませんでした。その警告はREPLで実験するときに私を狂わせるので、私はすべての本が私たちがすべきだと示唆していることをしました:私のニーズ/好みに合うようにlispを拡張してください!
私はsbcl警告をシャットダウンする独自のsetqを作成しました。これは、初めてのマクロです:)。それを行うためのより良い方法があると確信していますが、これは私にとってはうまく機能し、私の〜/ .sbclrcに直接入ります!
(defmacro sq (var value)
`(progn
(defvar ,var ,value)
(setq ,var ,value)))
あなたはおそらく見たいと思うでしょうSB-EXT:MUFFLE-CONDITIONS
。
警告だけが気になる場合は、次のように設定できます。
(setf sb-ext:*muffled-warnings* 'style-warning)
これはスタイル警告にのみ適用され、他の警告と条件を印刷できます。同じ親を共有する警告は自動的に消音されます。
私(そしておそらく他の人)にとって、警告のほとんどは実際にはstdErrにパイプされていました。
したがって、これは迷惑な出力を沈黙させました:
sbcl 2>/dev/null/
または、ファイルにパイプすることもできます。
sbcl 2>myTempLog.txt
sbclを起動するときの問題は、少なくとも私の構成では、ミュートソリューションに関係なく、asdf、alexandria、readlineのために、alexandriaが大量のメソッド警告と再定義警告を吐き出すことです。
ユーザーtheoskiのソリューション(sbcl 2> / dev / null ...)は、これらを取り除くために完全に機能しますが、実際に役立つ可能性のある警告が犠牲になります。
それでも、私は常にターミナルでreplを開いて、すばやくハックして実験するためのスクラッチを作成しています。ロード時にそのなだれが表示されないのは非常に便利です。