O que quero dizer com um "wrapper de função" transparente "de passagem" "é uma função, vamos chamá-lo wrapper
, que retorna o resultado de passar todo o seu argumento para alguma outra função, vamos chamá-lo wrappee
.
Como isso é feito no Emacs Lisp?
NB: O ideal wrapper
função é agnóstico sobre a wrappee
assinatura de função; isto é, não sabe nada sobre o número, posições, nomes, etc. dos wrappee
argumentos de; apenas passa todos os seus argumentos wrappee
, como se wrappee
tivesse sido o originalmente chamado. (Porém, não é necessário mexer na pilha de chamadas para substituí-la wrapper
por uma chamada para wrappee
.)
Publiquei uma resposta parcial à minha pergunta:
(defun wrapper (&rest args) (apply 'wrappee args))
Isso funciona apenas quando nãowrappee
é interativo. Aparentemente, a maneira como as funções interativas obtêm seus argumentos representa um "canal" diferente do que é coberto pelo encantamento. O que eu ainda preciso, portanto, é uma contrapartida igualmente magnética da assinatura para o caso em que é uma função interativa .(&rest args)
wrappee
(&rest args)
wrappee
(Esta pergunta foi motivada por um problema descrito nesta pergunta anterior .)
Caso seja necessário um esclarecimento adicional sobre o que estou pedindo, abaixo estão alguns exemplos, mostrando os equivalentes em Python e JavaScript do que estou procurando.
No Python, algumas maneiras padrão de implementar esse wrapper são mostradas abaixo:
def wrapper(*args, **kwargs):
return wrappee(*args, **kwargs)
# or
wrapper = lambda *args, **kwargs: wrappee(*args, **kwargs)
(Aqui *args
significa "todos os argumentos posicionais" e **kwargs
"todos os argumentos das palavras-chave".)
O equivalente a JavaScript seria algo como isto:
function wrapper () { return wrappee.apply(this, arguments); }
// or
wrapper = function () { return wrappee.apply(this, arguments); }
Para o registro, eu discordo que esta questão seja uma duplicata de Como aplicar o mapcar a uma função com vários argumentos . Não consigo explicar por que, uma vez que as duas perguntas parecem tão obviamente diferentes para mim. É como ser perguntado "explique por que uma maçã não deve ser considerada equivalente a uma laranja". A mera pergunta é tão louca que alguém duvida que possa encontrar uma resposta que satisfaça a pessoa que a pergunta.
advice
coisas suficientemente problemáticas para que eu prefira ficar longe disso. Na verdade, a motivação para esta questão estava tentando encontrar uma solução para um problema de outra forma intratável que tenho com uma função adviced ...
interactive
especificação.