Cómo pasar la función como argumento en elisp

8

Estoy leyendo SICP recientemente para aprender la programación de lisp.

Hay un ejemplo en el libro para hacer una suma de funciones de alto nivel como se muestra a continuación.

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

En esta función, term y next son funciones.

Quiero escribir la misma función en elisp así.

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

Luego defino algunas funciones de prueba para probar la suma

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

 sum inc-test 1 inc-test 10 

pero muestra errores como este: Función no válida: inc-test

Como soy nuevo en Elisp, ¿alguien puede llamar para decirme cómo solucionarlo? muy apreciado

Luis404
fuente
¿Cómo estás llamando sum?
Dan
Hola, agregue el ejemplo de llamada
Luis404
3
Emacs Lisp tiene dos nombres para funciones y variables. Esto significa que inc-testen su último ejemplo se usa como una variable, pero no se define como una variable (es una función). Debe pasar un símbolo o una referencia de función a funcall. Por lo tanto, una forma de arreglar su código es pasarlo en 'inc-testlugar de inc-test(tenga en cuenta la cita).
wvxvw
¿quieres decir esto: suma 'inc-test 1' inc-test 10 ??? tengo este error: uso: suma: (PLAZO A SIGUIENTE B)
Luis404
3
Los dos espacios de nombres frente a un problema es una de las grandes diferencias entre elisp y el lisp común, por un lado, y el esquema, por otro. Es probable que se confunda si lee SICP y practica en un lisp-2 (como se llama al tipo con espacios de nombre separados para variables y funciones). ¿Quizás debería tener una implementación de esquema real para jugar?
Harald Hanche-Olsen

Respuestas:

6

Para recapitular lo que está en los comentarios, entre funcallcomillas su argumento (simplemente accediendo al argumento). Y antes de eso, también debemos asegurarnos de no intentar evaluar o acceder al valor del parámetro de nombre de función que se pasa en la llamada a la función.

Por lo tanto, una respuesta aceptable 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 )

O básicamente llamar con 'inc-testo en (quote inctest)lugar de inc-test.

rocoso
fuente