Как отключить предупреждения в lisp (sbcl)

Как отключить все предупреждения в sbcl? Дополнительный вывод довольно раздражает.

6 ответов

Решение

Это то, что я использую, чтобы заглушить предупреждения переопределения как во время компиляции, так и во время выполнения (во время загрузки):

(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, чтобы заглушить все предупреждения стиля.

После долгих разговоров о
и копаться в документации, написанной людьми, которые, очевидно, имеют аллергию на простые конкретные примеры
(который, кажется, большинство документации для большинства вещей)
Я думаю, что все, что вам нужно сделать, чтобы отключить все предупреждения
это добавить эту строку в вашем .sbclrc файл:

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

Чтобы отключить только предупреждения о стиле, это:

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

Я пытался отключить специально предупреждение, которое появляется, если вы введете, например, (setq x 1) на свежий ответ

; 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
но этого не существует

Использование макроса

Также,
в отношении @ Богатырь ответ
(используя макрос для автоматического запуска defvar)
и комментарий @ spacebat
(что макрос оценивал значение дважды)
У меня есть это, чтобы сказать:

Как другой новичок, сталкивающийся с этим,
Я хотел сделать демонстрацию, показывающую, что макрос уходит дважды,
и показывает версию, которая оценивается только один раз.

(
Я первоначально отредактировал его в конце вопроса
но это было отклонено, потому что:
"Это изменение предназначалось для автора сообщения и не имеет смысла как редактирование. Оно должно было быть написано как комментарий или ответ".

Ну, вы не можете ответить на вопрос,
но комментарии не могут принимать блоки кода,
так что я думаю, что я должен поставить это здесь вместо этого?
)

оригинал

(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 только если переменная не привязана

Запуск этих макросов всегда определяет переменную перед ее установкой,
так что если 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, Похоже.
]

Вы можете использовать SB-EXT:MUFFLE-CONDITIONS как сказала Пилси, другой альтернативой является чтение предупреждений и их использование для изменения кода для удаления предупреждений. Особенно, если это на самом деле предупреждения (а не, скажем, заметки по оптимизации).

Я не мог заставить SB-EXT:MUFFLE-CONDITIONS работать для очень раздражающего неопределенного предупреждения о переменной переменной даже после большого количества поиска в Google. Это предупреждение сводит меня с ума, когда я экспериментирую в REPL, поэтому я сделал то, что все книги предлагают, чтобы мы сделали: расширили lisp в соответствии с моими потребностями / предпочтениями!

Я написал свой собственный setq, закрывающий предупреждения sbcl, мой первый макрос когда-либо:). Я уверен, что есть лучшие способы сделать это, но это прекрасно работает для меня, и это идет прямо в мой ~/.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 проблема в том, что, по крайней мере, в моей конфигурации, alexandria извергает тонну предупреждений о методах и предупреждений переопределения из-за asdf, alexandria и readline, независимо от решений отключения звука.

Решения пользователя theoski (sbcl 2>/dev/null ...) полностью работают, чтобы избавиться от них, но за счет предупреждений, которые действительно могут быть полезны.

Тем не менее, у меня всегда есть открытый ответ в терминале в качестве царапины для быстрых хаков и экспериментов, и намного приятнее не видеть эту лавину при загрузке.

Другие вопросы по тегам