(自称)クラウド型言語 Clalaを発表してきた

AWS Lambda Meetup #0というイベントで、(自称)クラウド型言語 Clalaを発表してきました。

winebarrel/clala · GitHub

全然ネタがなくて休日を2日ほどつぶして作ったんですが、全然受けなかったです…

Clala

Schemeの超サブセットでサンプルコードは以下の通りです。

(define i 100)

(define func1 (clambda (x) (+ x i)))
(define func2 (clambda (y) (* y i)))

(func1 1 (lambda (x)
  (begin
    (print x)
    (func2 x (lambda (y)
      (begin
        (print y)
        (exit)))))))

clambdaという関数でふつーの関数っぽくAWS Lambdaに関数を定義できます。 上記の例だと、関数をふたつLambdaに定義して、func1のコールバックで戻り値を出力しつつ、その戻り値でfunc2を呼び出す…みたいなことをやってます。一応、アピールポイントとしてはコンテキストをクラウドに持って行けるので、クロージャーが動くってとこですかね。

(exit)を呼んでるのはLambdaに定義した関数のクリーニングのためです。 ほんとは終了タイミングをフックして処理できるとよかったんですが、Node力が低く無理でした。

一応解説的なもの

だいたい予想はつくと思いますが、JavaScriptだとFunction#toSource()が使えるので、コンテキストも含めて

{
  func1: { apply: function() { ... }, env: { outer: { i:100 } },
  func2: { apply: function() { ... }, env: { outer: { i:100 } },
  ...
}

みたいなJavaScriptのソースに展開して、Lambda上で無理矢理実行してます。

言語の処理自体はほとんどlis.pyの移植で、パースはPEG.js使ってます。PEG.js便利。

あと、Lambdaは個々のInvokeの結果を受け取るのが辛いので、SQSと組み合わせて無理矢理戻り値を受け取るようにしました。

所感

実用にはならないと思っていたんですが、非同期の世界を持ってくるのが辛いですね…。 Schemeっぽい言語でやるなら同期的、かつ並列処理も書ける感じにしたかったんですが、やはりNode力が低くてむりぽでした。 せっかくv0.11でコルーチン使えるようにしたんですが意味なかったです。

あと、終了とかGCのタイミングをフックできないのもつらいですねー。せめてon('exit')で、残ってるイベント全部はき出してくれればいいのに。

まあ、言語を実装するほどではないにしろ、そのうちDSLか何かでLambdaの実行を制御するなにかはで来るような気がします。

それにしても受けなかったなぁ…