2010年2月27日土曜日

echoの作成

チュートリアルのEcho作成をやってみましたよ。
package main

import (
	"os"
	"flag" // command line option parser
)

var omitNewline = flag.Bool("n", false, "don't print final newline")

const (
	Space = " "
	Newline = "\n"
)

func main() {
	flag.Parse() // Scans the arg list and sets up flags
	var s string = ""
	for i := 0; i < flag.NArg(); i++ {
		if i > 0 {
			s += Space
		}
		s += flag.Arg(i)
		}
	if !*omitNewline {
		s += Newline
	}
	os.Stdout.WriteString(s)
}
NArgっていうのはどうやらArgvのことを言うようです。
このechoは引数を渡すとそれを標準出力に出すように見えます。

やってみましょう。
$ 8g echo.go
$ 8l echo.8
$ ./8.out
$
素で実行すると何もおこりません。
引数に文字列を渡してみましょう。
$ ./8.out echoのテスト
echoのテスト
$
そのままですね。

constキーワードについて解説がありますがこれはツッコミどころなし。
const 文字列 = 定義
で定数を定義できます。echoみたいに
const (
	Space = " "
	Newline = "\n"
)
もできるようです。

興味深いのはvar での変数定義方法です。
通常は
var s string = "";
としますが、""で括った物は文字列であることがコンパイラは知っているので
var s = "";
と書くこともできて、さらに明示的な定義&代入を
s := "";
とも書けるようにしました、と。

:=はmakefileみたいですね。

最後にセミコロンがついているのはおそらくC言語的に"" は連結できるから、なのでしょうか。
そのうちわかるでしょう。

flag.Boolの解説はここにはなさそうです。単にboolだと。三つ引数がありますけど。まあいっか。
* forは Cの()がなくなったもの。
* +=で文字列結合可能。
* flag.NArg()はコマンドライン引数の数が
* flag.Arg(num)はnum番目の引数を取り出すのでしょう。
* 配列を渡してこないあたり賢くなってますね。

中身を読んだのでもう一度実行してみます。
コマンドラインなので半角スペースが引数の区切りになるはずです。
ちょっとだけ改造してみました。
package main
import (
	"os"
	"fmt" /* Printを使うため */
	"flag" // command line option parser
)

var omitNewline = flag.Bool("n", false, "don't print final newline")

const (
	Space = " "
	Newline = "\n"
)

func main() {
	flag.Parse() // Scans the arg list and sets up flags
	var s string = "";

	for i:=0 ; i < flag.NArg(); i++ {
		if i > 0 {
			s += Space
		}
		s += flag.Arg(i)
	}
	if !*omitNewline {
		s += Newline
	}
	os.Stdout.WriteString(s)
	fmt.Printf("%d\n",flag.NArg()) /* 引数の個数を出力*/
}
for で:=を使って宣言したiはスコープがforの中に制限されるのですね。
PerlとかC++的には当然のことですが
PHPだと違和感ありますね。Cはそういうことできません。

fmt.Printfの中はテキトウに書いたのですがこれでよいようです。
コンパイルして実行してみましょう。
$ ./8.out

0
動いていそうです。
引数を渡してみると
$ ./8.out echoのテスト その2 その3
echoのテスト その2 その3
3
引数を変えてみましょう。
$ ./8.out echoのテスト その2\ その3
echoのテスト その2 その3
2
期待通り動作しています。

かなり沢山のことがこのechoに詰まっていますが
Cよりユルくて、PHPより固い仕様だとおもいました。
CとかC++とかPythonをよく研究していますね。
どちらかというと既存の言語をあんまり知らない人向けの言語かなぁと。
我ながらひどいまとめですがいまのところはそんなものでいいということにしておきます。

0 件のコメント:

コメントを投稿