1# Easy-ISLisp 2 3Easy-ISLisp (EISL) はISLisp標準の解釈実行器及び翻訳系です。 4 5Kenichi Sasagawa氏が制作しました([Easy-ISLispのコンパイラ - Qiita](https://qiita.com/sym_num/items/793adfe118514668e5b0))。 6 7ISLispについては英語版Wikipedia([ISLisp](https://en.wikipedia.org/wiki/ISLISP))もご覧下さい。 8 9次の動画ではEISLの紹介と導入方法の説明を行っています(英語) 10[![Introduction of Easy-ISLisp](http://img.youtube.com/vi/KfrRyKMcTw8/0.jpg)](https://youtu.be/KfrRyKMcTw8) 11 12 13## 導入方法 14 151. Gitでクローンした,又は単にダウンロードしたEasy-ISLispのディレクトリに移動する。 16- GNU/Linuxをお使いの場合: 端末上で`sudo make install`と入力する。 17- macOSをお使いの場合: 端末上で `sudo make install OPSYS=macos`と入力する。 18- OpenBSDをお使いの場合: 端末上で `sudo make install OPSYS=openbsd`と入力する。 19- お望みなら "PREFIX=$HOME" (or wherever) という引数を与えることもできます。 20注意 21Edlisのコンパイルでcurses.hファイルが見つからないというエラーになる場合があります。この場合にはターミナルより次のように入力してください。 22 23```sh 24sudo apt install libncurses-dev 25``` 26 27ver1.4以後はWindowsはサポートされません。WindowsでWSLをお使いください。 28注:WindowsバージョンのVS-CODEをWSLで使用する場合 29参照 [Windows Subsystem for Linux で Visual Studio Code の使用を開始する](https://docs.microsoft.com/ja-jp/windows/wsl/tutorials/wsl-vscode) 30 31 32動作確認している環境は次の通りです。 33- Ubuntu 16.04 GCC 5.4 34- Ubuntu 18.04 GCC 7.3 35- Raspberry Pi3 Raspbian GCC 6.3 36- openSUSE Leap 42.3 GCC 4.8.5 37- Debian GNU/Linux GCC 6.3 GCC 7.3 38- Linux Mint GCC ver 5.4 39- Linux Mint GCC ver9.3.0 40- macOS 11.1 clang 12.0.0 41- OpenBSD 42 43 44## 実行 45 46* GNU/Linuxをお使いの場合: 端末上で`eisl`と入力する。 47 48Linux版では,対話状態で編集ができます。 49編集機能を無効にしたい場合は,`-r`オプションを付けて起動して下さい。 50```console 51$ eisl -r 52``` 53 54### Emacs サポート 55sasanidasさんによってISLisp-modeが開発、公開されています。ビデオをご覧ください。 56https://gitlab.com/sasanidas/islisp-mode 57https://vimeo.com/614514131 58 59 60他の起動オプショオンについては下記を参照してください。 61 62``` 63$ eisl -h 64List of options: 65-c -- EISL starts after reading compiler.lsp. 66-f -- EISL starts after reading formatter.lsp. 67-h -- display help. 68-l filename -- EISL starts after reading the file. 69-r -- EISL does not use editable REPL. 70-s filename -- EISL runs the file with script mode. 71-v -- dislplay version number. 72``` 73 74## 終了 75(quit)と入力するか、Escキーを押したあとでQキーを押すと処理系が終了します。 76 77-rオプションで起動した場合には(quit)あるいはCTRL+Dで処理系が終了します。 78 79## 対話状態での編集機能 80 81キー束縛は次の通りです。 82 83| キー入力 | 動作 | 84|:---:|:---:| 85| <kbd>Ctrl</kbd>+<kbd>F</kbd>又は<kbd>→</kbd> | 右に移動 86| <kbd>Ctrl</kbd>+<kbd>B</kbd>又は<kbd>←</kbd> | 左に移動 87| <kbd>Ctrl</kbd>+<kbd>P</kbd>又は<kbd>↑</kbd> | 履歴を遡る 88| <kbd>Ctrl</kbd>+<kbd>N</kbd>又は<kbd>↓</kbd> | 履歴を進む 89| <kbd>Ctrl</kbd>+<kbd>A</kbd> | 行頭へ移動 90| <kbd>Ctrl</kbd>+<kbd>E</kbd> | 行末へ移動 91| <kbd>Ctrl</kbd>+<kbd>J</kbd>,<kbd>ctrl</kbd>+<kbd>M</kbd>又は<kbd>Enter</kbd> | 改行を挿入 92| <kbd>Ctrl</kbd>+<kbd>H</kbd>又は<kbd>back-space</kbd> | 前方削除 93| <kbd>Ctrl</kbd>+<kbd>D</kbd> | 後方削除 94| <kbd>Ctrl</kbd>+<kbd>K</kbd> | 行の現在以後を切り取り 95| <kbd>Ctrl</kbd>+<kbd>Y</kbd> | 切り取った行を貼り付け 96| <kbd>Esc</kbd><kbd>Tab</kbd> | 補完 97 98 99## 目標 100 101Lispの知名度が向上することを願っています。 102Lispをもっと多くの人々が楽しんでくれることを願っています。 103EISLは簡単に操作できることを目的にしています。 104 105 106## 翻訳系 107 108EISLは翻訳系 (compiler) を備えています。 109GCC向けのソースコード及び〔GCCを介して〕オブジェクトコードを生成します。 110 111### 用法 112 113```consloe 114$ eisl -c # -cオプションを付けて起動する。 115``` 116又は 117```lisp 118(load "library/compiler.lsp") 119 120(compile-file "foo.lsp") 121 122(load "foo.o") 123``` 124 125### 使用例 126 127```console 128$ eisl -c 129Easy-ISLisp Ver1.6 130> (compile-file "tests/tarai.lsp") 131type inference 132initialize 133pass1 134pass2 135compiling PACK 136compiling TARAI 137compiling FIB 138compiling FIB* 139compiling ACK 140compiling GFIB 141compiling TAK 142compiling LISTN 143compiling TAKL 144compiling CTAK 145compiling CTAK-AUX 146 147finalize 148invoke GCC 149T 150> (load "tests/tarai.o") 151T 152> (time (tarai 12 6 0)) 153Elapsed Time(second)=0.024106 154<undef> 155> (time (ack 4 1)) 156Elapsed Time(second)=3.728262 157<undef> 158> 159``` 160 161翻訳系自身を翻訳することができます。 162翻訳はずっと早くなります。 163 164Raspberry Pi 3では,主記憶領域不足のせいで`compiler.o`ファイルが利用できません。 165`compiler.lsp`を使って下さい。 166 167 168## エディタを起動する 169 170EISLはエディタを備えています。 171エディタを利用するには`edit`関数を用いて下さい。 172 173併せてご覧ください: [sasagawa888/Edlis: Simple CUI editor for Easy-ISLisp](https://github.com/sasagawa888/Edlis) 174 175### 用法 176 177```scheme 178(edit file-name-string) 179``` 180 181### 例 182 183```lisp 184(edit "tests/foo.lsp") 185``` 186 187 188## WiringPi 189 190Raspberry PiにおいてはEislはWiringPiの組込み関数を含みます。 191 192 193```lisp 194EISL <==================================> C 195(wiringpi-spi-setup ch speed) <===> wiringPiSPISetup (SPI_CH, SPI_SPEED) 196(wiringpi-setup-gpio ) <===> wiringPiSetupGpio() 197(pin-mode n 'output) <====> pinMode(n, OUTPUT) or 'input -> INPUT 'pwm-output -> PWM-OUTPUT 198(digital-write n v) <===> digitalWrite(n, v) 199(digital-write-byte v) <===> digitalWriteByte(value) 200(digital-read pin) <===> digitalRead(pin) 201(delay howlong) <===> void delay(unsigned int howLong) 202(pull-up-dn-control pin pud) <===> pullUpDnControl(pin,pud) 203(pwm-set-mode 'pwm-mode-ms) <===> pwmSetMode(PWM_MODE_MS); or 'pwm-mode-bal -> PWM_MODE_BAL 204(pwm-set-clock n) <===> pwmSetClock(n) 205(pwm-set-range n) <===> pwmSetRange(n) 206(pwm-write pin value) <===> pwmWrite(pin , value) 207``` 208 209 210### 例 211 212```lisp 213;; LED点滅 214 215(defglobal pin 5) 216(defglobal flag nil) 217 218(defun test (n) 219 (cond ((null flag) (wiringpi-setup-gpio)(setq flag t))) 220 (pin-mode pin 'output) 221 (for ((i 0 (+ i 1))) 222 ((> i n) t) 223 (digital-write pin 1) 224 (delay 1000) 225 (digital-write pin 0) 226 (delay 1000))) 227 228 229;; サーボモータを制御する。 230;; SG90 Micro servo Digital 9g 231 232(defun setup () 233 (cond ((null flag) (wiringpi-setup-gpio ) (setq flag t))) 234 (pin-mode 18 'pwm-output) 235 (pwm-set-mode 'pwm-mode-ms) 236 (pwm-set-clock 400) 237 (pwm-set-range 1024)) 238 239(defun test (n) 240 (pwm-write 18 n)) 241``` 242 243 244## デバッグ用関数 245- `(trace fn1 fn2 ... fn)` 246- `(untrace fn1 fn2 ... fn)`又は`(untrace)` 247- `(backtrace)` 248- `(break)` 249- `(macroexpand-1)` 250 251 252## 拡張関数 253- `(random n)` 0からnまでの無作為な整数 254- `(random-real)` 0から1までの無作為な浮動小数 255- `(gbc)` ガーベッジコレクション (GC) を実行. 256 - `(gbc t)` GC実行時に通達する。 257 - `(gbc nil)` GC実行時に通達しない。 258 - `(gbc 'copy)`GCの方法をコピーイングGCに切り換える。 259 - `(gbc 'm&s)`GCの方法をマーク&スイープGCに切り換える。 260- `(heapdump n)`n番目のセルからダンプリストを表示する。 261- `(instance n)`n番目のセルの実体を表示する。 262- `(defmodule name body)` tests/module.lsp 参照 263- `(import lib)` ライブラリをインポートする。 264- `(quit)` インタプリタを終了する。 265- `(getenv var)` OSから環境変数を取得する 例 (getenv "EASY_ISLISP) 266- `(line-argument n)` OSからn番目の起動オプションを取得する。ゼロスタート 267- `(print obj)` objを標準ストリームに出力する。 268