2010-03-29 25 views

Respuesta

7

esto es lo que yo uso para amortiguar tanto en tiempo de compilación y tiempo de ejecución (tiempo de carga) advertencias de redefinición:

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

siguiendo este patrón puede instalar estos controladores en superclases como cl: estilo de alerta de mufla todas las advertencias de estilo.

+0

¿Se supone que funciona si solo lo agrego al final de mi archivo '.sbclrc'? Porque lo hice, comencé el REPL desde la línea de comando, ingresé '(setq x 1)', y aún arrojó una advertencia ... ('; in: SETQ X; (SETQ X 1);; capturada ADVERTENCIA: ; variable indefinida: X;; unidad de compilación terminada; Variable indefinida :; X; capturada 1 ADVERTENCIA condición1 * ') –

+1

Lea más detenidamente. '(localmente (declarar # + sbcl (SB-ext: amortiguar las condiciones cl: aviso)) (manejador-bind (# + sbcl (CL: # aviso de" alerta amortiguar-)) (setq x 1))) ' –

2

Probablemente quiera mirar SB-EXT:MUFFLE-CONDITIONS.

+2

¿Dónde están las diferentes condiciones que pueden amortiguarse? Quiero silenciar todas las advertencias de estilo, y esta documentación es débil. –

+0

Eso es obtener un 404 ahora. –

+0

@Owen_R El enlace parece estar funcionando en este punto. –

10

Puede usar SB-EXT:MUFFLE-CONDITIONS como dijo Pillsy, la otra alternativa es leer las advertencias y usarlas para modificar su código y eliminar las advertencias. Especialmente si en realidad son advertencias (en lugar de, digamos, notas de optimización).

3

No pude obtener SB-EXT: CONDICIONES DE SILENCIO para trabajar con la advertencia de variable indefinida altamente molesta, incluso después de mucho googlear. Esa advertencia me vuelve loco cuando experimento en el REPL, así que hice lo que todos los libros sugieren que debemos hacer: extender el ceceo para adaptarlo a mis necesidades/preferencias.

Escribí mi propio setq que cerró las advertencias sbcl, mi primera macro :). Estoy seguro de que hay mejores formas de hacerlo, pero esto funciona muy bien para mí, ¡y va directamente a mi ~/.sbclrc!

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

Normalmente solo defino las variables antes de usarlas, ya sea con defvar (' (defvar x 3) 'que no sea mucho más largo que' (setq x 3) ') o let. –

+3

Para programas, no es un problema. Para los experimentos REPL, predefinir variables para silenciar la advertencia es un PITA importante. – Bogatyr

+0

Para que lo sepas, estás evaluando el valor dos veces, que es de mala calidad. Ver alexandria: una vez-solo – spacebat

2

Después de mucho faffing
y penosamente a través de documentación escrita por personas que aparentemente son alérgicos a ejemplos concretos simples
(que parece ser más documentación para la mayoría de las cosas)
Creo que todo lo que necesita que hacer para desactivar todas las advertencias
es añadir esta línea en su .sbclrc archivo:

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

Para desactivar sólo estilo-advertencias, es:

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

intenté desactivar específicamente la advertencia que aparece si se introduce por ejemplo (setq x 1) en una fresca REPL

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

Al utilizar este:

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

pero no funcionó,
(aparentemente redefinition-warning significa algo más)
y no puedo encontrar lo que debería ser.
Supuse sb-kernel:undefined-warning
pero eso no existe.

El uso de una macro

Además,
en lo que respecta @ respuesta de Bogatyr
(usando una macro para que se ejecute automáticamente defvar)
y @ comentario de Spacebat
(que la macro evalúa el valor dos veces)
Tengo esto que decir:

Como otro newb que se encuentra con esto,
Quería hacer la demostración que muestra t La macro evalúa dos veces,
y muestra una versión que solo se evalúa una vez.

(
Originalmente editado en al final de la pregunta
pero fue rechazado debido a que:.
"Esta edición se pretende abordar el autor de la entrada y no tiene sentido como una edición Debería haber sido escrito como un comentario o una respuesta."

Bueno, no se puede responder a una respuesta,
pero los comentarios no pueden tomar los bloques de código,
así que supongo que debo poner aquí su lugar?
)

originales

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

    (sq v (princ "hi")) 
  • efectos secundarios: Impresiones hihi
  • valor de retorno: "hi"

reescritura 2 - sólo evals una vez, siempre se corre defvar

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

    (sq2 v (princ "hi")) 
  • efectos secundarios: Impresiones hi
  • valor de retorno: "hi"

reescritura 3 - igual que el anterior, pero más difícil de leer

que utilizan value-to-set para mayor claridad,
pero sólo podrían usar value nuevamente sin problemas:

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

    (sq3 v (princ "hi")) 

reescriba 4 - solo ejecuta defvar si t que la variable no está consolidado

de funcionamiento de estas macros siempre definir la variable antes de configurarla,
así que si v ya estaba "obligado", pero no "definido"
(es decir, que había introducido con setq)
luego ganó 'Obtenga más mensajes de error cuando usa la variable
o la restablece con setq.

Aquí hay una versión de la macro
que sólo carreras defvar si la variable no está ya obligado:

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

Así que si usted lo utiliza para establecer una variable que está obligado, pero no define
seguirá dando mensajes de error.
(que es quizá una buena cosa?
Al igual que, por la misma razón-que-no-realidad-saber-qué existe el mensaje de error en el primer lugar.)

[
Además,
probé la macro en éstos:

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

(ya sabes, comprobando que no había metido la pata y ... hecho algo raro.)

aquellos en los que he tratado de utilizar como var una variable arrojó errores.

Al principio pensé que había estropeado algo,
pero en realidad está reservado para algo especial en SBCL (?) Sí mismo.

(defvar var) obtiene:

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

Así que ... en caso de duda, evite utilizar el símbolo var, supongo.
]

+0

Ha pasado un tiempo, pero me interesé nuevamente cuando me di cuenta de esto. Estoy de acuerdo en que es útil tener esto para rebuscar en el REPL. Aquí hay una versión que realiza la verificación de la delimitación en el momento de la evaluación, no en el tiempo de expansión macro, y admite la configuración de la documentación también: https://gist.github.com/4ea0ae200c4cb2ce7a8e4a7fd5f4029a – spacebat

+0

El código aquí tiene problemas de doble evaluación. Puede que quieras arreglarlo. – Gewthen

0

Si las advertencias son todo lo que importa se puede establecer:

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

Esto sólo se aplicará a las advertencias de estilo y permitir que otras advertencias y condiciones de imprimir. Cualquier advertencia que comparta al mismo padre se amortiguará automáticamente.

Cuestiones relacionadas