consideran este javascript:¿Puede mostrarme cómo reescribir las funciones en lisp?
function addX(n)
{
return 3 + n;
}
alert(addX(6)); //alerts 9
eval('var newFunc = ' + addX.toString().replace("3", "5") + ';');
alert(newFunc(10)); //alert 15
por favor, ignora el hecho de que es de dudosa utilidad y la metodología, peligroso, difícil de seguir en una gran base de código, y así sucesivamente. Le permite modificar la función, sobre la marcha, en función de la información del usuario. No tengo eso demostrado, pero igual podría haberlo hecho.
Espero que me muestres cómo hacerlo en lisp. He leído muchos tutoriales, he leído mucho sobre macros, asked a broader question, he intentado muchas cosas pero finalmente me he quedado corto.
Quiero saber cómo, en lisp, puedo modificar esta función en el tiempo de ejecución para añadir en su lugar 5. O lo que sea que el usuario pueda ingresar.
(define (addX n)
(+ 3 n))
Yo no busco a currying! Sé que puedo hacer esto:
(define addXCurry
(lambda (x)
(lambda (n)
(+ x n))))
(define add5 (addXCurry 5))
(add5 10)
Pero esto está creando una fábrica de funciones.
Estoy usando un ejemplo simple porque quiero entender completamente por las malas en algo bastante simple.
Editar Gracias a todos por sus respuestas. Supongo que mi gran problema con las macros (como yo las entiendo) es que no he visto una que separe por completo la modificación de la escritura. El ejemplo de javascript es simple, pero puede realizar reescrituras más complejas según la entrada del usuario.
Las macros que he visto están todas basadas en "tiempo de compilación" (o tiempo escrito por el programador, supongo). Al igual que en C++, no puede tener un parámetro de plantilla dinámica; debe conocerse en tiempo de compilación.
(Parece) En lisp no se puede alterar fundamentalmente un procedimiento en tiempo de ejecución de la forma que se puede en javascript porque se ha perdido la fuente. Puede evaluarlo y redefinirlo, pero no puede recorrer los elementos de la lista (la lista es la definición de la función), inspeccionar cada elemento y decidir si lo cambia o no. La excepción parece ser los ejemplos en la respuesta de Rainer, que son terreno inestable.
http://stackoverflow.com/q/16380479/849891 es sobre cómo se hace en Lisp de una manera adecuada, AFAIK - con cierres, haciendo que las funciones en objetos respondan a los mensajes: '(diversión 'call args ...) 'o' (diversión 'reset-x-to 5) '(o, en C, usando variables estáticas dentro de funciones). Y no, no se trata esencialmente de currying, incluso si podría implementarse con uno, sintácticamente, superficialmente. –