はじめに
JVM上で実行できる動的言語「Golo 2.0」リリース
という記事を今更ながらしって、どんなんだろう?っとググったけど、試してる人すらみつからなかったので試してみる。
インストール
- 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
直接ファイルから実行
- 公式にでかでかと乗っているHelloWorldをコピーして、helloworld.goloとして保存。(拡張子は適当。)
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
変数
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
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
}