山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

WindowsでJVM言語「Golo」を使ってみた。

はじめに

JVM上で実行できる動的言語「Golo 2.0」リリース という記事を今更ながらしって、どんなんだろう?っとググったけど、試してる人すらみつからなかったので試してみる。

  • The Golo Programming Languageの最初を適当に実行しています。
  • 最初のみなのでGolo独自機能などは触っていません。
  • ほぼコードしか読んでいません。そもそもあめりか語は殆どわからないので、間違っていたら指摘してください。
  • ごろー

インストール

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

変数

  • letvarがある。
    • 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)
}
  • intStringで型指定を試してみたけど型は指定できないみたい。
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
}