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


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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.