É possível ter, no mesmo arquivo organizacional, dois blocos de código no mesmo idioma que são executados em intérpretes diferentes, especificando opções diferentes na parte superior do bloco de código?
É possível ter, no mesmo arquivo organizacional, dois blocos de código no mesmo idioma que são executados em intérpretes diferentes, especificando opções diferentes na parte superior do bloco de código?
Respostas:
A pergunta original foi modificada para se preocupar em executar várias versões de um executável, e não apenas em intérpretes independentes.
Usando find-library
eu inspecionei a fonte de ob-ruby
, que inclui este código:
(defvar org-babel-ruby-command "ruby"
"Name of command to use for executing ruby code.")
Já vi referências em outros lugares para o uso de python org-babel-python-command
; portanto, ele existe em outras línguas. Verifique o ob-$lang
suporte apropriado para ver.
Isso permite que o seguinte funcione:
#+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]
Isso pode ser combinado com :session python3
e :session python2
para evitar a chamada elisp antes de cada bloco. Parece que deveria haver uma maneira mais simples de fazer isso.
org-babel-post-tangle-hook
. Alguém deve implementar em org-babel-pre-tangle-hook
.
:interpreter
propriedade.
:interpreter
faz sentido. Mas org-babel-post-tangle-hook
é executado após a execução do código C-c C-c
em um bloco de código. Presumo que pre
seria executado antes da execução do código. Mas agora percebo que se alterar uma variável global, teria efeitos colaterais ruins. :interpreter
seria melhor.
:interpreter
opção ao org-babel-execute:js
. Mas depois de pesquisar a fonte org-babel-execute:js
, descobri que já existe uma :cmd
opção que faz exatamente o que eu quero. Infelizmente, :cmd
não está disponível para todos os idiomas e também não encontrei nenhuma documentação, ob-js
então inicialmente perdi :cmd
a existência.
:cmd
, mas parecia que era usado apenas para acrescentar argumentos ao comando intérprete. Você poderia responder à sua própria pergunta com um exemplo completo mostrando o uso de :cmd
para resolver o problema daqueles que tiverem esse problema no futuro?
Acredito que, por padrão, cada bloco é executado em um intérprete independente, mesmo que seja o mesmo idioma. O comportamento pode ser diferente para alguns idiomas. Por exemplo, não tenho certeza de que os blocos emacs-lisp suportem a propriedade session.
#+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
Os dois primeiros blocos usam intérpretes independentes, mas o terceiro e o quarto blocos compartilham uma sessão :foo
, para que sejam avaliados no mesmo intérprete.
Acontece que, quase todos os idiomas suportados pela Org Babel, não há opção para usar um intérprete diferente para um bloco de código específico. Uma exceção notável (e aquela que me interessa) é o Javascript. Nesse caso, pode-se usar a :cmd
opção
O intérprete JS padrão é node
, como definido na variável org-babel-js-cmd
. Para executar um bloco de código específico por meio de um intérprete diferente, passe a :cmd
opção como no exemplo a seguir.
#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src