All Projects → sasagawa888 → Eisl

sasagawa888 / Eisl

Licence: other
ISLisp interpreter/compier

Programming Languages

lisp
113 projects

Easy-ISLisp

Easy-ISLisp(EISL) is an interpreter and compiler compatible with ISLisp standard. EISL was written by Kenichi Sasagawa https://qiita.com/sym_num/items/793adfe118514668e5b0

see ISLisp youtube introduction of Easy-ISLisp

Installation

Change to the git cloned or downloaded Easy-ISLisp directory.

In Linux type "sudo make install". In macOS type "sudo make install OPSYS=macos". In OpenBSD type "sudo make install OPSYS=openbsd".

After version 1.4 Windows OS is not suported. Please use WSL on Windows.

We confirmed operation in the following environments.

  • Ubuntu 16.04 GCC 5.4
  • Ubuntu 18.04 GCC 7.3
  • Raspberry Pi3 Raspbian GCC 6.3
  • Raspberry Pi3 Raspbian GCC 8.3.0
  • openSUSE Leap 42.3 GCC 4.8.5
  • Debian GNU/Linux GCC 6.3 GCC 7.3
  • Linux Mint GCC ver 5.4
  • Linux Mint GCC ver9.3.0
  • macOS 11.1 clang 12.0.0
  • OpenBSD

Invoke

eisl 

In the Linux version,the REPL is editable. If you do not desire to use the editable REPL, invoke with -r option.

eisl -r

If you desire to start after reading file, invoke with -l option. e.g.

eisl -l foo.lsp 

Other options, see EISL -h

$ eisl -h
List of options:
-c           -- EISL starts after reading compiler.lsp.
-f           -- EISL starts after reading formatter.lsp.
-h           -- display help.
-l filename  -- EISL starts after reading the file.
-r           -- EISL does not use editable REPL.
-s filename  -- EISL runs the file with script mode.
-v           -- dislplay version number.

Quit

On REPL type (quit) or Esc+Q

On not editable REPL type (quit) or CTRL+D

Editable REPL

key-bindings are as follows:

  • ctrl+F or → move right
  • ctrl+B or ← move left
  • ctrl+P or ↑ recall history older
  • ctrl+N or ↓ recall history newer
  • ctrl+A move to begin of line
  • strl+E move to end of line
  • ctrl+J ctrl+M or return insert end of line
  • ctrl+H or back-space backspace
  • ctrl+D delete one char
  • ctrl+K kill line from current positon
  • ctrl+Y yank killed line
  • Esc Tab completion

Goal

I hope that Lisp will become more popular. I hope many people enjoy Lisp. EISL aims at easy handling.

Compiler

EISL has a compiler. it generates GCC code and generates object code.

Invoke with -c option
eisl -c

or (import "compiler") in REPL

(compile-file "foo.lsp")

(load "foo.o")

example
eisl -c
Easy-ISLisp Ver1.6
> (compile-file "tests/tarai.lsp")
type inference
initialize
pass1
pass2
compiling PACK
compiling TARAI
compiling FIB
compiling FIB*
compiling ACK
compiling GFIB
compiling TAK
compiling LISTN
compiling TAKL
compiling CTAK
compiling CTAK-AUX

finalize
invoke GCC
T
> (load "tests/tarai.o")
T
> (time (tarai 12 6 0))
Elapsed Time(second)=0.024106
<undef>
> (time (ack 4 1))
Elapsed Time(second)=3.728262
<undef>
>

Compile EISL by CUDA

You can also compile EISL with nvcc(CUDA) instead of gcc.

On linux terminal type "make -f cudamake" and "sudo make install"

Now, I am adding function using CUDA

see tests/gpu-test.lsp extended array for float.

(defglobal a #2f((1.0 2.0)(3.0 4.0)))
(defglobal b #2f((1.0 2.0)(3.0 4.0)))
(gpu-mult a b)
(gpu-add a b)

extended create-array builtin-function. it can generate array for float. e.g.

(create-array '(3000 3000) 'rand 'float)

Invoke editor

edit function invoke Edlis editor. see https://github.com/sasagawa888/Edlis

(edit file-name-string) example (edit "foo.lsp")

WiringPi

On paspberry PI, Eisl includes system function of WiringPi.

EISL <==================================> C
(wiringpi-spi-setup ch speed) <===> wiringPiSPISetup (SPI_CH, SPI_SPEED)
(wiringpi-setup-gpio ) <===> wiringPiSetupGpio()
(pin-mode n 'output) <====> pinMode(n, OUTPUT) or 'input -> INPUT 'pwm-output -> PWM-OUTPUT
(digital-write n v) <===> digitalWrite(n, v)
(digital-write-byte v) <===> digitalWriteByte(value)
(digital-read pin) <===> digitalRead(pin)
(delay howlong) <===> void delay(unsigned int howLong)
(pull-up-dn-control pin pud) <===> pullUpDnControl(pin,pud)
(pwm-set-mode 'pwm-mode-ms) <===> pwmSetMode(PWM_MODE_MS); or 'pwm-mode-bal -> PWM_MODE_BAL
(pwm-set-clock n) <===> pwmSetClock(n)
(pwm-set-range n) <===> pwmSetRange(n)
(pwm-write pin value) <===> pwmWrite(pin , value)

Examples.

;;LED on/off

(defglobal pin 5)
(defglobal flag nil)

(defun test (n)
   (cond ((null flag) (wiringpi-setup-gpio)(setq flag t)))
   (pin-mode pin 'output)
   (for ((i 0 (+ i 1)))
        ((> i n) t)
        (digital-write pin 1)
        (delay 1000)
        (digital-write pin 0)
        (delay 1000)))


;;control servo moter.
;;SG90 Micro servo Digital 9g

(defun setup ()
  (cond ((null flag) (wiringpi-setup-gpio ) (setq flag t)))
  (pin-mode 18 'pwm-output)
  (pwm-set-mode 'pwm-mode-ms)
  (pwm-set-clock 400)
  (pwm-set-range 1024))

(defun test (n)
   (pwm-write 18 n))

Functions for debug

  • (trace fn1 fn2 ... fn)
  • (untrace fn1 fn2 ... fn) or (untrace)
  • (backtrace)
  • (break)
  • (macroexpand-1)

Extended functions

  • (random n) random-integer from 0 to n
  • (random-real) random-float-number from 0 to 1
  • (gbc) invoke garbage collection.
  • (gbc t) display message when invoke GC.
  • (gbc nil) not display message when invoke GC.
  • (gbc 'copy) change GC method to copying-GC
  • (gbc 'm&s) change GC method to mark & sweep
  • (heapdump n) display cell dump list from nth address
  • (instance n) display instance of nth address
  • (defmodule name body) see tests/module.lsp
  • (import x) import library. e.g. (import "compiler")
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].