Выход в Для цикла - Windows Command Processor (CMD.EXE)

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

6
задан John Saunders 26 July 2009 в 12:19
поделиться

1 ответ

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.

5
ответ дан 8 December 2019 в 18:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: