trifle

技術メモ

WhitespaceのインタプリタをRustで書こうとしたという話

Whitespace というクリーンな言語がある. この言語で Hello World するにはこのようなプログラムを書く.

            
    
                    
    
                      
    
                      
    
                            
    
             
    
                        
    
                            
    
                     
    
                      
    
                  
    
                 
    
  


ラクリとして, Whitespace では(空白文字), (タブ), (改行文字)の3種類を使ってプログラムを組み立てている. いくつか解説しているサイトがあるので紹介すると,

Whitespace tutorial
・・・公式サイト. 公式なのに WebArchive.

AtCoder に登録したら解くべき精選過去問 10 問を Whitespace で解いてみた
・・・日本語では一番わかりやすい.

Rubyist のための他言語探訪 【第 14 回】 Whitespace
・・・Matzさんの解説.

Whitespace 超入門
・・・susisuさんの解説.

Whitelips the Whitespace IDE
・・・ブラウザ上で動くWhitespace対応のIDE(ヤバい). アセンブラっぽいやつにコンパイルしたものが右画面にあり, 逐次実行できるので, インタプリタを書くときに参考になった.



さて, そんな Whitespace のインタプリタを書いてみたくなったので Rust で書いていた.

github.com

せっかく Rust で書いているので,

enum WSC { S, T, L }

というSpace, Tab, NewLineを表す型に変換して,

fn convert(v: Vec<u8>) -> Vec<WSC> {
  let mut new_vec = Vec::new();
  for i in v {
    match i {
      32 => new_vec.push(WSC::S),
      9  => new_vec.push(WSC::T),
      10 => new_vec.push(WSC::L),
      _  => {} // 他の文字は無視
    }
  }
  new_vec
}

という感じで読み取り, exhaustive pattern matching をこころがけた.



大筋は上手くかけた気がするし, Hello Worldだけではなく1から10まで順に出力するものや与えられた数だけフィボナッチ数を表示するものなどは動かせているので, サブルーチン処理や分岐は多分問題無いと思う. だが, どうも標準入力が適当なようで上手くいかないものも多い. そもそも元の Whitespace のプログラムが真っ白なのでもし元のプログラムがマズいとしても気付きようが無い.
自分はもうWhitespaceに飽きてやる気がなくなってしまった. やっぱりソースコードには文字が必要ですね.