読者です 読者をやめる 読者になる 読者になる

日々の技術日記

Web系の技術とか日常とかゲームとかをつらつらと

LiveScriptとは?

※再掲【この記事はQiitaにも掲載しています。】

関西フロントエンドUG Advent Calendar 2015 19日目の記事です。

11/21に行われた「2016年のAltJSについて語る会」という関西フロントエンドUG主催の勉強会で、
AltJSの一つであるLiveScriptについてお話してきました。

LiveScriptとは?

livescript-top.png

prelude.ls

HaskellのPreludeにちなんで、LiveScriptにもprelude.lsという関数ライブラリがあります。
インストールは、npm i prelude-ls
Underscore.jsやLodashのLiveScript版と思っていただければ大丈夫です。
(そこまで豊富な関数を取り揃えてはいませんが・・)

# Example Code
[1 to 10] |> map (* 2) |> filter (> 3) |> fold1 (+) # => 108

prelude-ls.png

Introduction

ここからはLiveScriptの機能(主に関数について)をコード例を交えてご紹介します。
公式ドキュメントにもIntroductionや文法は載っていますので、色々と試して下さい。

Class

CoffeeScriptとほぼ同様にクラス定義が行えます。
ただしconstructorの書き方だけが変わっているので注意。

class A
  # Static Method
  @name = -> @@display-name # @@ is constructor
  # Instance Method
  hoge: -> \fuga

class B extends Class # extends
  # constructor
  -> @ <<< it

A.name! # => \A
a = new A!
a.hoge! # => \fuga

B.name! # => \B
b = new B id: 1
b.hoge! # => \fuga
b.id # => 1

Function

->演算子で関数定義を行うことが出来き、関数の実行は()!で行うことが出来ます。
引数がある場合は、CoffeeScriptと同様に()を省略することが出来ます。
また、引数を宣言しておらず関数内でit句を使用すると自動的にitが定義されます。

func = -> it + 2 # function(it){ return it + 2; }
func 2 # => 4

add = (+) # function(x, y){ return x + y;}
add 1 2 # => 3

# default parameter
add = (x = 1, y = 2)-> x + y
add! # => 3
add 1 # => 4

set-cords = ({x, y})-> "#x, #y"
set-cords y: 2, x: 1 # => '1, 2'

Carrying

関数型言語の特徴の一つでもあるカリー化した関数を定義することが出来ます。

times = (x, y)--> x * y
times 3, 5 # => 15

double = times 2
double 5 # => 10

Piping

F#やElixirでも出てくるパイプ演算子|>(パイプライン演算子)を使用することが出来ます。
left |> rightだと、right(left)となります。

x = [1 2 3] |> reverse |> head #=> 3

[1 to 10] |> map ( * 3) |> filter ( > 10)

BackCalls

BackCallsはコールバックによって生み出されるインデントの深さの苦しみから開放されます。

# Normal
mysql.query sql, (err, A)->
 mysql.query sql, (err, B)->
   C = A! + B!
   ...

# BackCalls
err, A <- mysql.query sql
err, B <- mysql.query sql
C = A! + B!
...

まとめ

LiveScriptは究極のめんどくさがりが使う関数型言語です。
CoffeeScriptも他のAltJSに比べれば結構省略できることが多いですがLiveScriptは更にそれを超えています。
CoffeeScriptからの移行もそこまで複雑ではなく、公式ドキュメントにも移行ガイドが書いてあるので、
比較的簡単に導入することが出来るのかなと思っています。
npmでグローバルインストールするとインタプリタが使えるので、ターミナルでも気軽にお試しできます。

この記事や公式ドキュメントを読んで少しでもLiveScripterが増えてくれたら嬉しい限りです。
(LiveScriptは中毒性がありますので、用法用量を守って正しくお使い下さい。
 中毒になるとLiveScript無しでは生きていけなくなります。)