WindowsでJVM言語「Golo」を使ってみた。
はじめに
JVM上で実行できる動的言語「Golo 2.0」リリース という記事を今更ながらしって、どんなんだろう?っとググったけど、試してる人すらみつからなかったので試してみる。
- The Golo Programming Languageの最初を適当に実行しています。
- 最初のみなのでGolo独自機能などは触っていません。
- ほぼコードしか読んでいません。そもそもあめりか語は殆どわからないので、間違っていたら指摘してください。
- ごろー
インストール
- chocolateyでGolo入れようとしたら1.1.0しかなかった。
- ZIPで落としてきて解凍。
- binに移動して「
golo version
」でバージョン確認。
c:\>cd c:\work\20150211\golo-2.0.0\bin c:\work\20150211\golo-2.0.0\bin>golo version 2.0.0
HelloWorld
直接ファイルから実行
module hello.World function main = |args| { println("Hello world") }
- 「
golo golo --files ${ファイルPATH}
」で実行。
c:\work\20150211>golo-2.0.0\bin\golo golo --files ./helloword.golo Hello world
- もし、引数を渡したい場合には「
--args
」をつけるらしい - コード
module hello.World function main = |args| { foreach arg in args { println(arg) } }
- 実行
c:\work\20150211>golo-2.0.0\bin\golo golo --files ./hellowordWithArgs.golo --args hello world hoge huga hello world hoge huga
コンパイルして実行
- コンパイル(--output付けることでディレクトリを指定。)
c:\work\20150211>golo-2.0.0\bin\golo compile --output classes helloword.golo
- 実行。
c:\work\20150211>cd classes c:\work\20150211\classes>..\golo-2.0.0\bin\golo run --module hello.World Hello world
変数
let
とvar
がある。let
は固定値。var
は再導入可能な変数。
- コンパイルエラー
module hoge function main = |args| { let h = 1 println(h) h = 2 println(h) }
c:\work\20150211>golo-2.0.0\bin\golo golo --files ./hoge.golo [error] In Golo module: hoge.golo [error] Assigning `h` at {line=6, column=3} but it is a constant reference
- コンパイル及び実行可能。
module hoge function main = |args| { var h = 1 println(h) h = 2 println(h) }
int
とString
で型指定を試してみたけど型は指定できないみたい。
module hoge function main = |args| { int h = 1 println(h) }
c:\work\20150211>golo-2.0.0\bin\golo golo --files ./hoge.golo [error] In Golo module: hoge.golo [error] Assigning to either a parameter or an undeclared reference `h` at (line=4, column=7) [error] Undeclared reference `int` at {line=4, column=3} [error] Undeclared reference `h` at {line=5, column=11}
型
- Javaの型は普通に使えるみたい。
- Collectionは結構面白い。
- コード
module hoge function main = |args| { var tuple = [1, 2, 3] # gololang.Tuple println("tuple : " + tuple) var array = array[1, 2, 3] # Object[] println("array : " + array) var list = list[1, 2, 3] # LinkedList println("list : " + list) var vector = vector[1, 2, 3] # ArrayList println("vector : " + vector) var set = set[1, 2, 3] # LinkedHashSet println("set : " + set) var map = map[[1, "a"], [2, "b"]] # LinkedHashMap println("map : " + map) var range = [1..10] # gololang.Range println("range : " + range) }
- 実行結果
c:\work\20150211>golo-2.0.0\bin\golo golo --files ./hoge.golo tuple : tuple[1, 2, 3] array : [Ljava.lang.Object;@5b0a1d2d list : [1, 2, 3] vector : [1, 2, 3] set : [1, 2, 3] map : {1=a, 2=b} range : range(1,10)
コメント
- 行コメントは
//
ではなくて#
。 - ドキュメントコメントは
----
で囲えばいいらしい。- マークダウンで書くといいって書いてあるけど、Document生成した時いい感じにしてくれるのかな?
関数定義
- listに対してfilterとかmapとかで関数を渡すことが可能。
module hoge function main = |args| { println(list[1, 2, 3, 4]: filter(|n| -> (n % 2) == 0)) # [2, 4] println(list[1, 2, 3]: map(|n| -> n * 10)) # [10, 20, 30] }
- 関数の合成も可能。
module hoge function main = |args| { let f = |x| -> x + 1 let g = |y| -> y * 10 let h = f: andThen(g) println(h(1)) # (1 + 1) *10 = 20 let adder = |x, y| -> x - y let add2 = adder: bindAt(1, 2) # adderのyに2を設定 println(add2(5)) # 5 - 2 = 3 }