En org-mode
, estoy tratando de definir una función, una variable, y luego asignar a otra variable el resultado de la llamada a la función en la primera variable. Sin embargo, parece que no puedo usar esta nueva variable en llamadas de funciones posteriores.
La inclusión de las llamadas de función funciona, pero afectar primero el valor de una variable permitiría una depuración más rápida en caso de que algo salga mal en la primera llamada de función, y evitar duplicar cálculos potencialmente costosos.
MWE: (usar (require 'ob-emacs-lisp)
si es necesario)
#+name: square
#+begin_src emacs-lisp :var x=3
(message (format "%s" (* x x)))
#+end_src
#+RESULTS: square
: 9
#+name: value
: 45
#+name: squaredvalue
#+call: square(x=value)
#+RESULTS: squaredvalue
: 2025
Now I try to reuse this value:
#+begin_src emacs-lisp :var res=squaredvalue
(message res)
#+end_src
#+RESULTS:
: nil
Inlined calls do work:
#+begin_src emacs-lisp :var res=square(value)
(message res)
#+end_src
#+RESULTS:
: 2025
Expandir el segundo bloque de código muestra:
(let ((res (quote "nil")))
(message res))
¿Qué me estoy perdiendo?
(Esto ha sido probado en emacs 24.3.1, 24.4 y 24.5, usando org 8.2.10)
Respuestas:
Explícitamente agregue nuevo
#+name:
sobre el#+results:
bloque.fuente
#+name:
antes de la#+call:
línea, por lo que no agrega ninguna contabilidad al proceso: solo nombra los resultados en lugar de la definición. Tal vez no se siente tan natural como podría, pero al menos eso no es una solución alternativa.-result
no arroje resultados. Agregue una nota de que se requiere nombrar la llamada y que el nombre del resultado debe ser el nombre de la llamada con el sufijo-result
. Al menos eso es lo que noté. (Si no se le asigna un nombre a la llamada, la próxima reevaluación agregará un nuevo resultado ignorando el resultado con nombre existente.-result
es solo una convención de nombres que utilicé para este ejemplo. Si está buscando explícitamente los resultados de un bloque fuente, agregue()
el nombre al pasar el nombre como variable a otro bloque o dentro de una referencia noweb.#+call
se nombre el. El nombre del resultado puede elegirse arbitrariamente. Si la llamada no se nombra, la llamada genera una línea de resultado sin nombre adicional.Puede usar una
:post
rutina que genera el resultado como:name
. Llama a tu bloque de babel con esta rutina de publicación y coloca el resultado en un cajón. En el siguiente ejemplo, se nombra esta rutina de publicaciónasValue
.Otra forma de evitar volver a calcular los bloques de código es el
:cache
argumento del encabezado. Si se establece enyes
el bloque de código y se verifican los cambios en sus argumentos y si no hay cambios, el resultado anterior se usa sin una reevaluación del bloque de código fuente.fuente
:cache yes
) es la solución estándar. También se describe en el manual de organización (consulte la sección 14.8.2.16:cache'). It is a pity that it does not smoothly work with
# + call. I think this is a bug. The first solution works with
# + call` y también tiene la ventaja de que desacopla por completo los bloques de código. Incluso si edita el primer bloque de código y prueba el segundo, el primero no se evalúa (en función de la tarea que puede ser una ventaja o un disatvantage Sólo hay que tenerlo en cuenta..).Sospecho que solo necesita actualizar su modo Org. Esto funciona en mi extremo (versión de desarrollo actual de Org) y, en general, debería funcionar a partir de la etiqueta
release_8.3beta
. A continuación se muestra la confirmación que creo soluciona el problema que está describiendo.Además de cargar Org desde el repositorio de git, otra opción para ejecutar una versión más nueva es instalar el paquete ELPA .
fuente
;)
Para ser precisos, miorg-version
es 8.2.10. He editado la pregunta con esta información, donde debería haber estado en primer lugar.