言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

ucb logo

ダウンロードとコンパイル

作者のページ 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

まとめ、LOGO と LISP の違い

  • どちらもプログラムをリストとして表現する
  • ソース上で、LOGO のリストは必ずクォートされている。
  • LISP では一つのリストが一つの関数適用だが、LOGO では一つのリストに複数の関数適用。
  • LOGO では正しいリストしか作れない。