组织模式Babel-交互式代码块评估


12

我想在C ++中的组织模式下评估包含“ cin”指令的源代码块,但是我找不到在评估过程中进行交互式评估(带有用户输入)的方法。代码示例:

#+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和elisp代码请求输入),您是否有链接或此类电话的示例?
Lgen

哦,对不起,有点误会。第二个示例将使用Emacs读取输入,但是Babel不会以允许交互的方式调用C ++程序。我唯一能想到的是,如果在代码中添加一些“多态”函数,则该函数有两种实现:一种实现以交互方式读取输入,另一种实现是从文件中读取或在代码块评估期间提供。
wvxvw

Answers:


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文件相同的目录中创建一个包含contents的文件10


7

您可以要求Emacs使用命名elisp块来获取交互式输入。然后使用以下:var c-variable=block-name语法将收集到的值传递给C ++ souce块:

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

请注意,源块的输出将作为字符串传递,因此我们必须将其转换为整数,从而将the atoi和extra 转换为整数#include


1
随便你怎么做。但是,您的代码绑定到组织模式,而我的代码可以逐字粘贴并易于编译。
abo-abo

1
感谢@erikstrokes的贡献;我有一个类似的想法(使用外部块),并与abo-abo解决方案混在一起。我把结果贴出来作为答案。
Lgen

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.