Racketとは
Racketとは、LISP一族Schemeの血統の言語で、今回始めて使ってみました。
以前からSchemeをやってみたいと思っていたのですが、これまた処理系がいっぱいあり、どれをセレクトすればよいか分からなかったこともあり、Guileをちょろっと触れてみる程度でした。
しかし、2023年に入り、新たなチャレンジをしようということで、とりあえずインストールしてみました。
RacketにはDr.RacketというGUIな開発環境がありまして、Common Lisp + Emacs + Slimeのように、気軽にいろいろ試すことができます。
Dr.Racketを使わず、ターミナルにてracket -i
とすると、Racketの対話環境を起動することもできます。
基本的にはLISP一族なので、ざっくりとは使える感じです。ただRacketのほうが、いろいろ「あ、わかりやすい!」というところが多いような印象を受けます。
個人的にわかりやすいと思ったところ
まず、関数名がわかりやすい。
例えば、文字列かどうかを判定する関数はstring?
とか文字を数字にする関数char->integer
といったように、記号をうまく取り入れてわかりやすくしている感じがしました。また、Common Lispとは違い、[ ]
も使われていて、読みやすいように感じました。
Common Lisp(SBCL使用)の場合、cond
は以下のような形になります。
* (cond
((clause1) ..... )
((clause2) ..... )
(t .......))
しかし、Racketでは
* (cond
[(clause1) ..... ]
[(clause2) ..... ]
[else .......])
慣れたら特に問題ではないですが、見やすさ読みやすさで言うと、Racketに軍配があがりそうです。
このスクエアブラケットはlet
やlet*
でも使われていました。
次にdefine
がOCamlのlet
のように変数にも関数にも使えること。
覚えることが少ないことはいいことだ。
難問
Scheme(Racket使用)で私が現在なかなか理解できないものに「継続」があります。どういったものなのかはなんとなく分かっていますが、実践となるとまだまだ使えるものではありません。他の言語とは違い、Schemeは、この「継続」を取り出して保存できてしまうんです。
しかしながら私の「継続」についての微妙な理解では、説明できるようなレベルには達しておらず、今回は「継続」については書きません、いや書けません。
個人的には、C言語のポインタよりも難しいです。
今後、説明できるレベルまで理解できたら、書いてみようと思います。
まとめ
Racketは、LISP一族を学ぼうとお考えの方に良いかもしれない言語だと思います。
しかし、「継続」はもっと勉強が必要かもしれない。