Ruby前回から間が空いてしまったが久しぶりのバージョンアップ。間が空いてしまったのは、あまりいい実装案が思いつかなかったのが原因。このままだ、ズルズル開発が止まってしまうと思ったので、一旦実装したいやつを後回しにしてできるところから作っていった。v0.8.0unless文でthenを省略できるようにした前回の記事で書いたとおりunlessでthenを省略できるようにするのをわすれていたので実装した。複数行サポートコマンドラインで複数行を扱えるようにした。クォートを閉じていなかったり、\で終わっている場合は次の行の入力を促される。複数行サポート複数行をサポートをしたのはいいが、コマンドラインの制御に使っているlinenoiseが複数行を扱うことを想定していないため、ヒストリー機能が1行ごとの保存になっている。今の所どうしようもないので諦め。複数行をサポートしたことでスクリプトファイルを扱えるようにした。シェバンにreddishを指定すれば実行できる。開発しているときにいろいろバグを見つけたので修正した。空の変数を引数に指定した場合、無視されるというバグを直した。した場合、ここでは何も表示されないのが正しい挙動なのだが、trueと表示されるというバグがあった。これはなぜかというと、修正前は引数の変数などをパースしたあとに空の文字列があったらArrayから排除していた。いうコマンドになってしまうのであった。空の引数にも意味があるのだ...。次のバグは、環境変数に設定する文字列がクォートなどの文字種が混ざっている場合正しく認識されなかった問題。代入されず、test1というコマンドを実行するようになっていたので修正した。最後は文字列中の$がエスケープできないというもの。こちらもシュッと直した。コマンド補完機能linenoiseの機能を使ってコマンドの補完をできるようにした。リッチな機能はないので、TABを押すたびにインクリメントで変わっていくだけで、候補を一覧で出すとかhistoryから使用頻度を見て候補順を最適化するみたいな機能はない...。ここらへんはhistoryとかと合わせてコア機能が完成したあとにターミナルの改善を行いたいと思っているのでそれまで放置。コマンド置換コマンドの実行結果をコマンドラインとして扱える機能。バッククォート(`)でくくるとその中身が、コマンドとして扱われて出力を利用できる。whileやuntilを実装するときに、例えば10までカウントするみたいなのを作るときにこの機能がないとつらいので先に実装した。こいつの実装が冒頭で書いたあまりいい実装案が思いつかなかった機能の引き金になった...while/untilの実装if文を実装してたのでwhile/unitlの実装は一瞬でできた。実装は単純なのだがbashに比べると約10倍遅い・・・なんでだ。0swapsProcess.forkが遅いとかあるのだろうか。今はこのパフォーマンスの悪さがクリティカルなわけではないので放置...そのうち改善したい。悩み:ネストした文字列のパース今かなり実装に悩んでいるものがある。それは、Wordトークンのパースをどうするかというものだ。具体的にどういうことかというと、コマンドや引数などは、lexerにおいてはWordというトークンに分割する。これに関しては前に記事に書いたのでそちらを参照してほしい(今の実装とはちょっと違うけど)。lexerでWordトークンをパースしたときに付加情報として、普通のテキスト(type=:normal)かクォートされたもの(type=:quote)なのかコマンド置換(type=:execute)なのかをつけている。これをみて、最終的にexecutorがこのWordをどう処理するか決まる。今回のアップデートでコマンド置換が増えたことでWordトークンがネストできるようになってしまった。みたいにダブルクォートでくくられた中にコマンド置換を入れることができる。OK)を保持するtype=:normalなWordとなる。ここで悩ましいのが、この文字列をパースするのがexecutorにも必要になるということだ。パースする機構があるのに、executorにも必要になってしまう・・・。reddishにおいてはlexerはmgemになっていてexecutorのある本体と分離しているので、どちらにも定義しないといけないという状態になっている...。どちらかなぁっと考えている。2の方法で実装しようとしたところ、かなり大規模な改修になりかつ私のスキルだとぐちゃぐちゃなコードになってしまったので、開発が止まったのであった。最終的に、この問題を棚上げして実装できるところからやることにした。上記のネストした文字列のパースをどうにかするか、for文を実装するか。あと、break/continueキーワードの実装あたりをやりたい。break/continueキーワードは、どう実装したら今のreddishに組み込めるか全くbashの実装とかみつつ、もしかしたら、根本的にガッツリ見直す必要があるかもしれない。内蔵Rubyコマンド/break,conti...reddish-shellのバージョンアップ報告。4参加グループガジェットプログラミング個人の日記ネットワーク(Network)はてなブログをはじめよう!buty4649さんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。