অর্গ মোডে আমি দুটি সাধারণ কোড ব্লকে একটি সাধারণ কোড ব্লক অন্তর্ভুক্ত করতে পারি?


12

org-modeথেকে বিভিন্ন সারাংশ বের করতে আমার কাছে একটি ফাইলের টেবিল এবং দুটি পাইথন কোড ব্লক রয়েছে।

আমি এই দুটি কোড ব্লকের মধ্যে কিছু সাধারণ ধ্রুবক এবং ফাংশন ভাগ করতে চাই। আদর্শভাবে, আমি সাধারণ কোডটি একটি পৃথক কোড ব্লকে প্রমাণ করে এটি করব, যা অন্য দুটি ব্লকের যে কোনও একটিকে যখন মূল্যায়ন করা হয় তখন স্বয়ংক্রিয়ভাবে অন্তর্ভুক্ত এবং মূল্যায়ন করা হবে। মেড-আপ সিনট্যাক্সে, এটি নিম্নলিখিতগুলির মতো কিছু দেখায়:

#+NAME: init_block
#+BEGIN_SRC python
  ... common constants and functions here ...
#+END_SRC

#+NAME: summary_1
#+BEGIN_SRC python :prepend init_block
  ... data-processing code depending on init code goes here ...
#+END_SRC

#+NAME: summary_2
#+BEGIN_SRC python :prepend init_block
  ... more processing which also depends on init code ...
#+END_SRC

আমি মনে করি আমি :sessionবিকল্পটি ব্যবহার করতে পারতাম , তবে দুটি কারণে আমি পছন্দ করতে চাই না। প্রথমত, এটি একটি রাষ্ট্রীয় সিস্টেম সেটআপ করে, যা আমি যখনই C-c C-cকোনও কোড ব্লকে ব্যবহার করি প্রতিবার স্ক্র্যাচ থেকে চালিত হয় । দ্বিতীয়ত, এবং সম্পর্কিতভাবে, এখন আমি ফাইলটি খোলার সাথে সাথে সাধারণ আরম্ভের কোডটি ম্যানুয়ালি মূল্যায়ন করতে হবে: আমি কেবল ডেটা টেবিলটি আপডেট করতে পারি না, সংক্ষিপ্তসারগুলির একটিতে যেতে পারি এবং C-c C-cএটি আপডেট করতে আঘাত করি।

এটি করার কোনও ভাল উপায় আছে?

উত্তর:


15

সাহিত্যের প্রোগ্রামিংয়ের জন্য আপনি org- babel এর নব রেফারেন্স সিনট্যাক্সটি ব্যবহার করে এটি খুব সহজেই করতে পারেন । এখানে একটি উদাহরণ:

* Initialization block containing function definition
#+NAME: init_block
#+BEGIN_SRC python
  constant=19
  def some_function(x):
    return constant * x
#+END_SRC

* Call the function on an integer
#+BEGIN_SRC python :noweb yes 
  <<init_block>>
  return some_function(13)
#+END_SRC

#+RESULTS:
: 247

* Call the function on a string
:PROPERTIES:
:noweb:    yes
:END:

#+BEGIN_SRC python
  <<init_block>>
  return some_function('abc')
#+END_SRC

#+RESULTS:
: abcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabcabc

ধন্যবাদ. এটি দুর্দান্ত দেখায়, আমার হ্যাকিশ সমাধানের চেয়ে অনেক ভাল। আমি আগামী কয়েক দিনের মধ্যে এটি চেষ্টা করে দেখব এবং আমার কোনও সমস্যা আছে কিনা।
জন ও।

@JonO। ধন্যবাদ - যদি এই উত্তর আপনার জন্য কাজ করে তারপর আপনি দয়া করে এটা সঠিক মেনে নেবেন
অবচিত

4

আরও কিছু চিন্তা করার পরে আমি এই সমস্যার একটি আংশিক সমাধান পেয়েছি। এটি ব্যবহার করে :session, তবে আমি কমপক্ষে নিশ্চিত করতে পারি যে সাধারণ সূচনা কোডটি সর্বদা অন্য ব্লকের একটিকে মূল্যায়নের আগে স্বয়ংক্রিয়ভাবে চালিত হয়। কৌশলটি হ'ল একটি ডামি শিরোলেখ পরিবর্তনশীল ব্যবহার করা যা শিরোনাম ব্লককে বোঝায়, যার ফলে এটি প্রতিবার মূল্যায়ন করা হয়:

#+NAME: init_block
#+BEGIN_SRC python :session t
  constant=19
  def some_function(x):
    return constant * x
#+END_SRC

#+BEGIN_SRC python :session t :var dummy=init_block
some_function(13)
#+END_SRC

#+RESULTS:
: 247

এখন আমি সংজ্ঞাগুলিতে পরিবর্তন করতে পারি init_blockএবং যখনই অন্য কোনও ব্লক ব্যবহার করে যা এটি ব্যবহার করে :var dummy=init_blockতা মূল্যায়ন করা হয় তা স্বয়ংক্রিয়ভাবে পুনরায় মূল্যায়ন করতে পারি । এটি init_blockএমনভাবে কার্যকরভাবে কাজ করে যে সংজ্ঞাগুলি আদর্শবান এবং রাষ্ট্রহীন provided

(দ্রষ্টব্য যে পাইথন ব্লকগুলি :sessionমোডে পরিবর্তন করার সময় আপনাকে কোনও returnবিবৃতি সরিয়ে ফেলতে হবে , যা ব্লক থেকে কোনও মান ফেরত দেওয়ার জন্য কার্যকরী মোডে প্রয়োজন)।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.