PHPで書いたいいかげんなPHP-REPL

とかくPHPの色々が全然わからんので(たとえば「あれ、Arrayってどう書くんだ」とか言うレベル)、対話環境がいる。Perlからphp -r hogehogeを呼び出すラッパだけだとあまりにもあまりだったので、PHPで書いた。ほんの少しだけ手を入れて、関数とかも定義しやすいように。ブラケットブレースを数えてるだけだったり。

% ./phpterm.php
php> $x = 342;
php> print "$x\n";
342
php> function hoge(){
  print "hoge\n";
  }
php> hoge();
hoge
php> function loop(){
  for($i=0;$i<3;++$i){
    print "$i\n";
    }
  }
php> loop();
0
1
2
php>

無いよりマシ、かなあ。つーかこんな感じのもん、誰かちゃんと作ってると思うのだけど。以下コード。

#!/usr/bin/php
<?php
  $prompt = "php> ";
  function isLine($line)
  {
    return preg_match("/[^{]+;\s*$/", $line);
  }
  function brakDepth($line)
  {
    $openNum = preg_match_all("/{/", $line, $out);
    $closeNum = preg_match_all("/}/", $line, $out);
    return $openNum - $closeNum;
  }
  function blockEnd($line)
  {
    return brakDepth($line)==0 and preg_match("/.+}\s*$/", $line)==1;
  }
  while($line = readline($prompt)){
    if(!isLine($line)){
      while(!blockEnd($line)){
        $depth = brakDepth($line);
        for($i=brakDepth($line), $indentsp="";$i>0;--$i){
          $indentsp .= "  ";
        }
        $line .= readline($indentsp);
      }
    }
    eval($line);
    readline_add_history($line);
  }
?>

test