Org-babel এর সাহায্যে কীভাবে কোনও ফাংশন কলের ফলাফলের নাম দেওয়া যায় এবং সেগুলি পুনরায় ব্যবহার করা যায়


9

ইন org-mode, আমি একটি ফাংশন, একটি ভেরিয়েবল সংজ্ঞায়িত করার চেষ্টা করছি এবং তারপরে অন্য ভেরিয়েবলকে প্রথম ভেরিয়েবলের উপর ফাংশন কলের ফলাফল নির্ধারণ করে দিচ্ছি। যাইহোক, তারপরে মনে হয় যে পরবর্তী ফাংশন কলগুলিতে আমি এই নতুন পরিবর্তনশীলটি ব্যবহার করতে পারি না।

ফাংশন কলগুলি ইনলাইন করা কাজ করে, তবে প্রথম কোনও ক্রিয়াকলাপে কোনও কিছু ভুল হয়ে যায় এবং সম্ভাব্য ব্যয়বহুল সংখ্যায় নকল করা এড়াতে প্রথমে কোনও ভেরিয়েবলের মানকে প্রভাবিত করা দ্রুত ডিবাগের অনুমতি দেয়।

এমডব্লিউই: ( (require 'ob-emacs-lisp)প্রয়োজনে ব্যবহার করুন )

#+name: square
#+begin_src emacs-lisp :var x=3
  (message (format "%s" (* x x)))
#+end_src

#+RESULTS: square
: 9

#+name: value
: 45

#+name: squaredvalue
#+call: square(x=value)

#+RESULTS: squaredvalue
: 2025

Now I try to reuse this value: 

#+begin_src emacs-lisp :var res=squaredvalue
  (message res)
#+end_src

#+RESULTS:
: nil

Inlined calls do work:    

#+begin_src emacs-lisp :var res=square(value)
  (message res)
#+end_src

#+RESULTS:
: 2025

দ্বিতীয় কোড ব্লকটি প্রসারিত করে:

(let ((res (quote "nil")))
  (message res))

আমি কী মিস করছি?

(এটি org 8.2.10 ব্যবহার করে ইমাস 24-2.1.1, 24.4 এবং 24.5 এ পরীক্ষা করা হয়েছে)


আমি মনে করি লাইব্রেরির বাবেলের সাথে কিছু করার।
yi.tang.uni

উত্তর:


7

স্পষ্টত ব্লকের #+name:উপরে নতুন যুক্ত করুন #+results:

দ্রষ্টব্য: অতিরিক্ত বিভ্রান্তি সৃষ্টি হতে রোধ (message res)করতে আপনার কোডটি আপডেট করেছে থেকে from(message (format "%s" res))Wrong type argument: stringp, 2025

#+name: square
#+begin_src emacs-lisp :var x=3 
  (message (format "%s" (* x x)))
#+end_src

#+RESULTS: square
: 9

#+name: value
: 45

#+name: squaredvalue
#+call: square(x=value)

#+name: squaredvalue-results
#+RESULTS: squaredvalue
: 2025

#+begin_src emacs-lisp :var res=squaredvalue
   (message (format "%s" res))
#+end_src

#+RESULTS:
: nil


#+begin_src emacs-lisp :var res=squaredvalue-results
 (message (format "%s" res)) 
#+end_src

#+RESULTS:
: 2025

ব্যবহার পরিক্ষিত
গনুহ গিয়ে Emacs 24.4.1 (, x86_64-অজানা-cygwin, জিটিকে + সংস্করণ 3.10.9)
অর্গ-মোড সংস্করণ: 8.2.10


ঠিক আছে, এটি অবশ্যই তারিখের সহজ সমাধান। এই ক্ষেত্রে, লাইনের #+name:আগে আসলে কোনও প্রয়োজন নেই #+call:, সুতরাং এটি প্রক্রিয়াতে কোনও বুককিপিং যুক্ত করে না: সংজ্ঞার পরিবর্তে ফলাফলগুলির নাম দিন। সম্ভবত এটি যতটা প্রাকৃতিক তা বোধ হয় না তবে কমপক্ষে এটি কোনও বিকল্প সমাধানের জন্য ভিক্ষা করার মতো কাজ নয়।
টি ভেরন

এটি দুর্দান্ত (+1)। আমি এটি চেষ্টা করেছি এবং এটি org- মোড 8.2.7c এর সাথে কাজ করে। আকর্ষণীয় যে অর্গ মোডের তথ্য ডকুমেন্টেশনের অনুসন্ধানের জন্য -resultকোনও ফলাফল পাওয়া যায় না। দয়া করে একটি নোট যুক্ত করুন যে কলটির নামকরণ প্রয়োজনীয় এবং ফলাফলটির নামটি অবশ্যই প্রত্যয়যুক্ত কলটির নাম হতে হবে -result। কমপক্ষে সেটাই আমি লক্ষ করেছি। (এক শটটি কল নাম যদি পরবর্তী পুনর্মূল্যায়নের বিদ্যমান নামে ফলাফলের উপেক্ষা একটি নতুন ফলাফলের যোগ করা হবে।
Tobias

@ টোবিয়াস - স্পষ্ট করে বলতে গেলে, -resultএই উদাহরণটির জন্য আমি কেবল একটি নামকরণের সম্মেলন ব্যবহার করেছি। যদি আপনি সুস্পষ্টভাবে কোনও উত্সের ব্লকের ফলাফলগুলি সন্ধান করছেন ()তবে নামটিকে অন্য ব্লকের সাথে চলক হিসাবে বা কোনও নয়েব রেফারেন্সের অভ্যন্তরে নাম যুক্ত করুন।
মেলিওরাটাস 26'15

1
দেখে মনে হচ্ছে একমাত্র প্রয়োজনটির #+callনামকরণ করা হয়েছে। ফলাফলের নামটি নির্বিচারে বেছে নেওয়া যেতে পারে। যদি কলটির নাম না দেওয়া হয় তবে একটি অতিরিক্ত নামবিহীন ফলাফল লাইন কল দ্বারা উত্পন্ন হয়।
টোবিয়াস 26'15

ম্যানুয়ালটিতে এমন কোনও বিভাগ রয়েছে যা সেই আচরণটির বর্ণনা দেয়?
টোবিয়াস 26'15

3

আপনি একটি- :postরুটিন ব্যবহার করতে পারেন যা ফলাফলটিকে ফলাফল দেয় :name। এই পোস্টের রুটিন সহ আপনার বাবেল-ব্লককে কল করুন এবং ফলাফলটিকে একটি ড্রয়ারে রেখে দিন। নিম্নলিখিত উদাহরণে এই পোস্ট রুটিন নামকরণ করা হয় asValue

#+name: asValue
#+begin_src emacs-lisp :var name="last" :var val=0 :results drawer
(format "#+NAME: %s\n: %s" name val)
#+end_src

#+name: square
#+begin_src emacs-lisp :var x=3
(message "Running square")
(* x x)
#+end_src

#+RESULTS: square
: 9

#+NAME: value
: 45

#+call: square(value) :post asValue(name="squaredValue",val=*this*) :results drawer

#+RESULTS:
:RESULTS:
#+NAME: squaredValue
: 2025
:END:

Now I try to reuse this value: 

#+begin_src emacs-lisp  :var res=squaredValue
  (format "Re-used value: %s" res)
#+end_src

#+RESULTS:
: Re-used value: 2025

কোড ব্লকগুলির পুনরায় গণনা এড়ানোর আরেকটি উপায় :cacheহડર যুক্তি। yesএটি কোড ব্লকে সেট করা থাকলে এবং এর আর্গুমেন্টগুলি পরিবর্তনের জন্য পরীক্ষা করা হয় এবং যদি কোনও পরিবর্তন না হয় তবে সোর্স কোড ব্লকের পুনরায় মূল্যায়ন ছাড়াই পূর্ববর্তী ফলাফল ব্যবহার করা হয়।

* Running of source blocks with caching

#+name: square
#+begin_src emacs-lisp :cache yes :var x=4
(message "Running square")
(* x x)
#+end_src

#+RESULTS[31bcff57ec9977f9b237fdc62ab18b1378b8c646]: square
: 16

#+NAME: value
: 40

#+name: squaredValue
#+begin_src emacs-lisp :cache yes :var x=square(x=value)
x
#+end_src

#+RESULTS[f90a5856e446c3120f7e91c4b77959598078526e]: squaredValue
: 1600

Now I try to reuse this value: 

#+begin_src emacs-lisp  :var res=squaredValue
  (format "Re-used value: %s" res)
#+end_src

#+RESULTS:
: Re-used value: 1600

Re-trying with call:

#+NAME: value2
: 20

#+NAME: squaredResult
#+call: square(x=value2) :cache yes

#+RESULTS[2f7c47d4c609a1a49ce00b4696afb7b5a5517b97]: squaredResult
: 400

The last version gives the following error with org-mode 8.2.4 in emacs 24.3.1.
(I do not know why.)

Debugger entered--Lisp error: (wrong-type-argument integer-or-marker-p nil)
  org-babel-set-current-result-hash("94ef10d9192a0be25e46238df4cf05389ff69040")
  org-babel-lob-execute(("square(x=value2)" ":cache yes" 0 "squaredResult"))

হ্যাকের জন্য ধন্যবাদ! দেখে মনে হচ্ছে উভয় সমাধানই কাজ করে তবে আমরা কিছুটা দূরে সরে যাচ্ছি "কেবল এটি চেষ্টা করুন, এটি আপনি যেমনভাবে প্রত্যাশা করেছেন" org এর দর্শনের সাথে কাজ করবে philosophy যদি এটি সক্রিয় হয় যে অন্য কোনও সমাধান নেই, তবে আমি উত্তরটি গ্রহণ করব।
টি ভেরন

@ টি.ভেরন আমার মনে হয় দ্বিতীয় সমাধান ( :cache yes) হ'ল মানক সমাধান। এটি org- ম্যানুয়ালটিতেও বর্ণিত হয়েছে (বিভাগটি দেখুন 14.8.2.16 :cache'). It is a pity that it does not smoothly work with # + কল . I think this is a bug. The first solution works with # + কল` এবং এটির সুবিধাও রয়েছে যে এটি কোড ব্লকগুলি সম্পূর্ণরূপে ডিকপল করে। এমনকি আপনি যদি প্রথম কোড ব্লক সম্পাদনা করেন এবং দ্বিতীয়টিকে প্রথম চেষ্টা করেন তবে মূল্যায়ন করা হয় না ((কাজের উপর নির্ভর করে যা কোনও সুবিধা বা বিচ্ছিন্নতা হতে পারে You আপনাকে কেবল এটি মাথায় রাখতে হবে))
টোবিয়াস

আমি গতরাতে ক্লান্ত হয়ে পড়েছিলাম, আমি লক্ষ্য করিনি ... সর্বশেষ ব্লকের মূল্যায়নে কোনও ত্রুটি না থাকলেও, আমি প্রশ্নটিতে যা লিখেছি তার চেয়ে কী এটি সত্যই কার্যকর হবে? সর্বোপরি, সমস্যাটি এটি নয় যে এটি প্রতিটি রেফারেন্সের জন্য কলটি পুনরায় মূল্যায়ন করে (এটিও একটি সমস্যা হবে এবং তারপরে হ্যাঁ, ক্যাশে সমাধান হবে), তবে আমি এটি একেবারেই উল্লেখ করতে পারি না।
টি। ভেরন

@ টি.ভেরন কাইল মায়ার ঠিক বলেছেন। Orgmode.org/w/… পরিবর্তনগুলি এটিকে এখনও ট্রাঙ্কের মধ্যে ফেলেনি । নতুন সংস্করণটি এখানে রয়েছে: orgmode.org/w/?p=org-mode.git ; a=blob_plain ; f=lisp/… । তবে, সম্ভবত, এখানে বেমানান পরিবর্তন রয়েছে ...
টোবিয়াস

@ টি.ভাইরন উপরে আমার অর্থ "স্থিতিশীল মুক্তি" এবং "ট্রাঙ্ক" নয়। এর জন্যে দুঃখিত. নিখোঁজ হওয়া বৈশিষ্ট্যের জন্য আপনি আমার উত্তর 1 টি কার্যক্ষম হিসাবে দেখতে পাবেন।
টোবিয়াস 26'15

3

আমার সন্দেহ হয় আপনার কেবল আপনার org মোড আপগ্রেড করতে হবে। এটি আমার শেষ দিকে (org এর বর্তমান বিকাশীয় সংস্করণ) কাজ করে এবং সাধারণভাবে ট্যাগ হিসাবে কাজ করা উচিত release_8.3beta। নীচে প্রতিশ্রুতিবদ্ধ রয়েছে যে আমি মনে করি আপনি যে সমস্যার বর্ণনা দিচ্ছেন তা সমাধান করে।

commit 1877652ce0234cf333fa103b5ada08fbf5946ab1
Date:   Wed Nov 13 11:42:40 2013 -0700

    allow reference to named call lines

    * lisp/ob-ref.el (org-babel-ref-resolve): Look for call lines when
      resolving references.

গিট রেপো থেকে অর্গ লোড করা ছাড়াও নতুন সংস্করণ চালানোর জন্য অন্য বিকল্পটি হ'ল ইএলপিএ প্যাকেজ ইনস্টল করা


আচ্ছা, আমি ডেভেলপমেন্ট সংস্করণ ব্যবহার করতে পারেন না, কিন্তু তার মানে এই নয় যে, আমি আপডেট করেন নি 2013 যেহেতু আমি নই যে দেরী। ;)সুনির্দিষ্টভাবে বলতে org-versionগেলে , আমার বয়স 8.2.10। আমি এই তথ্যটি দিয়ে প্রশ্নটি সম্পাদনা করেছি, যেখানে এটি প্রথম স্থানে থাকা উচিত ছিল।
টি। ভেরন 21

ওফস, ভুল তথ্য সম্পর্কে দুঃখিত। এটি প্রতিশ্রুতিবদ্ধ হওয়া উচিত, তবে এটি 8.2.10 এর মধ্যে নেই।
কাইল মায়ার

আপনি কি জানবেন যেখানে আমি এই প্রতিশ্রুতি সম্পর্কে একটি আলোচনা পেতে পারি?
টি ভেরন

যদি এটি সম্পর্কে কোনও আলোচনা বিদ্যমান থাকে, তবে এটি সম্ভবত org মোড তালিকায় থাকবে তবে আমি অনুসন্ধান করে একটিও পাইনি এবং প্রতিশ্রুতিবদ্ধ বার্তায় কোনও উল্লেখ করা হয়নি, সুতরাং এর একটিও নাও থাকতে পারে।
কাইল মায়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.