Ist es möglich, in derselben Organisationsdatei zwei Codeblöcke in derselben Sprache zu haben, die in verschiedenen Interpretern ausgeführt werden, indem am oberen Rand des Codeblocks verschiedene Optionen angegeben werden?
Ist es möglich, in derselben Organisationsdatei zwei Codeblöcke in derselben Sprache zu haben, die in verschiedenen Interpretern ausgeführt werden, indem am oberen Rand des Codeblocks verschiedene Optionen angegeben werden?
Antworten:
Die ursprüngliche Frage wurde dahingehend geändert, dass mehrere Versionen einer ausführbaren Datei ausgeführt werden und nicht nur unabhängige Interpreter.
Unter Verwendung von habe find-library
ich die Quelle von überprüft ob-ruby
, die diesen Code enthält:
(defvar org-babel-ruby-command "ruby"
"Name of command to use for executing ruby code.")
Ich habe Referenzen für Python an anderer Stelle gesehen org-babel-python-command
, daher gibt es diese in einigen anderen Sprachen ob-$lang
.
Dies ermöglicht Folgendes:
#+begin_src emacs-lisp :results none
(setq org-babel-python-command "python3")
#+end_src
#+begin_src python :results output
import sys
print(sys.version)
#+end_src
#+RESULTS:
: 3.4.0 (default, Apr 11 2014, 13:05:11)
: [GCC 4.8.2]
#+begin_src emacs-lisp :results none
(setq org-babel-python-command "python2")
#+end_src
#+begin_src python :results output
import sys
print(sys.version)
#+end_src
#+RESULTS:
: 2.7.6 (default, Mar 22 2014, 22:59:56)
: [GCC 4.8.2]
Dies könnte mit :session python3
und kombiniert werden :session python2
, um einen Aufruf von elisp vor jedem Block zu vermeiden. Es scheint jedoch, dass es einen einfacheren Weg geben sollte, dies zu tun.
org-babel-post-tangle-hook
. Jemand sollte das umsetzen org-babel-pre-tangle-hook
.
:interpreter
Eigenschaft zu benötigen .
:interpreter
macht Sinn. Läuft aber org-babel-post-tangle-hook
nach der Codeausführung über C-c C-c
in einem Codeblock. Ich gehe davon aus, pre
dass vor der Codeausführung ausgeführt würde. Aber mir ist jetzt klar, dass das Ändern einer globalen Variablen schlimme Nebenwirkungen hätte. :interpreter
wäre besser.
:interpreter
Option hinzuzufügen org-babel-execute:js
. Aber als ich dann die Quelle durchging, stellte org-babel-execute:js
ich fest, dass es bereits eine :cmd
Option gibt, die genau das tut, was ich will. Leider :cmd
ist nicht für alle Sprachen verfügbar und ich habe auch keine Dokumentation dafür gefunden, ob-js
so dass ich anfangs die :cmd
Existenz verpasst habe .
:cmd
, aber es sah so aus, als würde es nur zum Anhängen von Argumenten an den Interpreter-Befehl verwendet. Könnten Sie bitte Ihre eigene Frage anhand eines vollständigen Beispiels beantworten, das die Verwendung von :cmd
zur Lösung des Problems für diejenigen zeigt, bei denen dieses Problem in Zukunft auftritt?
Ich glaube, dass standardmäßig jeder Block in einem unabhängigen Interpreter ausgeführt wird, auch wenn es sich um dieselbe Sprache handelt. Das Verhalten kann für einige Sprachen unterschiedlich sein. Ich bin mir zum Beispiel nicht sicher, ob Emacs-Lisp-Blöcke die Session-Eigenschaft unterstützen.
#+BEGIN_SRC ruby
a = "foo"
#+END_SRC
#+RESULTS:
: foo
#+BEGIN_SRC ruby
a ||= "bar"
#+END_SRC
#+RESULTS:
: bar
#+BEGIN_SRC ruby :session foo
a ||= "session foo"
#+END_SRC
#+RESULTS:
: session foo
#+BEGIN_SRC ruby :session foo
a += " with bar"
#+END_SRC
#+RESULTS:
: session foo with bar
Die ersten beiden Blöcke verwenden unabhängige Interpreter, der dritte und vierte Block teilen sich jedoch eine Sitzung :foo
, sodass sie im selben Interpreter auswerten.
Es stellt sich heraus, dass es für fast alle von Org Babel unterstützten Sprachen keine Möglichkeit gibt, einen anderen Interpreter für einen bestimmten Codeblock zu verwenden. Eine bemerkenswerte Ausnahme (und die, die mich interessiert) ist Javascript. In diesem Fall kann man die :cmd
Option verwenden.
Der Standard-JS-Interpreter ist node
wie in der Variablen definiert org-babel-js-cmd
. Um einen bestimmten Codeblock über einen anderen Interpreter auszuführen, übergeben Sie die :cmd
Option wie im folgenden Beispiel.
#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src