Вопрос

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

Это было полезно?

Решение

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

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

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

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

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

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

оригинальный

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

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

Тем не менее, у меня всегда есть открытый ответ в терминале, чтобы можно было быстро взломать и поэкспериментировать, и это МНОГО приятнее не видеть эту лавину при загрузке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top