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

TAG

  • このエントリーをはてなブックマークに追加
金子 将範
スペシャリスト 金子 将範 rubyist

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