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.

って、言われちゃった。誰か追試お願いしますだ。