D言語練習

昨日書いたウソッ子シェルのソースを改良してみた。

import std.stream;
import std.string;
int main( char[][] arg )
{
	char[] str;
	stdout.writeLine(
	"Music Shell Version 0.0\nCopyright (C) ideo 2004 All Rights Reserved\n" );
	
MAIN_LOOP:
	do{
		stdout.writeString("%");
		char[] str = tolower(strip(stdin.readLine()));
		switch ( str ){
		  case "y":
			stdout.writeLine( "Yes!" );
			continue;
		  case "n":
			stdout.writeLine( "No!" );
			continue;
		  case "q":
			break MAIN_LOOP;
		  default:
			continue;
		}
	} while(!str[])
	return 0;
}

改良点

  • 入力文字列の左右の無駄な空白を除去
  • 入力文字列を強制的に小文字に変換することにより、コマンド検査処理をシンプルに

※小文字に統一することでswitch文に変えたが、"q"を入力したときにbreakする先がswitchになってしまうために、doステートメントにラベル設定。
 これよりbreak先がラベルになり、無事ループを抜ける。

未解決問題

  • 2バイト文字を入力すると不正エラーで落ちてしまう

1つ良い発見があった。友人マキシが動作報告をしてくれたのがキッカケでわかった。
何かといえば、このウソっ子シェルで入力した文字列がヒストリーとして記憶されている驚きを書いたと思うが、そのヒストリの保有期間である。
私はこのシェルを終了させても残っている現象だったのだが、それはDOSプロンプトで実行していたからだ。
マキシ氏はウインドウズのデスクトップからダブルクリックをして実行していた。

すなわち、DOSでやっていてもそのプロンプト自体を終了させればヒストリは消えるのだ。

ありがとうマキシ氏しししししし。