• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..03-May-2022-

bench/H26-Dec-2021-2,6161,986

cii/H07-May-2022-7,9627,620

compat/H26-Dec-2021-2416

documents/H03-May-2022-3,8743,077

example/H03-May-2022-2,6392,000

library/H03-May-2022-8,4506,595

nana/H03-May-2022-114,28199,753

tests/H26-Dec-2021-2,0051,284

verify/H26-Dec-2021-14,53311,754

.gitattributesH A D26-Dec-202149 32

.gitignoreH A D26-Dec-202136 97

README-ja.mdH A D26-Dec-20218 KiB268202

README.mdH A D26-Dec-20217.7 KiB265209

bignum.cH A D26-Dec-202121.1 KiB1,177966

cell.cH A D26-Dec-202134.3 KiB1,5371,252

compute.cH A D26-Dec-202122.6 KiB1,059848

data.cH A D26-Dec-202132.9 KiB2,0351,724

dextension.dH A D26-Dec-2021444 2619

disl.dH A D26-Dec-20211.3 KiB8277

edit.cH A D26-Dec-202113.5 KiB735655

edlis.cH A D03-May-202239.1 KiB1,9871,859

edlis.hH A D26-Dec-20211.3 KiB5546

eisl.hH A D26-Dec-202141.3 KiB1,3211,227

error.cH A D26-Dec-202121.6 KiB672645

extension.cH A D26-Dec-202114.5 KiB771617

fast.hH A D26-Dec-202114.3 KiB943836

ffi.hH A D26-Dec-20212.7 KiB8269

fprint.tstH A D26-Dec-202116.7 KiB21

function.cH A D03-May-2022112.7 KiB5,2684,467

gbc.cH A D26-Dec-20215.5 KiB324247

long.cH A D26-Dec-2021618 2825

long.hH A D26-Dec-2021210 117

main.cH A D03-May-202244.5 KiB2,1481,868

makefileH A D26-Dec-20212.9 KiB130112

syn_highlight.cH A D26-Dec-20216 KiB183162

syntax.cH A D26-Dec-202158.3 KiB2,4462,107

term.hH A D03-May-20223.5 KiB233180

~AH A D26-Dec-202116.7 KiB11

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