Org Babel में कोड-ब्लॉक विशिष्ट दुभाषिया


13

क्या यह संभव है कि एक ही ऑर्ग फाइल में, एक ही भाषा में दो कोड ब्लॉक हों जो कोड ब्लॉक के शीर्ष पर विभिन्न विकल्पों को निर्दिष्ट करके विभिन्न दुभाषियों में चलाए जाते हैं?


2
क्या आपका मतलब है, उदाहरण के लिए, स्थापित सॉफ़्टवेयर के विभिन्न संस्करण, उदाहरण के लिए python26, python27 और python3? या सिर्फ अद्वितीय अजगर सत्र, लेकिन सभी एक ही निष्पादन योग्य का उपयोग कर रहे हैं? @dgtized बाद वाले बताते हैं।
13

2
मेरा मतलब है अलग-अलग निष्पादनों का उपयोग करके, स्थापित सॉफ़्टवेयर के विभिन्न संस्करण।
cefstat

जवाबों:


10

मूल प्रश्न को एक निष्पादन योग्य के कई संस्करणों को चलाने की चिंता के लिए संशोधित किया गया है, और केवल स्वतंत्र दुभाषियों को नहीं।

का उपयोग करके find-libraryमैंने उस स्रोत का निरीक्षण किया ob-ruby, जिसमें यह कोड शामिल है:

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

मैंने अजगर का उपयोग करने के लिए कहीं और संदर्भ देखा है org-babel-python-command, इसलिए यह कुछ अन्य भाषाओं में मौजूद है, देखने के लिए उपयुक्त ob-$langसमर्थन की जांच करें ।

यह निम्नलिखित कार्य करने की अनुमति देता है:

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

इसके साथ जोड़ा जा सकता है :session python3और :session python2प्रत्येक ब्लॉक से पहले कॉल करने से बचने के लिए। ऐसा लगता है कि ऐसा करने का एक सरल तरीका होना चाहिए।


2
वहाँ एक है org-babel-post-tangle-hook। किसी को लागू करना चाहिए org-babel-pre-tangle-hook
मैनकॉफ़

1
मैं इंटर्नल से बहुत परिचित नहीं हूं, लेकिन मुझे यकीन नहीं है कि इस बदलाव को करने के लिए टेंगलिंग उपयुक्त चरण होगा? ईमानदारी से, ऐसा लगता है कि ब्लॉक को एक :interpreterसंपत्ति की आवश्यकता है।
dgtized

2
मैं भी इससे परिचित नहीं हूँ। हाँ :interpreterसमझ में आता है। लेकिन एक कोड ब्लॉक में org-babel-post-tangle-hookकोड निष्पादन के बाद चलता है C-c C-c। मुझे लगता है preकि कोड निष्पादन से पहले चला जाएगा। लेकिन मुझे अब एहसास हुआ कि अगर एक वैश्विक चर को बदलते हुए, तो इसके बुरे प्रभाव होंगे। :interpreterबेहतर होगा।
mankoff

1
आपके जवाब के लिए @dgtized और @mankoff का शुक्रिया। उन्होंने मुझे सही दिशा की ओर इशारा किया। यह मेरी गलती थी कि मैंने निर्दिष्ट नहीं किया था कि मुझे जावास्क्रिप्ट कोड में दिलचस्पी थी। आपके उत्तरों के आधार पर मैंने एक :interpreterविकल्प जोड़ने का फैसला किया org-babel-execute:js। लेकिन तब org-babel-execute:jsमैंने स्रोत के माध्यम से जाना कि मैंने पहले से ही एक :cmdविकल्प है जो वास्तव में वही करता है जो मैं चाहता हूं। दुर्भाग्य से, :cmdसभी भाषाओं के लिए उपलब्ध नहीं है और मुझे इसके लिए कोई दस्तावेज भी नहीं मिला, ob-jsइसलिए मैं शुरू में :cmdअस्तित्व से चूक गया था।
cefstat

@cefstat मैंने नोट किया :cmd, लेकिन ऐसा लग रहा था कि इसका उपयोग केवल दुभाषिया कमांड को तर्क देने के लिए किया गया था। क्या आप अपने स्वयं के प्रश्न का उत्तर पूर्ण उदाहरण के साथ दे सकते हैं :cmd, जो भविष्य में इस मुद्दे के लिए समस्या को हल करने का उपयोग दिखा रहा है ?
dgtized

1

मेरा मानना ​​है कि डिफ़ॉल्ट रूप से प्रत्येक ब्लॉक एक स्वतंत्र दुभाषिया में चलता है, भले ही यह एक ही भाषा हो। कुछ भाषाओं के लिए व्यवहार भिन्न हो सकता है। उदाहरण के लिए, मुझे यकीन नहीं है कि एमएसीएस-लिस्प ब्लॉक सत्र संपत्ति का समर्थन करते हैं।

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

पहले दो ब्लॉक स्वतंत्र दुभाषियों का उपयोग करते हैं, लेकिन तीसरा और चौथा ब्लॉक एक सत्र साझा करते हैं :foo, ताकि वे एक ही दुभाषिया में मूल्यांकन करें।


2
सिद्धांत में अच्छा जवाब है, लेकिन सवाल का जवाब नहीं है।
मैनकॉफ़

1

यह पता चला है कि Org Babel द्वारा समर्थित लगभग सभी भाषाओं में एक विशिष्ट कोड-ब्लॉक के लिए एक अलग दुभाषिया का उपयोग करने का कोई विकल्प नहीं है। एक उल्लेखनीय अपवाद (और एक जो मेरी दिलचस्पी है) जावास्क्रिप्ट है। इस मामले में कोई भी :cmdविकल्प का उपयोग कर सकता है।

मानक जेएस दुभाषिया है node, जैसा कि चर में परिभाषित किया गया है org-babel-js-cmd। एक अलग कोड दुभाषिया के माध्यम से एक विशिष्ट कोड ब्लॉक चलाने के :cmdलिए निम्न उदाहरण में विकल्प पास करें ।

#+begin_src js :cmd "/usr/bin/osascript -l JavaScript"
app = Application.currentApplication()
app.includeStandardAdditions = true
app.say("Hello")
#+end_src
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.