Mungkinkah memiliki, dalam file org yang sama, dua blok kode dalam bahasa yang sama yang dijalankan dalam interpreter yang berbeda dengan menentukan opsi yang berbeda di bagian atas blok kode?
Mungkinkah memiliki, dalam file org yang sama, dua blok kode dalam bahasa yang sama yang dijalankan dalam interpreter yang berbeda dengan menentukan opsi yang berbeda di bagian atas blok kode?
Jawaban:
Pertanyaan asli telah dimodifikasi agar menyangkut menjalankan beberapa versi yang dapat dieksekusi, dan bukan hanya penerjemah independen.
Dengan menggunakan find-library
saya memeriksa sumber ob-ruby
, yang mencakup kode ini:
(defvar org-babel-ruby-command "ruby"
"Name of command to use for executing ruby code.")
Saya telah melihat referensi di tempat lain untuk menggunakan python org-babel-python-command
, jadi ada dalam beberapa bahasa lain, periksa ob-$lang
dukungan yang sesuai untuk dilihat.
Ini memungkinkan yang berikut ini berfungsi:
#+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]
Ini dapat dikombinasikan dengan :session python3
dan :session python2
untuk menghindari memanggil elisp sebelum setiap blok. Sepertinya memang ada cara yang lebih sederhana untuk melakukan ini.
org-babel-post-tangle-hook
. Seseorang harus menerapkan pada org-babel-pre-tangle-hook
.
:interpreter
properti.
:interpreter
masuk akal. Tetapi org-babel-post-tangle-hook
berjalan setelah eksekusi kode melalui C-c C-c
dalam blok kode. Saya berasumsi pre
akan berjalan sebelum eksekusi kode. Tetapi saya menyadari sekarang jika mengubah variabel global, itu akan memiliki efek samping yang buruk. :interpreter
akan lebih baik.
:interpreter
opsi org-babel-execute:js
. Tetapi kemudian melalui sumber untuk org-babel-execute:js
saya menemukan bahwa sudah ada :cmd
opsi yang melakukan apa yang saya inginkan. Sayangnya, :cmd
tidak tersedia untuk semua bahasa dan saya juga tidak menemukan dokumentasi untuk ob-js
jadi saya awalnya merindukan :cmd
keberadaan.
:cmd
, tapi sepertinya itu hanya digunakan untuk menambahkan argumen ke perintah interpreter. Bisakah Anda menjawab pertanyaan Anda sendiri dengan contoh lengkap yang menunjukkan penggunaan :cmd
untuk memecahkan masalah bagi mereka yang memiliki masalah ini di masa mendatang?
Saya percaya secara default setiap blok berjalan dalam penerjemah independen bahkan jika itu bahasa yang sama. Perilaku ini mungkin berbeda untuk beberapa bahasa. Sebagai contoh, saya tidak yakin blok emacs-lisp mendukung properti sesi.
#+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
Dua blok pertama menggunakan penerjemah independen, tetapi blok ketiga dan keempat berbagi sesi :foo
, sehingga mereka mengevaluasi dalam juru bahasa yang sama.
Ternyata hampir semua bahasa yang didukung oleh Org Babel tidak ada pilihan untuk menggunakan juru bahasa yang berbeda untuk blok kode tertentu. Satu pengecualian penting (dan satu yang menarik minat saya) adalah Javascript. Dalam hal ini orang dapat menggunakan :cmd
opsi.
Penerjemah JS standar adalah node
, sebagaimana didefinisikan dalam variabel org-babel-js-cmd
. Untuk menjalankan blok kode tertentu melalui penerjemah yang berbeda, lewati :cmd
opsi seperti pada contoh berikut.
#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src