Ruby風な言語Crystalを試してみた(Ruby風な文法編)

Ruby風な言語Crystalを試してみた(Ruby風な文法編)

らぼろぐ

    金子 将範

    最近CRYSTALという言語の存在を知りました。
    この言語は以下のような特徴があるようです。

    • Ruby 風な文法
    • 型推論による変数・メソッドの静的型付け
    • 容易に記述可能な C 言語バインディング
    • マクロとジェネリクスによるコンパイル時のコード生成
    • 高速なネイティブコードを出力

    自分はRubyが得意なので、どれくらいRubyっぽいのかサンプルを見てみた所、思っていた以上にRubyに似ていて驚きました。

    検証環境

    • macOS Sierra 10.12.1
    • Crystal 0.20.1

    MACにインストール

    homebrewでインストール可能です。

     brew install crystal-lang
    

    バージョンは以下の通りです。

    # crystal -v
    Crystal 0.20.1 (2016-12-05)
    

    簡単なプログラム

    自分が初めてプログラミングをした時に出された課題を書いてみたいと思います。

    問題
    1〜100まで足した結果を出力するプログラムをつくりなさい

    num = 0
    (1..100).each do |n|
      num = num + n
    end
    puts num
    

    Rubyでは当然動きました。

    # ruby addition.rb 
    5050
    

    CrystalもRubyにシンタックスが似ているし動くだろうと思って適当に実行したら動きました。

    # crystal addition.rb
    5050
    

    どうやらCrystalはRubyで書いたプログラムが動くぐらいにRubyに似ているようです。

    injectを使ってみます。

    puts (1..100).inject(&:+)
    

    実行したらエラーになりました。
    injectが駄目ということではなく、どうやら、暗黙のto_procが引っかかったようです。

    # crystal addition.rb
    Error in addition.rb:1: expected a function type, not Symbol
    puts (1..100).inject(&:+)
    

    ということで、適当に書き直してみました。

     puts (1..100).inject { |p, n| p + n }
    

    駄目でした。

    # crystal addition.rb
    Error in addition.rb:1: undefined method 'inject' for Range(Int32, Int32) (did you mean 'reject'?)
    puts (1..100).inject { |p, n| p + n }
                  ^~~~~~
    Rerun with --error-trace to show a complete error trace.
    

    いくらシンタックスが似ているといっても全く同じのはずはないので当然の結果だとは思います。

    REPL

    RubyのirbのようなREPLは提供されていないようですが、crystal-icrを使うと実現出来るようです。

    https://github.com/greyblake/crystal-icr

    Crystal言語のREPL(crystal-icr)をインストール

    Githubから取得して、makeします。

    git clone https://github.com/greyblake/crystal-icr.git
    cd crystal-icr
    make
    

    実行できました。

    # ./bin/icr
    icr(0.20.1) > puts "Hello World!!"
    Hello World!!
     => nil
    

    この記事はいかがでしたか?

    writer
    金子 将範
    金子 将範

    スペシャリスト

    新しいことや難しい課題に挑戦することにやりがいを感じ、安定やぬるい事は退屈だと感じます。 考えるより先に手が動く、肉体派エンジニアで座右の銘は諸行無常。 大事なのは感性、プログラミングにおいても感覚で理解し、感覚で書きます。

    関連記事

    ページトップへ