Interprete specifica del blocco di codice in Org Babel


13

È 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?


2
Intendi, ad esempio, diverse versioni del software installato, ad esempio python26, python27 e python3? O solo sessioni di Python uniche, ma tutte usando lo stesso eseguibile? @dgtized spiega quest'ultimo.
mankoff,

2
Intendo versioni diverse del software installato, ovvero utilizzo di eseguibili diversi.
cefstat,

Risposte:


10

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ò.


2
C'è un org-babel-post-tangle-hook. Qualcuno dovrebbe implementare a org-babel-pre-tangle-hook.
mankoff,

1
Non ho molta familiarità con gli interni, ma non sono sicuro che il groviglio sarebbe la fase appropriata per fare questo cambiamento? Onestamente, sembra che il blocco abbia bisogno di una :interpreterproprietà.
dgtized

2
Neanche io ne ho troppa familiarità. Sì :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.
mankoff,

1
Grazie @dgtized e @mankoff per le tue risposte. Mi hanno indicato la giusta direzione. È stato un mio errore non aver specificato che ero interessato al codice javascript. In base alle tue risposte ho deciso di aggiungere :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.
cefstat,

@cefstat Ho notato :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?
dgtized

1

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.


2
Buona risposta in teoria, ma non risponde alla domanda.
mankoff,

1

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.