संगठन मोड बैबेल - इंटरएक्टिव कोड ब्लॉक मूल्यांकन


12

मैं C ++ में "मोड" निर्देशों के साथ org मोड सोर्स कोड ब्लॉक में मूल्यांकन करना चाहूंगा, लेकिन मूल्यांकन के दौरान मुझे एक इंटरैक्टिव मूल्यांकन (उपयोगकर्ता इनपुट के साथ) करने का तरीका नहीं मिल सकता है। कोड का उदाहरण:

#+BEGIN_SRC C++  :results output :export code :tangle myfile.cpp 
#include <iostream>
using namespace std;

int main()
{
int a;
cin>>a;
cout<<a+1;
}
#+END_SRC

क्या इस तरह के संवादात्मक मूल्यांकन या अनुकरण करना संभव है (स्रोत कोड को एक नकली इनपुट देकर)?


क्या आपको वास्तव में इसे संवादात्मक बनाने की आवश्यकता है, या क्या आपको इसे कुछ इनपुट देने की आवश्यकता है जो आप पहले से ही पहले से जानते होंगे, बस इस कोड ब्लॉक में नहीं? दूसरा मामला आसान है: आप :var varname=valueहेडर में उपयोग कर सकते हैं । दूसरे मामले में आप अभी भी उपयोग कर सकते हैं :var, लेकिन मूल्य के स्थान पर एक अन्य कोड ब्लॉक का उपयोग करें जिसमें ELisp फ़ंक्शन होता है जो इनपुट मांगता है।
wvxvw

आपके उत्तर के लिए धन्यवाद @wvxvw; मैं जो करना चाहता हूं, वह छात्रों के लिए कुछ कार्यक्रम उदाहरणों के साथ एक दस्तावेज बनाना है और इसलिए मैं स्रोत कोड ब्लॉक "जैसा है" रखना चाहूंगा; इसलिए मेरी प्राथमिकता आपके द्वारा उल्लेखित दूसरा मामला होगा; मैं आपके सुझाव (उपयोग करने के लिए: var और इनपुट के लिए पूछने के लिए एक अनिवार्य कोड) का पालन करने की कोशिश करूंगा, क्या आपके पास इस तरह के कॉल का लिंक या उदाहरण है?
Lgen

ओह, क्षमा करें, कुछ गलतफहमी हो गई है। दूसरा उदाहरण इनपुट को पढ़ने के लिए Emacs का उपयोग करेगा, लेकिन Babel C ++ प्रोग्राम को इस तरह से कॉल नहीं करेगा जैसे कि इंटरैक्शन की अनुमति देने के लिए। केवल एक चीज जिसके बारे में मैं सोच सकता हूं, वह यह है कि यदि आप अपने कोड में कुछ "पॉलीमॉर्फिक" फ़ंक्शन जोड़ते हैं, जिसमें दो कार्यान्वयन हैं: एक, जहां आप अंतःक्रियात्मक रूप से इनपुट पढ़ते हैं, और दूसरा, जहां आप इसे फ़ाइल से पढ़ते हैं या कोड ब्लॉक मूल्यांकन के दौरान प्रदान करते हैं। ।
wvxvw

जवाबों:


8

ऐशे ही:

#+begin_src C++ :results output :cmdline < in.txt
#include <iostream>
int main(int argc, char *argv[]) {
  int a;
  std::cin >> a;
  std::cout << a + 1;
  return 0;
}

#+end_src

#+RESULTS:
: 11

in.txtसामग्री के साथ Org फ़ाइल के समान निर्देशिका में एक फ़ाइल बनाएँ 10


7

आप Emacs को इंटरेक्टेड इनपुट प्राप्त करने के लिए नामांकित elispब्लॉक का उपयोग करने के लिए कह सकते हैं । फिर :var c-variable=block-nameसिंटैक्स का उपयोग करके एकत्रित मान को C ++ स्मार ब्लॉक में पास करें :

#+name: input_block
#+BEGIN_SRC elisp :export none :results none
(completing-read "a=" nil)

#+END_SRC

#+BEGIN_SRC C++  :results output :export code :tangle myfile.cpp :var input=input_block
  #include <stdlib.h>
  #include <iostream>
  using namespace std;

  int main()
  {
  int a = atoi(input);
  cout<<a+1;
  }
#+END_SRC 

ध्यान दें कि स्रोत ब्लॉक के आउटपुट स्ट्रिंग्स के रूप में पास किए जाते हैं, इसलिए हमें इसे एक पूर्णांक में बदलना होगा, इसलिए atoiऔर अतिरिक्त #include


1
जैसा आप चाहें वैसा करें। हालाँकि, आपका कोड ऑर्ग-मोड से जुड़ा हुआ है, जबकि मेरा कॉपी-पेस्ट किया हुआ शब्दशः और आसानी से संकलित किया जा सकता है।
abo-abo

1
इस योगदान के लिए धन्यवाद @erikstrokes; मेरे पास एक समान विचार था (एक बाहरी ब्लॉक का उपयोग करें) और एबो-एबो समाधान के साथ मिश्रण बनाया। मैंने उत्तर के रूप में परिणाम पोस्ट किया।
12

4

आपकी मदद के लिए धन्यवाद @ abo-abo। मैंने आपके सुझाव का पालन किया है जो सही है और यहां तक ​​कि इसे थोड़ा बढ़ाकर केवल मेरी ऑर्ग फाइल को संपादित करने के लिए (और स्वचालित रूप से बाहरी इनपुट फ़ाइल बनाने के लिए)। यह विचार एक बाहरी कोड ब्लॉक बनाने के लिए है (यहाँ build_input_file नाम का एक bash स्क्रिप्ट) जो डेटा फ़ाइल बनाता है और दूसरे ब्लॉक धन्यवाद के मूल्यांकन से पहले इसे स्वचालित रूप से कॉल करता है :var tmp=build_input_file

#+name: build_input_file
#+BEGIN_SRC bash  :results none :exports none 
echo "10 12" > in.txt
#+END_SRC

#+name: my_function_with_cin
#+BEGIN_SRC C++  :results output :exports both  :var tmp=build_input_file :cmdline < in.txt
#include <iostream>
using namespace std;

int main()
{
 int a,b;
 cin>>a>>b;
 cout<<a<<" "<<b;
}
#+END_SRC
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.