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