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-librarysaya 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-$langdukungan 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 python3dan :session python2untuk 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.
:interpreterproperti.
:interpretermasuk akal. Tetapi org-babel-post-tangle-hookberjalan setelah eksekusi kode melalui C-c C-cdalam blok kode. Saya berasumsi preakan berjalan sebelum eksekusi kode. Tetapi saya menyadari sekarang jika mengubah variabel global, itu akan memiliki efek samping yang buruk. :interpreterakan lebih baik.
:interpreteropsi org-babel-execute:js. Tetapi kemudian melalui sumber untuk org-babel-execute:jssaya menemukan bahwa sudah ada :cmdopsi yang melakukan apa yang saya inginkan. Sayangnya, :cmdtidak tersedia untuk semua bahasa dan saya juga tidak menemukan dokumentasi untuk ob-jsjadi saya awalnya merindukan :cmdkeberadaan.
:cmd, tapi sepertinya itu hanya digunakan untuk menambahkan argumen ke perintah interpreter. Bisakah Anda menjawab pertanyaan Anda sendiri dengan contoh lengkap yang menunjukkan penggunaan :cmduntuk 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 :cmdopsi.
Penerjemah JS standar adalah node, sebagaimana didefinisikan dalam variabel org-babel-js-cmd. Untuk menjalankan blok kode tertentu melalui penerjemah yang berbeda, lewati :cmdopsi seperti pada contoh berikut.
#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src