From: CARLOS E. C. A. <ca...@un...> - 2009-09-26 22:18:54
|
Mario Rodriguez <bio...@te...> skribis, je 1#h6'38" (23h6'44") de 5ª Vendemiero 162ª (218.1.5 = 2009.9.26): > El mensaje de error que se obtiene: > sugiere que ev hace primero la sustitución y luego intenta derivar > respecto de 3. ¿Sabéis si hay algo parecido al MACROEXPAND y MACROEXPAND-1 de Lisp? (Me suena que sí, pero no lo usé nunca en Maxima.) Lo digo por si fuera útil en casos como éste. > ¿Por qué en un caso funciona y en otro no? Pues porque al definir la > función con el operador := éste no evalúa el miembro derecho de la > expresión, por lo que la derivada se calculará cada vez que hagas una > llamada a df. En cambio, con define, la derivada se calcula en el mismo > momento de definir la función; así, cuando ev haga la sustitución, lo > hará sobre la expresión ya derivada. Vaya. O sea que "define" se parece al "defun" de Lisp, y ":=" más a "defmacro". Aunque he leído que Maxima usa "::=" para macros. Tengo que estudiar eso también. > (%i16) df (t) := ev (''(diff (f (x), x)), x = t) ; > > También funciona, porque el operador de la doble comilla simple (que no > comilla doble), fuerza la evaluación de la derivada en el momento de > definir la función. Curioso: un apóstrofo "retarda" la evaluación (parecido a Lisp) y dos apóstrofos la "aceleran"... Hay muchas sutilezas en la sintaxis de Maxima. Me llevará tiempo estar cómodo. ¿Hay alguna manera de ver el código Lisp que corresponde a una expresión de Maxima? Quizá eso me ayudaría. > Espero haber arrojado alguna luz sobre el tema. Pues sí. Muchas gracias. -- Departemento pri Statistiko kaj Plejbonigo, kaj Matematika Didaktiko Universitato Oviedo - EUITIndus 33203 Hispanio - 2:343/107.6@fidonet |