In org-mode
versuche ich, eine Funktion, eine Variable, zu definieren und dann das Ergebnis des Funktionsaufrufs für die erste Variable einer anderen Variablen zuzuweisen. Dann scheint es jedoch, dass ich diese neue Variable nicht in nachfolgenden Funktionsaufrufen verwenden kann.
Das Inlinen der Funktionsaufrufe funktioniert, aber wenn Sie zuerst den Wert einer Variablen beeinflussen, können Sie schneller debuggen, falls beim ersten Funktionsaufruf etwas schief geht, und um zu vermeiden, dass potenziell teure Berechnungen dupliziert werden.
MWE: ( (require 'ob-emacs-lisp)
bei Bedarf verwenden)
#+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
Das Erweitern des zweiten Codeblocks zeigt:
(let ((res (quote "nil")))
(message res))
Was vermisse ich?
(Dies wurde auf Emacs 24.3.1, 24.4 und 24.5 unter Verwendung von org 8.2.10 getestet.)
Antworten:
Fügen Sie explizit neu
#+name:
über dem#+results:
Block hinzu.quelle
#+name:
vor der#+call:
Zeile eigentlich nicht erforderlich , sodass dem Prozess keine Buchhaltung hinzugefügt wird: Benennen Sie einfach die Ergebnisse anstelle der Definition. Vielleicht fühlt es sich nicht so natürlich an, wie es könnte, aber zumindest ist das kein Workaround, um nach einer alternativen Lösung zu betteln.-result
nach keine Ergebnisse liefert. Bitte fügen Sie einen Hinweis hinzu, dass die Benennung des Anrufs erforderlich ist und dass der Name des Ergebnisses der Name des Anrufs sein muss, dem ein Suffix hinzugefügt wird-result
. Zumindest habe ich das bemerkt. (Wenn man den Anruf nicht benennt, fügt die nächste Neubewertung ein neues Ergebnis hinzu, das das vorhandene benannte Ergebnis ignoriert.-result
ist nur eine Namenskonvention, die ich für dieses Beispiel verwendet habe. Wenn Sie explizit nach den Ergebnissen()
eines Quellblocks suchen, fügen Sie den Namen hinzu, wenn Sie den Namen als Variable an einen anderen Block oder innerhalb einer noweb-Referenz übergeben.#+call
Name benannt ist. Der Name des Ergebnisses kann beliebig gewählt werden. Wenn der Anruf nicht benannt ist, wird vom Anruf eine zusätzliche unbenannte Ergebniszeile generiert.Sie können eine
:post
-routine verwenden, die das Ergebnis als ausgibt:name
. Rufen Sie Ihren Babel-Block mit dieser Post-Routine auf und legen Sie das Ergebnis in eine Schublade. Im folgenden Beispiel wird diese Post-Routine benanntasValue
.Eine andere Möglichkeit, eine Neuberechnung von Codeblöcken zu vermeiden, ist das
:cache
Header-Argument. Wenn dies aufyes
den Codeblock gesetzt ist und seine Argumente auf Änderungen überprüft werden und keine Änderungen vorliegen, wird das vorherige Ergebnis ohne Neubewertung des Quellcodeblocks verwendet.quelle
:cache yes
) ist die Standardlösung. Es wird auch im Organisationshandbuch beschrieben (siehe Abschnitt 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` und hat auch den Vorteil, dass es Codeblöcke vollständig entkoppelt. Auch wenn Sie den ersten Codeblock bearbeiten und den zweiten den ersten versuchen wird nicht bewertet. (Abhängig von der Aufgabe, die ein Vorteil oder ein Nachteil sein kann. Sie müssen es nur im Auge behalten.)Ich vermute, Sie müssen nur Ihren Org-Modus aktualisieren. Dies funktioniert auf meiner Seite (aktuelle Entwicklungsversion von Org) und sollte im Allgemeinen ab dem Tag funktionieren
release_8.3beta
. Im Folgenden finden Sie das Commit, das meines Erachtens das von Ihnen beschriebene Problem behebt.Neben dem Laden von Org aus dem Git-Repo besteht eine weitere Option zum Ausführen einer neueren Version darin, das ELPA-Paket zu installieren .
quelle
;)
Um genau zu sein, ist meinorg-version
8.2.10. Ich habe die Frage mit diesen Informationen bearbeitet, wo sie eigentlich hätte sein sollen.