ダウンロードとコンパイル
作者のページ http://www.cs.berkeley.edu/~bh/ には、あたかも実行ファイルがあるような事が書いてあるが、アクセス出来ないのでソースからコンパイル。
svn co https://ucblogo.svn.sourceforge.net/svnroot/ucblogo ucblogo
./configure && make
# makefile の everything を all に変えるなどする
make install
これで logo コマンドが使える。
プログラムの実行
logo で起動。シェルにプログラムを打ち込む。
$ logo Welcome to Berkeley Logo version 5.6 ? repeat 3 [forward 100 right 120]
ファイル名を引数に書くと、起動時に読み込んでシェル開始。ファイルの最後に bye を書くとそのまま終了。
$ vi hello print "hello bye $ logo hello hello
カレントディレクトリに コマンド名.lg というファイルを置いて置くと、最初にそのコマンドを使った時自動で読み込まれる。自作ライブラリに便利
$ vi triangle.lg to triangle repeat 3 [ forward 100 right 120] end $ logo Welcome to Berkeley Logo version 5.6 ? triangle
文法
- 大文字小文字は無視
- コメントは ;
- 文字のクォートは \
- シンボルのクォートは "
- リストは [] で空白区切り
? run [show count [hello\ world]] ; クォートされるので要素は一つ 1
変数
? make "seven 3 + 4 ;; 代入の時は変数名をクォートする。 ? show :seven ;; 参照の時は変数名にコロン : をつける。 7 ? show seven ;; 参照の時のコロンは省略してもよい 7 ? define "seven [[][output 777]] ? show seven ;; 同じ名前のコマンドがあるとコロンは省略出来ない。 777 ? show :seven 7
リストとしての関数 (template-based itaration)
LOGO ではリストがそのまま無名関数になる。LISP と違って、複数のコマンドを一つのリストに全部入れる。区切りはコマンドの標準の引数の数で勝手に判断する。
run [forward 100 right 120 forward 100 right 120 forward 100 right 120]
括弧で実行の優先順位を変えられるが、リストとしての構造と、括弧は関係ない。
? show item 2 [forward (sum 20 20 20)] ;; リストとしては (sum で一語 (sum
無名関数が引数をとる場合は apply を使う。
? print apply [[x] :x + :x ][7] ;; リストの先頭に仮引数のリストを置く 14 ? print apply [? + ? ][7] ;; 引数が一つの場合は ? が使える。 14 ? print apply [[x] [print "Answer output :x + :x]][7] ;; 複数のコマンドを書く時はリストの中に入れる。output は return みたいな意味。 14
関数定義
to を使った関数定義
? to double :x > output :x + :x > end double defined ? double 7
define を使った関数定義
? define "double2 [[x] [output :x + :x]] ? po "double2 ;; 関数定義を参照 to double2 :x output :x + :x end
セーブ
? save "mystuff ;; 定義されてある関数全部が保存される。
リスト操作
セミコロンはコメント。show は print と違ってオブジェクトをそのまま表示
? show first [1 2] ;; (car '(1 2)) 1 ? show butfirst [1 2] ;; (cdr '(1 2)) [2] ? show combine 1 [2] ;; (cons 1 '(2)) [1 2] ? show butfirst (combine "apple "orage) ;; LISP と違って正しくないリストが作れない。単語の連結になる。 ppleorage