旅のお供にCommon Lisp


2018年LISPアドベントカレンダー21日目の投稿です。

ちょっとした空き時間(新幹線での移動など)に、ふとS式を書きたくなった、ということはありませんか？私は時々あります。本格的にプログラムを書く訳ではないのですが、ちょっとしたアイデアを書き留めておきたい、と言った場合です。

先日、出張で新幹線に乗っている時間に、androidタブレットのCommon Lispで時間を潰していたら、結構いい感じだったので紹介したいと思います。

# 環境
上に書いたように環境はandroidタブレットです。

 端末:Nexus7(2013)
 OS: android6
 アプリ: CL REPL

CL REPLはGoogle Playからインストールすることができます。

#CL REPL
Google Playの説明を引用します。

>A Common Lisp REPL with command line and history, plus a simple editor with syntax highlighting, simple visual paren-matching, basic auto-completion, a file dialog for opening/saving files, and a simple debug dialog.
>It uses the ECL implementation for the Lisp side, and Qt5/QML for the UI.

ウェブサイトは次になります。 

* https://gitlab.com/eql/EQL5-Android/tree/master/examples/REPL

パスにEQL5-Androidとあるので、EQL5をAndroidに移植したと思われますが、EQL5とは
何でしょう？いろいろたぐって行くと上位にありました。

* https://gitlab.com/eql/EQL5 

> Embedded Qt Lisp (Qt5 binding embedded in ECL, embeddable in Qt)

とあるので、Common Lisp処理系はECLになります。


# 使ってみよう
起動すると次の画面になります(キーボードは英語に変更させて使っています)。

![top .png](https://qiita-image-store.s3.amazonaws.com/0/323744/3eb63871-bbd0-a822-9468-82b31c9b9730.png)

上の広いウィンドウ、中ほどの一行ウィンドウ、下の薄紫ウィンドウと三つの部分からなります。キーボードはあくまで入力用に薄紫のウィンドウに重なっているだけです。上のウィンドウは通常のエディタのバッファになります。一行ウィンドウは評価用の入力部、薄紫のウィンドウはその評価結果を表示するウィンドウになります。パッと見ると、`(`と`)`がキーボードと独立で表示されているのが目に付きます。`(`と`)`はキーボードのモード(英字/記号)に関わらず入力できるので、Lisp用に作られている感が伝わってきます。

`(+ 1 2 3)`と入力したところは以下になります。`<<`と`>>`が一行ウィンドウの下に表示されていますが、これは入力ヒストリを利用するものです。`<<`はprevious、`>>`はnextになります。

![input-1.png](https://qiita-image-store.s3.amazonaws.com/0/323744/92aa45fe-45f8-5a4f-77b5-c8fe5708f1a3.png)

エンターキーを入力すると結果が下のウィンドウに表示されます。

![result-input1.png](https://qiita-image-store.s3.amazonaws.com/0/323744/329e809f-2117-1384-83de-878207fd801b.png)


# もっと長い入力をするには
先ほど入力した一行ウィンドウは本当に一行しか入力できません。括弧の対応が取れないままエンターキーを入力するとエラーになります。では、長いS式を入力するにはどうするか？バッファが用意されているので、バッファに入力してそのS式を評価します。

次の画面はバッファにS式を入力し、S式を長押しタップしたところです[^1]。長押しタップをするとメニューが表示されます。


[^1]: 入力したコードは先日の関西LISPユーザ会でmyaoさんが[発表した記事](https://myaosato.github.io/fold-with-lisp-2.html)を使わせてもらっています。

![input-2.png](https://qiita-image-store.s3.amazonaws.com/0/323744/4fc63446-7cb7-b996-226b-ac7f0994a861.png)

メニューの「λ」をタップすると次になります。

![result-input2.png](https://qiita-image-store.s3.amazonaws.com/0/323744/250ad688-a2f3-444f-e277-5ede236bd9b8.png)

`my-foldr`が定義されたことが判ります。`(my-foldr #'+ (list 1 2 3) 0)`を入力した結果は次になります。

![execute.png](https://qiita-image-store.s3.amazonaws.com/0/323744/56144901-9747-6289-8ffe-1710ec146af1.png)

正しく動いています。

また、バッファでの入力時にはエンターキーで自動でインデントしてくれるなどのちょっとした気遣いが嬉しいです。

# ファイルを扱う
Google Playの説明に
>plus a simple editor

とあるようにエディタでもあるのでファイルを扱うことができます。右上のボタンをタップすると次のようにメニューが追加されます。

![file-menu.png](https://qiita-image-store.s3.amazonaws.com/0/323744/5b515b24-7b2d-abe1-7004-52eb13f25a72.png)

追加されたメニューは上から、バッファクリア、ファイルを開く、ファイルを保存、バッファを評価になります。

# 終了する
キーボードが表示されている画面では「戻る」の向きが下になっています。

![before-close.png](https://qiita-image-store.s3.amazonaws.com/0/323744/83878bb8-fd94-3ba6-7365-0396c44750d2.png)

これをタップするとキーボードの表示がなくなります。

![close.png](https://qiita-image-store.s3.amazonaws.com/0/323744/1d43772e-124b-7387-e2de-066c5ff1db8c.png)

この状態で「戻る」をタップするとCL REPLは終了します。キーボードをタップするとキーボード表示となります。カーソルはバッファなどでカーソルキーとして機能します。

# おしまい
androidで動くCommon LispであるCL REPLを紹介しました。紹介しきれていませんが、スペースダブルタップでコンプリーションしてくれるなど助かる機能が他にもあります。ただ、まだ不具合がいろいろあるようで、この記事を書くために使っている時にハングアップすることもありました。

年末年始を迎え、帰省や旅行などで出かける人も多いでしょう。androidタブレット/スマフォをお持ちならCL REPLで遊んでみてはいかがでしょうか。