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