Как отключить предупреждения в lisp (sbcl)

Краткое решение для Javascript:

Array.prototype.combine=function combine(k){    
    var toCombine=this;
    var last;
    function combi(n,comb){             
        var combs=[];
        for ( var x=0,y=comb.length;x<y;x++){
            for ( var l=0,m=toCombine.length;l<m;l++){      
                combs.push(comb[x]+toCombine[l]);           
            }
        }
        if (n<k-1){
            n++;
            combi(n,combs);
        } else{last=combs;}
    }
    combi(1,toCombine);
    return last;
}
// Example:
// var toCombine=['a','b','c'];
// var results=toCombine.combine(4);
16
задан Pillsy 29 March 2010 в 02:40
поделиться

4 ответа

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

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

8
ответ дан 30 November 2019 в 21:02
поделиться

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

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

10
ответ дан 30 November 2019 в 21:02
поделиться

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

2
ответ дан 30 November 2019 в 21:02
поделиться
Другие вопросы по тегам:

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