È 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-library
ho 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-$lang
supporto 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 python3
e :session python2
per 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
.
:interpreter
proprietà.
:interpreter
ha senso. Ma org-babel-post-tangle-hook
viene eseguito dopo l'esecuzione del codice C-c C-c
in un blocco di codice. Presumo che pre
verrebbe eseguito prima dell'esecuzione del codice. Ma ora mi rendo conto che se si modifica una variabile globale, si avrebbero effetti collaterali negativi. :interpreter
sarebbe meglio.
:interpreter
un'opzione a org-babel-execute:js
. Ma poi esaminando la fonte org-babel-execute:js
ho scoperto che esiste già :cmd
un'opzione che fa esattamente quello che voglio. Sfortunatamente, :cmd
non è disponibile per tutte le lingue e non ho trovato alcuna documentazione per ob-js
cui inizialmente mi mancava :cmd
l'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 :cmd
per 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' :cmd
opzione.
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' :cmd
opzione come nell'esempio seguente.
#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src