Existe uma diferença entre `# '(lambda…` e `(lambda…`? [Duplicado]
Dec 14 2020
Em Practical Common Lisp há um exemplo de REMOVE-IF-NOT
com um lambda:
CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Isso é diferente de:
CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)
Um (lambda..)
valor coincide com a forma da função entre aspas #'(..)
? No REPL parece que sim, mas como sou novo no Lisp, posso deixar passar alguma coisa (e com certeza entendi o palavreado errado, então, por favor, corrija-me nisso também).
Respostas
4 tfb Dec 14 2020 at 19:03
Essas duas coisas são, como você suspeita, as mesmas:
#'
é uma macro de leitura e#'x
é lida como(function x)
. Então#'(lambda (...) ...)
é lido como(function (lambda (...) ...))
, ondefunction
está o operador especial em CL que diz que seu argumento denota uma função;lambda
é definido como uma macro: a expansão de(lambda (...) ...)
é(function (lambda (...) ...)
: a forma idêntica à anterior.
Isso significa que #'(lambda (...) ...)
, (lambda (...) ...)
e (function (lambda (...) ...))
todos são a mesma coisa em CL: todos eles denotam a função especificada por (lambda (...) ...)
no ambiente léxico atual.
Existem duas razões pelas quais as pessoas ainda podem usar a #'(lambda (...) ...)
versão:
- consistência - você precisa, por exemplo,
#'foo
sefoo
for uma função, então pode ser visto como mais consistente usá-lo para olambda
caso também; - nem sempre foi o caso em CL que
lambda
tinha a definição de macro que agora tem, então o código que foi escrito entre a especificação CL original e o padrão ANSI, ou que foi escrito por pessoas que se lembram daqueles tempos, pode usar o#'
formulário.
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas