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