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?
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?
Yanıtlar:
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-library
kaynağı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-$lang
gö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 python3
ve ile birleştirilebilir :session python2
. Yine de bunu yapmanın daha basit bir yolu olmalı gibi görünüyor.
org-babel-post-tangle-hook
. Birisi uygulamalıdır org-babel-pre-tangle-hook
.
:interpreter
mülke ihtiyacı var gibi görünüyor .
:interpreter
mantıklı. Ancak bir kod bloğunda org-babel-post-tangle-hook
üzerinden kod yürütme sonra çalışır C-c C-c
. pre
Kod 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. :interpreter
Daha iyi olurdu.
:interpreter
seçenek eklemeye karar verdim org-babel-execute:js
. Ama sonra kaynağın üzerinden geçerek, tam olarak istediğimi yapan org-babel-execute:js
bir :cmd
seçenek olduğunu buldum. Ne yazık ki, :cmd
tüm diller için mevcut değildir ve aynı zamanda ob-js
başlangıçta :cmd
varlığını kaçırdığım için herhangi bir belge bulamadım .
:cmd
, ama sadece yorumlayıcı komutuna argüman eklemek için kullanılmış gibi görünüyordu. :cmd
Gelecekte bu sorunu yaşayanlar için sorunu çözmek için nasıl kullanıldığını gösteren tam bir örnekle kendi sorunuzu cevaplayabilir misiniz ?
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.
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 :cmd
seçenek kullanılabilir.
node
Değ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 :cmd
iç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