ラズパイでISLispを動かす


はじめに

自作のISLisp処理系であるEasy-ISLisp(EISL)をラズパイで動かすことができました。しかし、この間、情報の錯そう、不足からかなり難航しました。今後のために記録しておきます。
小学生のお小遣いでも買えるラズパイで、小学生でも簡単操作のISLisp処理系を目指しています。

ハード

本体 ラズベリーパイ3 Model B
ディスプレー Elecrow 7インチ HDMI LCD 1024*600
USBマウス USBキーボード AC電源アダプタ

ラズパイの設定

市販の書籍を買い込んでその通りにやったのですが、どうやら現時点ではラズパイ3に対応しきれていないようです。当てにならないということがよくわかりました。Qiitaの情報により助けられました。
基本的な設定は書籍やネット情報のとおりにやればOS起動まではスムーズです。問題は下記の2点でした。

LCDの設定

Elecrowの7インチLCDは自動では解像度認識を正しくできません。手動での設定が必要になります。次のようにしてnanoエディタを起動して追加書き込みしました。

bootファイルにnanoで書き込みます。

sudo nano /boot/config.txt

そして、ファイルの最後に次のコードを追加します。

max_usb_current=1
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 480 60 6 0 0 0 

しかし、これでは解像度は正しくなりません。下記のように修正しました。

max_usb_current=1
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 1024 600 60 6 0 0 0 

このように修正した後にリブートすると解像度は正しくなります。最初画面の下側に帯状に縦線が表示されてしまいますが、1時間ほど使っていたら消えていきました。どうしてなのかはわかりません。

Elecrowの製品はマニュアルが中国語と英語しかありません。そして、どうも一部の記述がおかしいように思います。親切なマニュアルとはとても思えません。

有線LANの設定

私の場合、有線LANで手動での設定が必要な環境でした。IPアドレスなどを設定する必要があります。書店で書籍を買い求めてその通りにやってみるのですが、まったうまくいきません。ネットの情報通りに設定してもだめです。どうやら、それらの情報はモデル2の頃の情報に基づいているようです。

次のようにnanoでファイルを読み出します。

sudo nano /etc/dhcpcd.conf

そしてファイルの最後に次のように付け加えました。

interface eth0
static ip_address=192.168.11.40/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1

実際には自分のルータの設定に書き換えてください。

EISLのコンパイル

ネットがつながったので公開しているUbuntu用の実行ファイルをダウンロードして、実行させてみました。実行形式が違うのでエラーになります。考えてみたらUbuntuはx86でコンパイルされていますし、ラズパイはARMですから。

書籍付録のEISL全ソースコードをダウンロード、解凍し、コンパイルします。makeと打ち込むだけです。これでラズパイ用のEISLが生成されています。 

./eisl

で起動します。

不明なこと

EISLを起動してload関数でファイルをloadするとエラーになります。原因を追究したところ、ラズパイに搭載されているGCCではgetcがEOFを検出していないように思います。(確証はありません)
getcは本来の仕様ではint型を返すこととなっています。しかし、EISLではchar型でgetcの値を受け取っています。それが原因かもしれません。

エラーにはなりますが、関数はloadされており、関数を実行することはできます。付属のprologコードのppisl.lspは起動することができました。

おおよそ解決しました。getc関数の返り値をchar型としていたためです。int型に書きなおして動作するようになりました。MinGWやUbuntuではcharでも動いていたのですが、ラズパイ版のGCCは厳格に仕様に従わないといけないようです。

ver0.45でEOFには対応できています。付属の8クイーンのコードが一部、動きません。現在、原因調査中です。

試行錯誤

ラズパイ3が出て間もないためなのか、情報不足、情報錯そうの感じがあります。新たな発見、上記記述の誤りが見つかりましたら、都度、アップデートいたします。

CUIエディタ

ラズパイにはnanoエディタが付属しています。これでもLispコードは書けるのですが、インデントやカッコ対応の表示は、ちょっとツライです。そこで、CUIのシンプルな専用エディタを組み込み関数として実装中です。 参考写真

ver0.48でCUIエディタを追加しました。詳細は下記の記事をお読みください。
EISLの組み込みエディタ - Qiita

実行ファイル

ラズパイ用も含めた実行ファイルは下記にて無償公開しております。
http://eisl.kan-be.com/library/easyislisp.html

ソースコード

電子書籍の付録として販売しております。下記アドレスです。