После долгих раздумий по поводу
и перебранки документации, написанной людьми, у которых явно аллергия на простые конкретные примеры
(что, похоже, является самой документацией для большинства вещей)
] Я думаю, что все, что вам нужно сделать, чтобы отключить все предупреждения
, это добавить эту строку в ваш файл .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"
(defmacro sq2 (var value)
(let
((value-to-set value))
`(progn
(defvar ,var)
(setq ,var ,value-to-set))))
(sq2 v (princ "hi"))
hi
"hi"
Я использовал value-to-set
для ясности ,
, но вы можете просто без проблем использовать value
:
(defmacro sq3 (var value)
(let
((value value))
`(progn
(defvar ,var)
(setq ,var ,value))))
(sq3 v (princ "hi"))
Запуск этих макросов будет всегда определяйте переменная перед установкой,
, поэтому, если 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
, я думаю.
] [1 191]
You can set a variable, meaning that the complete loop should be aborted and use it like this:
:fail1
echo "Step in fail1"
pause
set exit=1
And you'd change the loop like this:
FOR /F "tokens=1,2 delims=," %%i in (%myfile%) do (
if defined exit (
exit /b 9993
) else (
call :process "%%i"
)
)
(broken into multiple lines for readability).
Since you are just calling a subroutine from the for
loop there is no way for this subroutine to exit the loop directly. Hence the workaround with a variable.