Estou tentando ver se todos os valores em uma lista são verdadeiros. Por alguma razão, (apply #'and lst)
erros com:
Função inválida: e
Isso também acontece quando tento (cl-reduce #'and lst)
.
No entanto, (apply #'max lst)
parece funcionar bem.
No momento, estou usando (eval `(and ,@lst))
, mas isso parece feio.
and
é uma forma especial e não uma função.(cl-every 'identity lst)
ou(-all? 'identity lst)
.Respostas:
Esta é realmente apenas uma resposta parcial (já que não sei dizer por que ou realmente fornecer uma solução alternativa para isso além do que você já tem).
Conforme
C-h f and
Portanto, mesmo que se comporte como uma função, não é uma. O mesmo erro é gerado usando a
macro
no lugar deand
.fonte
(and nil (drop 'bomb))
é seguro desde queand
não seja uma função.Para adicionar e resumir o que outros disseram:
Fim da história.
No manual Elisp, nó O que é uma função :
(Cara, eu odeio a nova citação ondulada nos manuais. Faz-me substituir cada uma delas
`
depois de colar o manual aqui. Duas vezes mais esforço do que quando o manual (com prudência) usou em`...'
vez de‘...’
).fonte
O que é uma função?
Para entender por que isso acontece, precisamos saber o que é uma função. Ao avaliar o formulário lisp
(myfunc arg1 arg2 ...)
, o emacs primeiro verifica o quemyfunc
é. Se for uma função, emacs avalia todas as formas Lisparg1
,arg2
etc., em seguida, chama a funçãomyfunc
com os objetos Lisp resultantes como argumentos.Como foi observado,
and
não é uma função, é uma forma especial, portanto, ele pode avaliar seus argumentos conforme necessário. Como eu disse em um comentário anterior, o formulário(and nil (drop 'bomb))
é seguro porque(drop 'bomb)
nunca é avaliado.Por outro lado,
(apply #'and (list nil (drop 'bomb)))
não é seguro, porqueapply
é uma função, então o emacs avalia primeiro#'and
(o resultado é um símbolo), depois avalia(list nil (drop 'bomb))
, que é novamente uma chamada de função, para que você adivinhe o que acontece a seguir:nil
é avaliado e, em seguida,(drop 'bomb)
avaliado.Por que
apply
reclama?Tentar usar
apply
em um formulário especial (ou macro) não faz sentido, porque o formulário especial não pode ter seu comportamento especial; portanto, gera um erro.fonte