Org Babel'de kod bloğuna özel tercüman


13

Aynı kuruluş dosyasında, kod bloğunun üstünde farklı seçenekler belirterek farklı tercümanlarda çalıştırılan aynı dilde iki kod bloğuna sahip olmak mümkün müdür?


2
Örneğin, kurulu yazılımın farklı sürümleri, örneğin python26, python27 ve python3'ü mü kastediyorsunuz? Ya da sadece benzersiz python oturumları, ancak hepsi aynı yürütülebilir dosyayı kullanıyor? @ dgtized ikincisini açıklar.
mankoff

2
Yüklü yazılımın farklı sürümlerini, yani farklı yürütülebilir dosyaları kullanarak kastediyorum.
cefstat

Yanıtlar:


10

Orijinal soru, yalnızca bağımsız çevirmenlerin değil, yürütülebilir bir dosyanın birden çok sürümünü çalıştırmakla ilgili olacak şekilde değiştirilmiştir.

Kullanarak bu kodu içeren find-librarykaynağını inceledim ob-ruby:

(defvar org-babel-ruby-command "ruby"
  "Name of command to use for executing ruby code.")

Python kullanmak için başka yerlerde referanslar gördüm org-babel-python-command, bu yüzden başka dillerde var, ob-$langgörmek için uygun desteği kontrol edin .

Bu, aşağıdakilerin çalışmasına izin verir:

#+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]

Bu, her bloktan önce elisp çağrılmasını önlemek için :session python3ve ile birleştirilebilir :session python2. Yine de bunu yapmanın daha basit bir yolu olmalı gibi görünüyor.


2
Bir var org-babel-post-tangle-hook. Birisi uygulamalıdır org-babel-pre-tangle-hook.
mankoff

1
İç kısımlara çok aşina değilim, ama karışıklığın bu değişikliği yapmak için uygun bir aşama olacağından emin değilim? Dürüst olmak gerekirse, bloğun bir :interpretermülke ihtiyacı var gibi görünüyor .
21'de dgtized

2
Ben de buna aşina değilim. Evet :interpretermantıklı. Ancak bir kod bloğunda org-babel-post-tangle-hooküzerinden kod yürütme sonra çalışır C-c C-c. preKod yürütmeden önce çalışacağını varsayıyorum . Ama şimdi küresel bir değişkeni değiştirirsek kötü yan etkilerinin olacağını anlıyorum. :interpreterDaha iyi olurdu.
mankoff

1
Cevaplarınız için @ dgtized ve @mankoff'a teşekkür ederiz. Beni doğru yöne yönlendirdiler. Javascript kodu ile ilgilendiğimi belirtmemiştim benim hatamdı. Cevaplarınıza dayanarak bir :interpreterseçenek eklemeye karar verdim org-babel-execute:js. Ama sonra kaynağın üzerinden geçerek, tam olarak istediğimi yapan org-babel-execute:jsbir :cmdseçenek olduğunu buldum. Ne yazık ki, :cmdtüm diller için mevcut değildir ve aynı zamanda ob-jsbaşlangıçta :cmdvarlığını kaçırdığım için herhangi bir belge bulamadım .
cefstat

@cefstat not ettim :cmd, ama sadece yorumlayıcı komutuna argüman eklemek için kullanılmış gibi görünüyordu. :cmdGelecekte bu sorunu yaşayanlar için sorunu çözmek için nasıl kullanıldığını gösteren tam bir örnekle kendi sorunuzu cevaplayabilir misiniz ?
14'te

1

Varsayılan olarak her blok aynı dilde olsa bile bağımsız bir tercümanda çalışır. Davranış bazı diller için farklı olabilir. Örneğin, emacs-lisp bloklarının session özelliğini desteklediğinden emin değilim.

#+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

İlk iki blok bağımsız tercümanlar kullanır, ancak üçüncü ve dördüncü blok bir oturumu paylaşır :foo, böylece aynı yorumlayıcıda değerlendirirler.


2
Teoride iyi cevap ama soruyu cevaplamıyor.
mankoff

1

Org Babel tarafından desteklenen hemen hemen tüm dillerin, belirli bir kod bloğu için farklı bir tercüman kullanma seçeneği olmadığı ortaya çıkıyor. Dikkate değer bir istisna (ve beni ilgilendiren) Javascript'tir. Bu durumda :cmdseçenek kullanılabilir.

nodeDeğişkende tanımlandığı gibi standart JS yorumlayıcısıdır org-babel-js-cmd. Belirli bir kod bloğunu farklı bir yorumlayıcı aracılığıyla çalıştırmak :cmdiçin aşağıdaki örnekte olduğu gibi seçeneği iletin.

#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.