Kuruluş Modu Babil - Etkileşimli kod bloğu değerlendirmesi


12

"Cin" talimatları içeren C ++ org modu kaynak kodu blokları değerlendirmek istiyorum ama değerlendirme sırasında (kullanıcı girişi ile) etkileşimli bir değerlendirme için bir yol bulamıyorum. Kod örneği:

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

Böyle etkileşimli bir değerlendirme yapmak ya da simüle etmek mümkün müdür (kaynak koduna sahte bir giriş vererek)?


Aslında etkileşimli olması gerekiyor mu, yoksa sadece bu kod bloğunda değil, önceden bildiğiniz bazı girişleri vermeniz mi gerekiyor? İkinci durum daha kolaydır: :var varname=valuebaşlıkta kullanabilirsiniz . İkinci durumda yine de kullanabilirsiniz :var, ancak değer yerine giriş isteyen bir ELisp işlevine sahip başka bir kod bloğu kullanın.
wvxvw

Cevabınız için @wvxvw teşekkürler; Ne yapmak istiyorum öğrenciler için bazı program örnekleri ile bir belge yapmak ve bu nedenle kaynak kodu bloğunu "olduğu gibi" tutmak istiyorum; bu yüzden tercihim bahsettiğiniz ikinci vaka olacaktır; Ben sizin önerinizi takip etmeye çalışacağız (kullanmak için: var ve giriş sormak için bir elisp kodu), bir bağlantınız veya böyle bir çağrının bir örneği var mı?
Lgen

Üzgünüm, biraz yanlış anlaşılma oldu. İkinci örnek girişi okumak için Emacs kullanır, ancak Babel C ++ programını etkileşime izin verecek şekilde çağırmaz. Düşünebileceğim tek şey, kodunuza iki uygulama içeren bir "polimorfik" işlev eklerseniz: bir tanesi girdiyi etkileşimli olarak okuduğunuz ve diğeri dosyadan okuduğunuz veya kod bloğu değerlendirmesi sırasında sağladığınız .
wvxvw

Yanıtlar:


8

Bunun gibi:

#+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İçeriklerle birlikte Org dosyasıyla aynı dizinde bir dosya oluşturun 10.


7

Emacs'tan adlandırılmış bir elispblok kullanarak etkileşimli girdiyi almasını isteyebilirsiniz . Sonra toplanan değeri :var c-variable=block-namesözdizimini kullanarak C ++ sos bloğuna iletin :

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

Kaynak bloklarının çıktılarının dize olarak iletildiğini unutmayın, bu yüzden onu bir tamsayıya dönüştürmeliyiz, dolayısıyla atoive ekstra #include.


1
Sevdiğin gibi yap. Bununla birlikte, kodunuz Org moduna bağlıyken, benimki kelimesi kelimesine yapıştırılabilir ve kolayca derlenebilir.
abo-abo

1
@Erikstrokes bu katkı için teşekkür ederiz; Benzer bir fikrim vardı (harici bir blok kullanın) ve abo-abo çözümü ile bir karışım yaptım. Sonucu cevap olarak gönderdim.
Lgen

4

Yardımınız için teşekkürler @ abo-abo. Doğru olan ve hatta sadece org dosyamı düzenlemek (ve otomatik olarak harici giriş dosyasını oluşturmak için) biraz geliştirdiğiniz öneriyi takip ettim. Fikir, veri dosyasını oluşturan harici bir kod bloğu (burada build_input_file adında bir bash betiği) oluşturmak ve sayesinde diğer bloğu değerlendirmeden önce otomatik olarak çağırmaktır :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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.