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

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

Ответы

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

оригинал

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

    (sq v (princ "hi"))
  • побочные эффекты: отпечатки hihi
  • возвращаемое значение: "hi"

переписать 2 - только один раз один раз, всегда запускает 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"))

rewrite 4 - работает только defvar, если переменная unbound

Запуск этих макросов всегда будет определять переменную перед ее настройкой,
поэтому если v уже "привязано", но не "определено"
(т.е. вы ввели его с помощью setq)
то при использовании переменной не будет появляться больше сообщений об ошибках,
или reset с помощью 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, я думаю.
]

Ответ 4

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

Я написал свой собственный setq, который закрывает предупреждения sbcl, мой первый макрос когда-либо:). Я уверен, что есть лучшие способы сделать это, но это отлично работает для меня, и это происходит прямо в моей ~/.sbclrc!

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

Ответ 6

Если все предупреждения вас беспокоят, вы можете установить:

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

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

Ответ 7

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

Кроме того, вы можете передать в файл.
sbcl 2>myTempLog.txt

Ответ 8

При запуске sbcl проблема заключается в том, что, по крайней мере, в моей конфигурации alexandria выдает тонну предупреждений о методах и повторного определения предупреждений из-за asdf, alexandria и readline, независимо от отключенных решений.

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

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