2023/02/12

2023年、Racketに触れる

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に軍配があがりそうです。

このスクエアブラケットはletlet*でも使われていました。

次にdefineがOCamlのletのように変数にも関数にも使えること。

覚えることが少ないことはいいことだ。

難問

Scheme(Racket使用)で私が現在なかなか理解できないものに「継続」があります。どういったものなのかはなんとなく分かっていますが、実践となるとまだまだ使えるものではありません。他の言語とは違い、Schemeは、この「継続」を取り出して保存できてしまうんです。

しかしながら私の「継続」についての微妙な理解では、説明できるようなレベルには達しておらず、今回は「継続」については書きません、いや書けません。

個人的には、C言語のポインタよりも難しいです。

今後、説明できるレベルまで理解できたら、書いてみようと思います。

まとめ

Racketは、LISP一族を学ぼうとお考えの方に良いかもしれない言語だと思います。

しかし、「継続」はもっと勉強が必要かもしれない。