È possibile avere, nello stesso file org, due blocchi di codice nella stessa lingua che vengono eseguiti in interpreti diversi specificando opzioni diverse nella parte superiore del blocco di codice?
È possibile avere, nello stesso file org, due blocchi di codice nella stessa lingua che vengono eseguiti in interpreti diversi specificando opzioni diverse nella parte superiore del blocco di codice?
Risposte:
La domanda originale è stata modificata per riguardare l'esecuzione di più versioni di un eseguibile e non semplicemente di interpreti indipendenti.
Usando find-libraryho ispezionato la fonte di ob-ruby, che include questo codice:
(defvar org-babel-ruby-command "ruby"
"Name of command to use for executing ruby code.")
Ho visto riferimenti altrove per l'utilizzo di Python org-babel-python-command, quindi esiste in alcune altre lingue, controlla il ob-$langsupporto appropriato per vedere.
Ciò consente di lavorare come segue:
#+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]
Questo potrebbe essere combinato con :session python3e :session python2per evitare di chiamare elisp prima di ogni blocco. Sembra che ci dovrebbe essere un modo più semplice per farlo però.
org-babel-post-tangle-hook. Qualcuno dovrebbe implementare a org-babel-pre-tangle-hook.
:interpreterproprietà.
:interpreterha senso. Ma org-babel-post-tangle-hookviene eseguito dopo l'esecuzione del codice C-c C-cin un blocco di codice. Presumo che preverrebbe eseguito prima dell'esecuzione del codice. Ma ora mi rendo conto che se si modifica una variabile globale, si avrebbero effetti collaterali negativi. :interpretersarebbe meglio.
:interpreterun'opzione a org-babel-execute:js. Ma poi esaminando la fonte org-babel-execute:jsho scoperto che esiste già :cmdun'opzione che fa esattamente quello che voglio. Sfortunatamente, :cmdnon è disponibile per tutte le lingue e non ho trovato alcuna documentazione per ob-jscui inizialmente mi mancava :cmdl'esistenza.
:cmd, ma sembrava che fosse usato solo per aggiungere argomenti al comando interprete. Potresti rispondere alla tua domanda con un esempio completo che mostra l'uso di :cmdper risolvere il problema per coloro che hanno questo problema in futuro?
Credo di default che ogni blocco funzioni in un interprete indipendente anche se è la stessa lingua. Il comportamento potrebbe essere diverso per alcune lingue. Ad esempio, non sono sicuro che i blocchi emacs-lisp supportino la proprietà della sessione.
#+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
I primi due blocchi usano interpreti indipendenti, ma il terzo e il quarto blocco condividono una sessione :foo, in modo che valutino nello stesso interprete.
Si scopre che più quasi tutte le lingue supportate da Org Babel non hanno possibilità di utilizzare un interprete diverso per un blocco di codice specifico. Un'eccezione notevole (e quella che mi interessa) è Javascript. In questo caso si può usare l' :cmdopzione.
L'interprete JS standard è node, come definito nella variabile org-babel-js-cmd. Per eseguire un blocco di codice specifico attraverso un interprete diverso, passare l' :cmdopzione come nell'esempio seguente.
#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src