oreore_lisp(2) and GO
上を向いて、歩こう。
そうすれば、いろいろな物が見えてくる。色々な物って何よ? と言う問いへの私の答えは、 アマチュア無線家の所在が分かる という事だ。
私の散歩範囲である、せいぜい1平方kmぐらいの中に、7軒の無線家を見つけた。これって 異常密集地帯じゃなかろうか。そっか、昔の電話が無い時の名残か、非常通信のためか。
7軒のうち、シンプルにブラウンアンテナだけの家は、2軒だけ。後は、豪華に八木宇田 アンテナをスタックしたり、マルチバンド対応のアンテナだったり。これらは指向性を 持っているので、ローテーターを使ってぐるぐると回せるような仕掛けを導入してる。
何時か、どなたかの家へ見学に行ってみたいものだ。昔はアンテナを見つけると平気な 顔で、見知らぬ家でも訪問したものだけど、またそういう勇気を出してみるかな。
oreore で macro
さて、前回はmacroをやろうとして、予備実験で oreore_lisp の重大な機能不足に気づいて しまった。手続き定義中には、一つのS式しか許されていないのだ。 で、beginとかprognとかletを入れようと考えてしまったのだ。
でも、面倒だなあ。今有るもので何とかならんかなと、ズボラな事を考えてみたんだ。えっ、考えても 思いつかないので、ソースをじっくりとみたよ。そしたら、list なんてのが提供されてるじゃないですか。
これって、手続きだから、引数を順番に評価して、それをListにして返してくれるんだ。 提供されてる手続きの中で、唯一アリティー(引数の個数)が無限大と言う、嬉しい機能を持っている。 これ使えそう。確認しておかなければいけないのは、引数の評価の順番が、左から右になっている かだな。ちょっと実験してみよう。
lisp> (list (gtod) (fib 25) (gtod)) ((279832098.259778) 075025 (279832101.841532))
まあ、心が捻れてなければ、左から右に評価するわな。素直で宜しい。(RnRSで決まってましたっけ?) これ使えそうじゃん。
lisp> (list (setq old (gtod)) (fib 25) (diff (gtod) old)) (old 075025 (000003.566930))
後は、この結果の、cdr か caddr でも取ればいいんだな。早速macroに仕立ててみよう。 おっと、top_env を、汚しちゃうのは、この際無視って事で。何せ、quick hackですから。
(defmacro time (body) (list 'caddr (list 'list (list 'setq 'old (list 'gtod)) body (list 'diff (list 'gtod) 'old))))
caddrまで、マクロ内に含めちゃうと鬱陶しいので、別に定義してます。マクロへの書き換え 方法だが、これは機械的に出来る。
マクロの元が、(cadr ... ) だったら、これを表現するS式を作る事になるんで、(list 'cadr .. となる。cadrをQUOTEしてるのは、引数の評価停止を指示するためだ。従って評価して (展開して)欲しい(上の例では body)部分には、QUOTEを付けないというルールにになる。
lisp> (time (fib 10)) (000000.002286) lisp> (time (fib 20)) (000000.309019) lisp> (time (fib 25)) (000003.590447)
取り合えず、これで良しとしましょう。
Google GO
いささか出遅れた感があるが Googleが新しい言語GOを発表した。 既にいろいろな所で話題になっている。
マスコットが plan9のバニーちゃんに似てるな。これってGOの生みの親のあの人達の趣味? あの人達はUnixやplan9の生みの親でもあるからね。
早速取ってこようと思ってInstall GOを見ると gitの再発明品であるmercurialを用意しろと言われる。そんなんgitでいいじゃんと思って やってみたけど、やってみたらだめだったので素直に従う事にした。 さすがGoogle、合わせてPythonも勧めたいのね。
冒頭付近に環境変数の事がうだうだ書いてあるが、要約すると下記を.bashrcに書いておけば OK。
export GOROOT=$HOME/go export GOBIN=$GOROOT/bin export GOOS=linux export GOAECH=386 export PATH=$PATH:$GOBIN
後は、指示通りにするだけ。 コンパイル途中の画面を眺めていると、暗号関係のTSLだとかRSAとかが出てくるのは時代の 要請それともGoogleだからこそ?
コンパイルに続いて、テストも同時に行われ 0 know bug と、大口を叩いてきたら終了だ。
私の所では
sakae@debian:~/go$ ls -l bin 合計 10160 -rwxr-xr-x 1 sakae sakae 362777 2009-11-13 11:29 6cov* -rwxr-xr-x 1 sakae sakae 242517 2009-11-13 11:29 6nm* -rwxr-xr-x 1 sakae sakae 356299 2009-11-13 11:29 6prof* -rwxr-xr-x 1 sakae sakae 187501 2009-11-13 11:27 8a* -rwxr-xr-x 1 sakae sakae 665009 2009-11-13 11:27 8c* -rwxr-xr-x 1 sakae sakae 859879 2009-11-13 11:29 8g* -rwxr-xr-x 1 sakae sakae 328322 2009-11-13 11:27 8l* -rwxr-xr-x 1 sakae sakae 1511525 2009-11-13 11:30 cgo* -rwxr-xr-x 1 sakae sakae 734140 2009-11-13 11:30 ebnflint* -rwxr-xr-x 1 sakae sakae 147291 2009-11-13 11:29 godefs* -rwxr-xr-x 1 sakae sakae 1889883 2009-11-13 11:30 godoc* -rwxr-xr-x 1 sakae sakae 1100410 2009-11-13 11:30 gofmt* -rwxr-xr-x 1 sakae sakae 218329 2009-11-13 11:29 gopack* -rwxr-xr-x 1 sakae sakae 3104 2009-11-13 11:29 gotest* -rwxr-xr-x 1 sakae sakae 821279 2009-11-13 11:30 goyacc* -rwxr-xr-x 1 sakae sakae 880229 2009-11-13 11:30 hgpatch* -rwxr-xr-x 1 sakae sakae 1484 2009-11-13 11:24 quietgcc*
こんなコマンドが出来ていた。そしてlibの下は興味深いものが無いので、目玉のpkgを見る。
sakae@debian:~/go$ ls pkg/linux_386/ archive/ ebnf.a hash.a net.a sort.a testing.a asn1.a encoding/ http.a once.a stdio.a time.a big.a exec.a image/ os.a stdio_file.so* unicode.a bignum.a exp/ image.a patch.a strconv.a utf8.a bufio.a expvar.a io.a path.a strings.a xml.a bytes.a flag.a json.a rand.a sync.a compress/ fmt.a libcgo.so* reflect.a syscall.a container/ go/ log.a regexp.a tabwriter.a crypto/ gob.a malloc.a rpc.a template.a debug/ hash/ math.a runtime.a testing/
GOの性格をすっきりと表わしているように思えるな。
で、マニュアルはどうかと言うと
sakae@debian:~/go$ godoc --http=:6060 & sakae@debian:~/go$ w3m http://localhost:6060/
で、読めるよと。これって、Googleが落ちていても大丈夫。孤立した所でも開発できまっせ と言う事です。
$GOROOTの下には、.gitならぬ、.hg が出来ていたので、早速、git を hgに置き換えて 調べてみる。
sakae@debian:~/go$ hg log | lv changeset: 4012:dbb7b18d987b user: Rob Pike <r@golang.org> date: Thu Nov 12 14:10:16 2009 -0800 summary: add a paragraph about semicolons to the tutorial. changeset: 3956:4a3f6bbb5f0c user: Ken Thompson <ken@golang.org> date: Tue Nov 10 15:05:15 2009 -0800 summary: spell it with an "e" : changeset: 0:f6182e5abf5e user: Brian Kernighan <bwk> date: Tue Jul 18 19:05:45 1972 -0500 summary: hello, world
どんだけ古いん? やっぱり初めは、"hello, world" これが正真正銘の始祖! そんじゃ、おいらも
sakae@debian:~/work$ cat hello.go package main import fmt "fmt" // Package implementing formatted I/O. func main() { fmt.Printf("Hello, world; \n"); } sakae@debian:~/work$ 8g hello.go sakae@debian:~/work$ 8l hello.8 sakae@debian:~/work$ ./8.out Hello, world;
GO FreeBSD
動くんかいな? やってみる鹿。えっと、まずは一式取り寄せだな。debianからrsyncして きちゃってもいいんだけど、例のgitもどき、mercurial があるかも確かめたいのでportsから 探してみたよ。そしたら、ちゃっかりとports/develに有ったよ。
コンパイルを始めたら、makeの文法が違うって、一発食らった。/usr/local/bin/gmake を make にして、PATHを変えて回避。
順調に進んでいるかと思ったら、src/cmd/cov の所で、install-linux なんてターゲット無いよ と言われた。 見ると
install: install-$(shell uname | tr A-Z a-z) install-linux: install-default
なんて書かれていたので、install-freebsd: に変更。継続したら、Linux特有のprocシステムコール が無いよエラー。どうせコマンドだし、無視していいかと相応の処置。同様なやつとして profもあった。プロファイラーなんて使うんかいと言う事で無視。
当然、コンパイラー作成に続くテストではエラーが発生したけど。binの下が作成 されてるっぽかったので、"hello, workd" 実施。
ちゃんと、コンパイルもリンクも出来て、いざ実行しようとすると、
8.out: Can't exec binary file.
って、言われちゃった。誰か追試お願いしますだ。