Pergunta

Como faço para desativar todos os avisos em sbcl? A saída extra é bastante irritante.

Foi útil?

Solução

É isso que eu uso para abordar os avisos de redefinição de tempo de compilação e tempo de execução (tempo de carregamento):

(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
    ))

Seguindo esse padrão, você pode instalar esses manipuladores em superclasses como CL: Wood-Warning para abafar todos os avisos de estilo.

Outras dicas

Você pode usar SB-EXT:MUFFLE-CONDITIONS Como Pillsy disse, a outra alternativa é ler os avisos e usá -los para modificar seu código para remover os avisos. Especialmente se eles são realmente avisos (em vez de, digamos, notas de otimização).

Depois de muito me confundir
e Slaging através da documentação escrita por pessoas que são aparentemente alérgicas a exemplos concretos simples
(o que parece ser mais documentação para a maioria das coisas)
Eu acho que tudo o que você precisa fazer para desativar tudo avisos
é adicionar esta linha em seu .sbclrc Arquivo:

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

Para desativar apenas asfixias de estilo, é:

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

Eu tentei desativar especificamente o aviso que surge se você entrar, por exemplo, (setq x 1) em um novo repl

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

Usando isso:

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

Mas não funcionou,
(aparentemente redefinition-warning significa outra coisa)
E não consigo encontrar o que deveria ser.
Imaginei sb-kernel:undefined-warning
Mas isso não existe.

Usando uma macro

Também,
em relação à resposta de Bogatyr
(usando uma macro para executar automaticamente defvar)
e comentário do @spacebat
(que a macro avaliou o valor duas vezes)
Eu tenho isso a dizer:

Como outro Newb encontrando isso,
Eu queria fazer uma demonstração mostrando que a macrovalas duas vezes,
e mostrando uma versão que avalia apenas uma vez.

(
Eu o editei originalmente no final da pergunta
Mas foi rejeitado porque:
"Esta edição teve como objetivo abordar o autor do post e não faz sentido como edição. Deveria ter sido escrito como um comentário ou uma resposta".

Bem, você não pode responder uma resposta,
Mas os comentários não podem levar blocos de código,
Então eu acho que devo colocá -lo aqui?
)

original

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

    (sq v (princ "hi"))
  • Efeitos colaterais: impressões hihi
  • valor de retorno: "hi"

Reescreva 2 - Somente Evals uma vez, sempre executa Defvar

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

    (sq2 v (princ "hi"))
  • Efeitos colaterais: impressões hi
  • valor de retorno: "hi"

reescrever 3 - o mesmo que acima, mas mais complicado de ler

eu usei value-to-set Para clareza,
Mas você poderia apenas usar value Novamente sem problemas:

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

    (sq3 v (princ "hi"))

Reescrever 4 - apenas executa o DEFVAR se a variável não for ligada

Executar essas macros sempre definirá a variável antes de defini -la,
então se v já estava "amarrado", mas não "definido"
(ou seja, você havia apresentado setq)
Em seguida, não receberá mais mensagens de erro ao usar a variável,
ou redefini -lo com setq.

Aqui está uma versão da macro
este corre defvar Se a variável ainda não estiver vinculada:

(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"))

Portanto, se você o usar para definir uma variável que está ligada, mas não definida
Ele continuará lhe dando mensagens de erro.
(O que talvez seja uma coisa boa?
Como, pela mesma razão, eu não soubtualmente, soube, por que a mensagem de erro existe em primeiro lugar.)

[
Também,
Eu testei a macro neles:

(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            )

(Você sabe, verificando que eu não tinha estragado tudo e ... fiz algo estranho.)

Aqueles onde eu tentei usar var como uma variável e erros vomitados.

No começo eu pensei que tinha bagunçado algo,
Mas na verdade é reservado para algo especial no próprio SBCL (?).

(defvar var) recebe:

; 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"

Então ... em caso de dúvida, evite usar o símbolo var, Eu acho.
]

Eu não conseguia fazer com que o SB-EXT: as condições de muflações funcionem para o aviso variável indefinido muito irritante, mesmo depois de muito pesquisando no Google. Esse aviso me deixa louco ao experimentar o Repl, então fiz o que todos os livros sugerem que deveríamos fazer: estender o LISP para atender às minhas necessidades/preferências!

Eu escrevi meu próprio setQ que fechou os avisos da SBCL, minha primeira macro de todos :). Tenho certeza de que existem maneiras melhores de fazê -lo, mas isso funciona muito bem para mim, e está indo direto para o meu ~/.sbclrc!

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

Você provavelmente quer olhar para SB-EXT:MUFFLE-CONDITIONS.

Se os avisos são tudo o que você se importa, você pode definir:

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

Isso se aplicará apenas a avisos de estilo e permitirá que outros avisos e condições imprimam. Qualquer aviso que compartilhe o mesmo pai será abafado automaticamente.

Para mim (e provavelmente outros), a maioria dos avisos estava realmente sendo canalizada para Stderr.
Então, isso silenciou a saída irritante:
sbcl 2>/dev/null/

Como alternativa, você pode canalizar um arquivo.
sbcl 2>myTempLog.txt

Ao iniciar o SBCL, o problema é que, pelo menos na minha configuração, Alexandria apresenta uma tonelada de avisos de método e avisos redifinantes por causa do ASDF, Alexandria e Readline, independentemente das soluções mudo.

As soluções do usuário Theoski (sbcl 2>/dev/null ...) trabalham totalmente para se livrar dessas, mas às custas de avisos que podem ser realmente úteis.

Ainda assim, eu sempre tenho um repl aberto em um terminal como um arranhão para truques rápidos e experimentos, e é um MUITO Mais bem, não vendo essa avalanche ao carregá -la.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top