Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
5
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

@esehara@github

GorillaScript簡易ガイドブック

この記事に関連のあるAdvent Calender

 さて、皆さんこんにちは!AltJSしてますか?というわけで、記念すべきAdvent Advent Calenderの一発目は、GorillaScript Advent Calendarです!

 とはいえ、数多くのAltJSがあるじゃないの、CoffeeScriptやTypeScriptとかさあ!というもっともな声はあるわけです。しかし、AltJS界のサクラダ・ファミリアというか沢田マンションというべき謎のシンタックスが多く存在するGorillaScriptは、実際の開発に使えなくても、読み物として十分に面白い!というわけで、今回のAdvent Calenderは、GorillaScriptについて見ていきましょう。

GorillaScriptの目的とは?

 そもそもGorillaScriptの目的とは一体なんでしょうか。GorillaScriptの作者によるスライドによると、「コードの美しさを保ちつつ、コーディングのストレスを軽減することで、人間の思考をより最適化することを目的としている」らしいです。こういう大風呂敷みたいな話は大好きです。ちなみに、作者の考えによると、プログラミング言語とは、「人間の意図をマシンに伝えるための言語」というように言っています。

GorillaScriptの特徴

Immutable

 さて、GorillaScriptの特徴とは、具体的になんでしょうか。まず一つに、関数型言語の影響があることがあげられます。例えば、GorillaScriptでは、letよって変数を宣言することができますが、基本的には「変更不可能(=Immutable)な」変数として定義されます。多くの関数型言語もまた、変数を「変更可能(=mutable)」なものとして扱うことを出来るだけ避けることが殆どですが、GorillaScriptも一緒ですね。

 なぜ、変数を「変更不可能なもの」として扱うべきなのでしょうか。もしかしたら、あちらこちらに変数がたらい回しにされて、結果としてプリントしてあげないと、その変数の中身がわからないような状態になったことが無いでしょうか?少なくとも、変数が変更不可であることを保証してあるならば、その変数の宣言まで遡れば、その変数が何者であるかの保証が出来ます。そして、変更可能な場合のときだけ、そのような宣言をしてあげることで、その変数が実際に使われるまで、どのような中身であるのかわからないという宣言として扱うことが出来ます。

 GorillaScriptでは、変数を宣言するさいには、letを使い、変更可能なときには、let mutableという変数を使います。

let x = 5
x := 6 // Error

let mutable y = 5
y := 6 // perfectly fine
z := 6 // never declared, this is an error

オペレーター

 例えば、普通の開発者なら「or, and」で事を済ませるかと思います。しかし、例えばある変数と変数が同じ真理値ではないことを確認したいことはありませんか。ありますよね?そんなときのために、xorというオペレーターが用意されています。

 また、割り切れるときはtrueを返すための%%というのもあります。だって割り切れるかどうかに対していちいち=== 0で比較するの面倒くさいですよね!

let fizzbuzz(num)
  if num %% 15
    "FizzBuzz"
  else if num %% 3
    "Fizz"
  else if num %% 5
    "Buzz"
  else
    num

for i in 0 til 100
  console.log fizzbuzz i

 あと、JavaScriptを使っている人だったら、nullとかundefinedとかをチェックする機会が多いと思うのですが、これをいちいちチェックしているのは面倒くさい。未定義かをチェックしなければならないのは、JavaScripterの常です。従ってx?というので、その変数がちゃんと何らかの値が入っているかどうかチェックすることができます。

let foo = undefined
if foo?
  console.log "hi!"
else
  console.log "undefined!!"

色々なforのかたち

 GorillaScriptは、Pythonの影響からか、例えばArrayを作るためにx to yという記法、ならびにx til yというのがつかえます。そして、同時にこの記法はforを回す時も同様につかえたりします。forは構造化プログラミングの中でも大切な要素ですね。

for i in 0 til 10
  console.log i
for i in 9 to 0 by -1
  console.log i

 配列、indexと一緒に廻したりも出来ます。

for food, index in ["Apples", "Bananas", "Cherries"]
  console.log "$index: $food"

Cascade

 JavaScriptにとって、メソッドチェインは普通になっている印象ですが、しかしメソッドチェインは、そのメソッドがインスタンスを返してくれるときにしか使えませんし、また代入するとそこでブツッっと切れてしまいます。あああ!もうなんで同じインスタンスのパラメーターを設定するのにいちいち書かなきゃならないんだ!面倒くさい!そこで、Cascade syntaxですよ、お兄さん!

document.query-selector \h1
  ..style
    ..color := \red
    ..font-size := "200%"
  ..inner-HTML := "Hello, world!"

さらなる高みとしてのasync

 さらに、非同期処理とコールバック地獄は、JavaScriptを書いている人なら、結構悩まされる問題だと思います。そこで、ちゃんとasyncというのも用意。

let run(callback)
  async err, text <- fs.read-file "somefile.txt", "utf8"
  if err?
    return callback err
  callback null, do-something(text)

言語を拡張せよ: macro

さらにはmacroも

macro operator unary +?
  ASTE $node > 0
macro operator binary union, ∪
  // the following idents are available:
  //   op (which will either be "union" or "∪", i.e. "\u222a")
  //   left (which will be the node to the left of the binary operator)
  //   right (which will be the node to the right of the binary operator)

  ASTE $left.union($right)
macro operator assign union=, ∪=
  // the following idents are available:
  //   op (which will either be "union=" or "∪=", i.e. "\u222a=")
  //   left (which will be the node to the left of the assign operator)
  //   right (which will be the node to the right of the assign operator)

  // here we need to potentially cache parts of the left-hand-side, since we're referencing it twice.
  // this will convert a()[b()] to tmp1[tmp2].
  @maybe-cache-access left, #(set-left, left)
    ASTE $set-left := $left.union($right)

今すぐ始めようGorillaScript

 さあ、どうでしょうか? なんだか何でもできそうな気がしてきませんでしたか? 実際に使うかどうかはともかくとして、言語としては、いったいどういうアプローチがあるのかということをざっくりするのには、いい読み物になっている気がします。また、ある程度トランスレーターが賢いのかもしれませんが、例えば結果が明確なものに関しては、単なる変換はなく、結果だけをJavaScriptに埋め込むといった楽しいこともしてくれます。

 現代が生み出した謎の建造物、GorillaScript、みなさんも是非お楽しみください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
5
Help us understand the problem. What are the problem?