Como passar a função como argumento no elisp

8

Estou lendo o SICP recentemente para aprender a programação lisp.

Há um exemplo no livro para fazer uma soma de funções de alto nível, como abaixo.

 (define (sum term a next b)
   ...
   (term a)
   ...
   (next a)
   ...

Nesta função, term e next são funções.

Eu quero escrever a mesma função no elisp assim.

 (defun sum (term a next b)
    ....
    (funcall term a)
    ...
    (func next a)
    ....

Então eu defino algumas funções de teste para testar soma

 (defun inc-test (x) (+ x 1))

 sum inc-test 1 inc-test 10 

mas mostra erros como este: Função inválida: inc-test

Como sou novo no elisp, alguém pode me dizer como consertar isso? muito aprecio

Luis404
fonte
Como você está ligando sum?
Dan
Olá, adicione o exemplo de chamada
Luis404
3
O Emacs Lisp tem duas namesapces para funções e variáveis. Isso significa que inc-testno seu último exemplo é usado como uma variável, mas não é definido como uma variável (é uma função). Você precisa passar um símbolo ou uma referência de função para funcall. Portanto, uma maneira de corrigir seu código é passá-lo em 'inc-testvez de inc-test(observe a citação).
wvxvw
você quer dizer isso: sum 'inc-test 1' inc-test 10 ??? obtive este erro:
use
3
Os dois namespaces versus um problema são uma das grandes diferenças entre elisp e lisp comum por um lado, e esquema por outro. Você ficará confuso se ler o SICP e praticar em um lisp-2 (como é chamado o tipo com espaços de nomes separados para variáveis ​​e funções). Talvez você deva ter uma implementação de esquema real para brincar?
Harald Hanche-Olsen

Respostas:

6

Para recapitular o que está nos comentários, funcallcoloque entre aspas seu argumento (apenas acessando o argumento). E antes disso, também precisamos garantir que não tentemos avaliar ou acessar o valor do parâmetro de nome da função que é passado na chamada para a função.

Portanto, uma resposta aceitável parece ser:

(defun sum (term a next b)
    (funcall term a)
    (funcall next a))

(defun inc-test (x) (+ x 1))

(sum 'inc-test 1 'inc-test 10 )

Ou basicamente ligue com 'inc-testou (quote inctest)melhor que inc-test.

rochoso
fonte