readをなんとかしました。
むか~し買ってちょびっと読んでみたもののわかわかめになったので死蔵していたいわゆるドラゴンブックをひっぱりだしてみたりして、あーでもないこーでもないしているうちになんとか動くようになりました。
readの本当の仕様というのはよくわからなかったので本に書いてあったこんな感じで返るみたいな記述を参考に、複雑なことは一切しない方向で、割り切った実装となっています。
当然変な文をいれたりするとろくなことにはなりません。
はまったところといえば、教科書のいうところのオブアレイというやつにlambdaやらdefineやらtagged_list?で比較するリテラルを片っ端から突っ込んでおかないとなんでもかんでも全部変数にされてしまったりするところでしょうか。オブアレイなどやるつもりなかったので、後からヒーヒー実装する羽目になりました。
それと何気に面倒なのが、
(+ (+ 1 (+ 2 3)) 4)
みたいなのをきっちりリスト(上の記述そのままのリスト)にして返さないといけないところで、ちょっと憂鬱でしたが、今までの演習で散々やった再帰使う方向でなんとなくまとまりました。
そこだけ書くとこんな感じです。
scheme_type_t scheme_read()
{
scheme_type_t token= next_token();
if( token.type == TYPE_PTR ) {
return scheme_read_list( scheme_null() );
} else if( token.type == TYPE_EMPTY ) {
error( "Illgal input -- READ", token );
return scheme_null();
} else {
return cons( token, scheme_null() );
}
}
scheme_type_t scheme_read_list( scheme_type_t list )
{
scheme_type_t token;
while( 1 ) {
token = next_token();
if( token.type == TYPE_EMPTY ) {
break;
} else if( token.type == TYPE_PTR ) {
list = append( list, cons( scheme_read_list( scheme_null() ), scheme_null() ) );
} else {
token = cons( token, scheme_null() );
list = append( list, token );
}
}
return list;
}
なんにせよ、上の奴が動くことは確認しました。
ちなみにfactorialとかはまだ試してないです、多分バグっているでしょうが、とりあえずreadが動いたのがうれしくて書いてしまいました。
ダウンロード
最近のコメント