Org Mode Babel-インタラクティブコードブロックの評価


12

"cin"命令を含むC ++のソースコードブロックを組織モードで評価したいのですが、評価中にインタラクティブな評価(ユーザー入力による)を行う方法が見つかりません。コードの例:

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

このようなインタラクティブな評価やシミュレーション(ソースコードに偽の入力を与えること)は可能ですか?


実際にインタラクティブにする必要がありますか、それとも、このコードブロックではなく、事前に知っている可能性のある入力を与える必要がありますか?2番目のケースの方が簡単です:var varname=value。ヘッダーで使用できます。2番目のケースでは引き続きを使用できますが:var、値の代わりに、入力を要求するELisp関数を持つ別のコードブロックを使用します。
wvxvw

あなたの答えを@wvxvwに感謝します。私がやりたいのは、学生向けのプログラム例を含むドキュメントを作成することです。そのため、ソースコードブロックを「現状のまま」保持したいと思います。だから私の好みはあなたが言及する2番目のケースになるでしょう。私はあなたの提案に従います(:varとelispコードを使用して入力を求めるために)、リンクまたはそのような呼び出しの例はありますか?
Lgen、2015

ああ、すみません、少し誤解がありました。2番目の例では、Emacsを使用して入力を読み取りますが、Babelは、相互作用を可能にするような方法でC ++プログラムを呼び出しません。私が考えることができる唯一のことは、コードにいくつかの「ポリモーフィック」関数を追加する場合、2つの実装があります。1つは対話式で入力を読み取るもの、もう1つはファイルから読み取るかコードブロックの評価中に提供するものです。 。
wvxvw 2015

回答:


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.txtOrgファイルと同じディレクトリに、内容を含むファイルを作成します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
好きなようにしてください。ただし、コードはOrg-modeにバインドされていますが、自分のコードはそのままコピーアンドペーストして簡単にコンパイルできます。
abo-abo 2015

1
この貢献をありがとう@erikstrokes; 私は同様のアイデアを持ち(外部ブロックを使用)、abo-aboソリューションとミックスしました。結果を回答として投稿しました。
Lgen 2015

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.