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-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.
org-babel-post-tangle-hook. Birisi uygulamalıdır org-babel-pre-tangle-hook.
:interpretermülke ihtiyacı var gibi görünüyor .
: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.
: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 .
: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 ?
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 :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