|
Name |
|
Date |
Size |
#Lines |
LOC |
| .. | | 03-May-2022 | - |
| bench/ | H | 26-Dec-2021 | - | 2,616 | 1,986 |
| cii/ | H | 07-May-2022 | - | 7,962 | 7,620 |
| compat/ | H | 26-Dec-2021 | - | 24 | 16 |
| documents/ | H | 03-May-2022 | - | 3,874 | 3,077 |
| example/ | H | 03-May-2022 | - | 2,639 | 2,000 |
| library/ | H | 03-May-2022 | - | 8,450 | 6,595 |
| nana/ | H | 03-May-2022 | - | 114,281 | 99,753 |
| tests/ | H | 26-Dec-2021 | - | 2,005 | 1,284 |
| verify/ | H | 26-Dec-2021 | - | 14,533 | 11,754 |
| .gitattributes | H A D | 26-Dec-2021 | 49 | 3 | 2 |
| .gitignore | H A D | 26-Dec-2021 | 36 | 9 | 7 |
| README-ja.md | H A D | 26-Dec-2021 | 8 KiB | 268 | 202 |
| README.md | H A D | 26-Dec-2021 | 7.7 KiB | 265 | 209 |
| bignum.c | H A D | 26-Dec-2021 | 21.1 KiB | 1,177 | 966 |
| cell.c | H A D | 26-Dec-2021 | 34.3 KiB | 1,537 | 1,252 |
| compute.c | H A D | 26-Dec-2021 | 22.6 KiB | 1,059 | 848 |
| data.c | H A D | 26-Dec-2021 | 32.9 KiB | 2,035 | 1,724 |
| dextension.d | H A D | 26-Dec-2021 | 444 | 26 | 19 |
| disl.d | H A D | 26-Dec-2021 | 1.3 KiB | 82 | 77 |
| edit.c | H A D | 26-Dec-2021 | 13.5 KiB | 735 | 655 |
| edlis.c | H A D | 03-May-2022 | 39.1 KiB | 1,987 | 1,859 |
| edlis.h | H A D | 26-Dec-2021 | 1.3 KiB | 55 | 46 |
| eisl.h | H A D | 26-Dec-2021 | 41.3 KiB | 1,321 | 1,227 |
| error.c | H A D | 26-Dec-2021 | 21.6 KiB | 672 | 645 |
| extension.c | H A D | 26-Dec-2021 | 14.5 KiB | 771 | 617 |
| fast.h | H A D | 26-Dec-2021 | 14.3 KiB | 943 | 836 |
| ffi.h | H A D | 26-Dec-2021 | 2.7 KiB | 82 | 69 |
| fprint.tst | H A D | 26-Dec-2021 | 16.7 KiB | 2 | 1 |
| function.c | H A D | 03-May-2022 | 112.7 KiB | 5,268 | 4,467 |
| gbc.c | H A D | 26-Dec-2021 | 5.5 KiB | 324 | 247 |
| long.c | H A D | 26-Dec-2021 | 618 | 28 | 25 |
| long.h | H A D | 26-Dec-2021 | 210 | 11 | 7 |
| main.c | H A D | 03-May-2022 | 44.5 KiB | 2,148 | 1,868 |
| makefile | H A D | 26-Dec-2021 | 2.9 KiB | 130 | 112 |
| syn_highlight.c | H A D | 26-Dec-2021 | 6 KiB | 183 | 162 |
| syntax.c | H A D | 26-Dec-2021 | 58.3 KiB | 2,446 | 2,107 |
| term.h | H A D | 03-May-2022 | 3.5 KiB | 233 | 180 |
| ~A | H A D | 26-Dec-2021 | 16.7 KiB | 1 | 1 |
README-ja.md
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
README.md
1# Easy-ISLisp
2
3Easy-ISLisp(EISL) is an interpreter and compiler compatible with the [ISLisp standard](https://minejima.jp/ISLispHyperDraft/islisp-v23.html).
4EISL was written by Kenichi Sasagawa
5https://qiita.com/sym_num/items/793adfe118514668e5b0
6
7See [ISLisp](https://en.wikipedia.org/wiki/ISLISP)
8YouTube [introduction of Easy-ISLisp](https://www.youtube.com/watch?v=KfrRyKMcTw8&t=330s)
9
10# Installation
11
12Change to the git cloned or downloaded Easy-ISLisp directory.
13
14- Type "git submodule init; git submodule update" (if you forget the makefile should do this automatically).
15- In Linux type "sudo make install".
16- In macOS type "sudo make install OPSYS=macos".
17- In OpenBSD type "sudo make install OPSYS=openbsd".
18- You can also supply a "PREFIX=$HOME" (or wherever) argument if you want.
19- For more advanced hacking on the interpreter itself, you can build a debug-mode executable by supplying a "DEBUG=1" argument to make, but this is unlikely to be needed by someone starting out.
20
21You may get an error that the curses.h file cannot be found when compiling EISL & Edlis.
22In this case, enter the following from the terminal
23
24```sh
25sudo apt install libncurses-dev
26```
27
28After version 1.4 Windows OS is not supported. Please use WSL on Windows.
29see [Visual Studio Code Remote Development Extension Pack](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.vscode-remote-extensionpack)
30
31We confirmed operation in the following environments.
32- Ubuntu 16.04 GCC 5.4
33- Ubuntu 18.04 GCC 7.3
34- Raspberry Pi3 Raspbian GCC 6.3
35- Raspberry Pi3 Raspbian GCC 8.3.0
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
43If you cloned the repo anyplace but *$HOME/eisl*,
44you should set the `EASY_ISLISP` enviroment variable to point to it.
45
46### GNU Emacs support
47ISLisp-mode of Emacs is developed by Mr. sasanidas.
48Watch the video to see how to use it. https://vimeo.com/614514131
49
50Repository URL: https://gitlab.com/sasanidas/islisp-mode
51
52
53# Invoke
54
55```sh
56eisl
57```
58
59In the Linux version,the REPL is editable. If you do not want to use the editable REPL, invoke with the -r option.
60
61```sh
62eisl -r
63```
64
65
66If you want to start after reading a file, use the -l command-line option.
67e.g.
68
69```sh
70eisl -l foo.lsp
71```
72
73For other options, see `eisl -h`:
74
75```
76$ eisl -h
77List of options:
78-c -- EISL starts after reading compiler.lsp.
79-f -- EISL starts after reading formatter.lsp.
80-h -- display help.
81-l filename -- EISL starts after reading the file.
82-r -- EISL does not use editable REPL.
83-s filename -- EISL runs the file with script mode.
84-v -- dislplay version number.
85```
86
87You can also write ISLisp scripts,
88following the usual UNIX convention of pointing to the interpreter with the first line, e.g.
89```lisp
90#!/Users/me/bin/eisl -s
91(format (standard-output) "Hello world~%")
92```
93
94# Quit
95
96In the REPL type (quit) or Esc+Q.
97
98In the non-editable REPL type (quit) or CTRL+D.
99
100# Editable REPL
101
102Key bindings are as follows:
103
104| Key | Description |
105| ----------- | --------------------- |
106| ctrl+F or → | move right |
107| ctrl+B or ← | move left |
108| ctrl+P or ↑ | recall history older |
109| ctrl+N or ↓ | recall history newer |
110| ctrl+A | move to begin of line |
111| strl+E | move to end of line |
112| ctrl+J ctrl+M or return | insert end of line |
113| ctrl+H or back-space | backspace |
114| ctrl+D | delete one char |
115| ctrl+K | kill line from current positon |
116| ctrl+Y | yank killed line |
117| Esc Tab | completion |
118
119# Goal
120
121I hope that Lisp will become more popular.
122I hope many people enjoy it.
123EISL aims to be user-friendly.
124
125# Compiler
126
127EISL has a compiler.
128It generates C code that can be compiled using gcc or clang to object code.
129
130Invoke with the -c option,
131`eisl -c`
132or `(import "compiler")` in the REPL.
133Then you can
134```lisp
135(compile-file "foo.lsp")
136(load "foo.o")
137```
138
139For example:
140
141```
142eisl -c
143Easy-ISLisp Ver1.6
144> (compile-file "tests/tarai.lsp")
145type inference
146initialize
147pass1
148pass2
149compiling PACK
150compiling TARAI
151compiling FIB
152compiling FIB*
153compiling ACK
154compiling GFIB
155compiling TAK
156compiling LISTN
157compiling TAKL
158compiling CTAK
159compiling CTAK-AUX
160
161finalize
162invoke GCC
163T
164> (load "tests/tarai.o")
165T
166> (time (tarai 12 6 0))
167Elapsed Time(second)=0.024106
168<undef>
169> (time (ack 4 1))
170Elapsed Time(second)=3.728262
171<undef>
172>
173```
174
175# Invoke editor
176
177By default the `edit` function invokes the
178[Edlis](https://github.com/sasagawa888/Edlis)
179editor.
180But note that it respects the UNIX convention of the `VISUAL` and `EDITOR` environment variables, so if either of those is defined it will be used instead.
181
182(edit file-name-string) example (edit "foo.lsp")
183
184# WiringPi
185
186On paspberry PI, Eisl includes system function of WiringPi.
187
188```lisp
189EISL <==================================> C
190(wiringpi-spi-setup ch speed) <===> wiringPiSPISetup (SPI_CH, SPI_SPEED)
191(wiringpi-setup-gpio ) <===> wiringPiSetupGpio()
192(pin-mode n 'output) <====> pinMode(n, OUTPUT) or 'input -> INPUT 'pwm-output -> PWM-OUTPUT
193(digital-write n v) <===> digitalWrite(n, v)
194(digital-write-byte v) <===> digitalWriteByte(value)
195(digital-read pin) <===> digitalRead(pin)
196(delay howlong) <===> void delay(unsigned int howLong)
197(pull-up-dn-control pin pud) <===> pullUpDnControl(pin,pud)
198(pwm-set-mode 'pwm-mode-ms) <===> pwmSetMode(PWM_MODE_MS); or 'pwm-mode-bal -> PWM_MODE_BAL
199(pwm-set-clock n) <===> pwmSetClock(n)
200(pwm-set-range n) <===> pwmSetRange(n)
201(pwm-write pin value) <===> pwmWrite(pin , value)
202```
203
204### Examples.
205
206```lisp
207;;LED on/off
208
209(defglobal pin 5)
210(defglobal flag nil)
211
212(defun test (n)
213 (cond ((null flag) (wiringpi-setup-gpio)(setq flag t)))
214 (pin-mode pin 'output)
215 (for ((i 0 (+ i 1)))
216 ((> i n) t)
217 (digital-write pin 1)
218 (delay 1000)
219 (digital-write pin 0)
220 (delay 1000)))
221
222
223;;control servo moter.
224;;SG90 Micro servo Digital 9g
225
226(defun setup ()
227 (cond ((null flag) (wiringpi-setup-gpio ) (setq flag t)))
228 (pin-mode 18 'pwm-output)
229 (pwm-set-mode 'pwm-mode-ms)
230 (pwm-set-clock 400)
231 (pwm-set-range 1024))
232
233(defun test (n)
234 (pwm-write 18 n))
235```
236
237# Functions for debug
238- (trace fn1 fn2 ... fn)
239- (untrace fn1 fn2 ... fn) or (untrace)
240- (backtrace)
241- (break)
242- (macroexpand-1)
243
244# Extended functions
245
246| Function | Description |
247| --------------------- | ---------------------------------------------- |
248| (random n) | random-integer from 0 to n |
249| (random-real) | random-float-number from 0 to 1 |
250| (gbc) | invoke garbage collection. |
251| (gbc t) | display message when invoke GC. |
252| (gbc nil) | not display message when invoke GC. |
253| (gbc 'copy) | change GC method to copying-GC |
254| (gbc 'm&s) | change GC method to mark & sweep |
255| (heapdump n) | display cell dump list from nth address |
256| (instance n) | display instance of nth address |
257| (defmodule name body) | see tests/module.lsp |
258| (import x) | import library. e.g. (import "compiler") |
259| (quit) | quit from interpreter |
260| (load filename) | load code from file e.g. (load "foo.lsp") |
261| (getenv var) | get environment-var e.g. (getenv "EASY_ISLISP")|
262| (line-argument n) | get nth argument from OS. n is zero base |
263| (print obj) | print obj to standard-stream |
264
265