Как отключить предупреждения в lisp (sbcl) - PullRequest
15 голосов
/ 29 марта 2010

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

Ответы [ 7 ]

10 голосов
/ 29 марта 2010

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

8 голосов
/ 31 марта 2010

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

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

5 голосов
/ 04 мая 2016

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

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

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

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

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

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

оригинал

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

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

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

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, я думаю.
]

3 голосов
/ 03 октября 2011

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

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

(defmacro sq (var value)
  `(progn
      (defvar ,var ,value)
      (setq ,var ,value)))
2 голосов
/ 29 марта 2010

Вы, вероятно, хотите посмотреть на SB-EXT:MUFFLE-CONDITIONS.

0 голосов
/ 11 марта 2019

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

В качестве альтернативы, вы можете передать в файл.
sbcl 2>myTempLog.txt

0 голосов
/ 05 сентября 2017

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

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

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

...