ล่ามเฉพาะรหัสบล็อกใน Org Babel


13

เป็นไปได้หรือไม่ว่าในไฟล์ org เดียวกันนั้นโค้ดบล็อกสองอันในภาษาเดียวกันที่รันในล่ามที่ต่างกันโดยการระบุตัวเลือกต่าง ๆ ที่ด้านบนสุดของบล็อคโค้ด


2
คุณหมายถึงตัวอย่างเช่นซอฟต์แวร์ที่ติดตั้งเวอร์ชันต่าง ๆ เช่น python26, python27 และ python3 หรือไม่? หรือเพียงแค่ไพ ธ อนเซสชันที่ไม่ซ้ำกัน แต่ทั้งหมดใช้การปฏิบัติการแบบเดียวกัน @dgtized อธิบายหลัง
mankoff

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เพื่อหลีกเลี่ยงการเรียก elisp ก่อนแต่ละบล็อก ดูเหมือนว่าควรมีวิธีที่ง่ายกว่าในการทำเช่นนี้


2
org-babel-post-tangle-hookมีความเป็น org-babel-pre-tangle-hookใครบางคนที่ควรใช้
mankoff

1
ฉันไม่คุ้นเคยกับ internals มากนัก แต่ฉันไม่แน่ใจว่าการพันกันจะเป็นช่วงที่เหมาะสมในการเปลี่ยนแปลงนี้หรือไม่ สุจริตดูเหมือนว่าบล็อกต้องการ: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

ฉันเชื่อว่าโดยค่าเริ่มต้นแต่ละบล็อกจะทำงานในล่ามอิสระแม้ว่าจะเป็นภาษาเดียวกัน พฤติกรรมอาจแตกต่างกันไปในบางภาษา ตัวอย่างเช่นฉันไม่แน่ใจว่าบล็อก emacs-lisp สนับสนุนคุณสมบัติเซสชัน

#+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
คำตอบที่ดีในทฤษฎี แต่ไม่ตอบคำถาม
mankoff

1

ปรากฎว่าเกือบทุกภาษาสนับสนุนโดย Org Babel ไม่มีตัวเลือกในการใช้ล่ามที่แตกต่างกันสำหรับบล็อกโค้ดเฉพาะ ข้อยกเว้นหนึ่งที่น่าสังเกต (และที่ฉันสนใจ) คือ Javascript ในกรณีนี้เราสามารถใช้:cmdตัวเลือก

มาตรฐาน JS ล่ามที่กำหนดไว้ในตัวแปร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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.