Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

C言語にもREPL(Read Eval Print Loop)があるだ...ぜッ!

REPL(Read Eval Print Loop)は対話的開発環境なんて言われるアレです。
Rubyで行けばirbに相当します。
Lispから来た考え方のようで、星人本でも一章を割いて解説しています。

今回おっ魂消たのは、これ動的言語のみの特権ではなかったという事です。

本題:C言語用REPL igcc

igccは静的言語の権化であるC言語/C++用のREPLです。
IGCC - IGCC - Andy Balaam Home

導入

イマドキな感じでGitリポジトリに見る事が出来ます。
ちなみにPython製です。
http://sourceforge.net/p/igcc/code/ci/master/tree/

というわけで導入はgit cloneで一発。楽チン。

$ git clone git://git.code.sf.net/p/igcc/code igcc-code

実例

cloneしたディレクトリに移動すると実行ファイルがあります。
こいつをコマンドラインで実行。

$ ./igcc 
igcc 0.1
Released under GNU GPL version 2 or later, with NO WARRANTY.
Type ".h" for help.

g++> #include <stdio.h>
g++> int a = 0;
g++> int cnt = 0;
g++> printf("%d",a);
0 g++> printf("%d\n",a);
0
g++> printf("%d\n",a);
0
g++> for(cnt=0; cnt<3; cnt++) {
[Compile error - type .e to see it.]
g++> printf("%d\n",a+cnt); }
0
1
2
g++> .q

なんだよこれ...やべぇよ...やべぇよ...

tips

.hを押すとヘルプです。

g++> .h
.c Show copying information
.e Show the last compile errors/warnings
.h Show this help message
.l List the code you have entered
.L List the whole program as given to the compiler
.q Quit
.r Redo undone command
.u Undo previous command
.w Show warranty information

.uでundo

g++> .u
[Undone 'print("%d\n",a);'.]
.l 現状REPLが把握してるコードを表示
g++> .l
#include <stdio.h>

int a=0;
.L 今実行されてるCのコードそのものを表示
g++> .L
#include <cstdio>
#include <iostream>
#include <string>
#include <stdio.h>

using namespace std;

int main()
{
	int a=0;


	return 0;
}

今実行されてるCのコードそのものを表示します。
C++ですね。