Penerjemah khusus kode-blok di Org Babel

13

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?

cefstat
sumber
2
Maksud Anda, misalnya, berbagai versi perangkat lunak yang diinstal, misalnya python26, python27, dan python3? Atau hanya sesi python unik, tetapi semua menggunakan executable yang sama? @dgtized menjelaskan yang terakhir.
mankoff
2
Maksud saya berbagai versi perangkat lunak yang diinstal, yaitu, menggunakan berbagai executable.
cefstat

Jawaban:

10

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.

dgtized
sumber
2
Ada a org-babel-post-tangle-hook. Seseorang harus menerapkan pada org-babel-pre-tangle-hook.
mankoff
1
Saya tidak terlalu akrab dengan bagian dalam, tetapi saya tidak yakin bahwa kekusutan akan menjadi fase yang tepat untuk melakukan perubahan ini? Sejujurnya, sepertinya blok itu membutuhkan :interpreterproperti.
dgtized
2
Saya juga tidak terlalu akrab dengannya. Ya :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.
mankoff
1
Terima kasih @dgtized dan @mankoff atas jawaban Anda. Mereka mengarahkan saya ke arah yang benar. Ini adalah kesalahan saya bahwa saya tidak menentukan bahwa saya tertarik pada kode javascript. Berdasarkan jawaban Anda, saya memutuskan untuk menambahkan :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.
cefstat
@cefstat saya catat :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?
dgtized
1

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.

dgtized
sumber
2
Jawaban yang bagus secara teori, tetapi tidak menjawab pertanyaan.
mankoff
1

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
cefstat
sumber