Dans org-mode
, j'essaie de définir une fonction, une variable, puis d'assigner à une autre variable le résultat de l'appel de fonction sur la première variable. Cependant, il semble que je ne puisse pas utiliser cette nouvelle variable dans les appels de fonctions suivants.
L'insertion des appels de fonction fonctionne, mais affecter d'abord la valeur à une variable permettrait un débogage plus rapide en cas de problème lors du premier appel de fonction et éviterait de dupliquer des calculs potentiellement coûteux.
MWE: (utiliser (require 'ob-emacs-lisp)
si nécessaire)
#+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
L'élargissement du deuxième bloc de code montre:
(let ((res (quote "nil")))
(message res))
Qu'est-ce que je rate?
(Cela a été testé sur emacs 24.3.1, 24.4 et 24.5, en utilisant org 8.2.10)
Réponses:
Ajoutez explicitement de nouveaux éléments
#+name:
au-dessus du#+results:
bloc.la source
#+name:
précéder la#+call:
ligne, donc cela n'ajoute aucune comptabilité au processus: il suffit de nommer les résultats au lieu de la définition. Peut-être que cela ne semble pas aussi naturel que possible, mais au moins ce n'est pas une solution de contournement pour une solution alternative.-result
ne renvoie aucun résultat. Veuillez ajouter que la désignation de l'appel est obligatoire et que le nom du résultat doit être le nom de l'appel suffixé par-result
. C'est du moins ce que j'ai noté. (Si l'on manque de nommer l'appel, la prochaine réévaluation ajoutera un nouveau résultat en ignorant le résultat nommé existant.-result
c'est juste une convention de nommage que j'ai utilisée pour cet exemple. Si vous recherchez explicitement les résultats d'un bloc source, ajoutez-le()
au nom lorsque vous passez le nom en tant que variable à un autre bloc ou dans une référence noweb.#+call
soit nommé. Le nom du résultat peut être choisi arbitrairement. Si l'appel n'est pas nommé, une ligne de résultat supplémentaire sans nom est générée par l'appel.Vous pouvez utiliser une
:post
routine qui génère le résultat sous la forme:name
. Appelez votre babel-block avec cette routine de post et mettez le résultat dans un tiroir. Dans l'exemple suivant, cette routine de publication est nomméeasValue
.Une autre façon d'éviter de recalculer les blocs de code est l'
:cache
argument d'en-tête. Si ce paramètre est défini suryes
le bloc de code et ses arguments sont vérifiés pour les modifications et s'il n'y a pas de modifications, le résultat précédent est utilisé sans réévaluation du bloc de code source.la source
:cache yes
) est la solution standard. Il est également décrit dans le manuel de l'organisation (voir section 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` et présente également l'avantage de découpler complètement les blocs de code. Même si vous éditez le premier bloc de code et essayez le second le premier n'est pas évalué. (Selon la tâche qui peut être un avantage ou un désavantage. Il suffit de garder cela à l'esprit.)Je soupçonne que vous avez juste besoin de mettre à niveau votre mode Org. Cela fonctionne de mon côté (version en cours de développement d'Org) et devrait en général fonctionner à partir de la balise
release_8.3beta
. Vous trouverez ci-dessous le commit qui, je pense, résout le problème que vous décrivez.Outre le chargement d'Org à partir du dépôt git, une autre option pour exécuter une version plus récente consiste à installer le package ELPA .
la source
;)
Pour être précis, monorg-version
est 8.2.10. J'ai édité la question avec cette information, où elle aurait dû être en premier lieu.