Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/federicotdn/pimacs
A partial, experimental implementation of an Elisp interpreter written in Go
https://github.com/federicotdn/pimacs
elisp emacs go golang interpreter lisp
Last synced: 3 months ago
JSON representation
A partial, experimental implementation of an Elisp interpreter written in Go
- Host: GitHub
- URL: https://github.com/federicotdn/pimacs
- Owner: federicotdn
- License: gpl-3.0
- Created: 2021-09-02T23:50:20.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-07-07T20:26:49.000Z (7 months ago)
- Last Synced: 2024-10-12T23:13:15.407Z (4 months ago)
- Topics: elisp, emacs, go, golang, interpreter, lisp
- Language: Go
- Homepage:
- Size: 1.25 MB
- Stars: 29
- Watchers: 4
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
## Summary
A partial, experimental implementation of an Elisp (Emacs Lisp) interpreter, written in Go.
## Project goals
- Practice Go development.
- Learn more about the Emacs internals, particularly the Elisp interpreter.
- Learn about Lisp interpreter design in general.
- Practice reading C code.
- Learn about lower level functions such as `setjmp`, `longjmp`, etc.
- Learn about the general challenges found when creating a text editor.## Usage
Assuming you have the Go compiler installed, simply use `make build` to compile Pimacs, and then `./pimacs` to start the REPL.Note that many, many Elisp functions and macros are **not** implemented. You can, however, use the following (among others):
```
intern read-from-string read load eval funcall apply progn prog1 cond
setq and or if while quote function defconst let let* catch
unwind-protect condition-case throw signal prin1 print princ
prin1-to-string null sequencep consp listp symbolp stringp
number-or-marker-p char-or-string-p integerp numberp bufferp
characterp char-table-p vectorp boundp fboundp makunbound fmakunbound
car cdr car-safe cdr-safe setcar setcdr symbol-plist symbol-name set
fset symbol-value symbol-function eq defalias + < bare-symbol cons
list length equal eql assq assoc memq get put plistp plist-get plist-put
nconc provide nreverse reverse require nthcdr nth mapcar buffer-string
insert current-buffer set-buffer get-buffer buffer-name buffer-list
get-buffer-create read-from-minibuffer getenv-internal recursive-edit
make-char-table char-table-range set-char-table-range
char-table-parent set-char-table-parent multibyte-string-p %
```Note that some of these may be only partially implemented, or be a stub/placeholder.
### Examples
Set a variable and read it:
```elisp
> (setq greeting "hello")
"hello"
> greeting
"hello"
```Create a function and call it:
```elisp
> (fset 'twice (function (lambda (x) (+ x x))))
(lambda (x) (+ x x))
> (twice 21)
42
```Try out a non-local exit:
```elisp
> (catch 'test (throw 'test 123))
123
```Create a vector of integers:
```elisp
> (setq vec [1 2 3 4])
[1 2 3 4]
> (vectorp vec)
t
```Use backquotes:
```elisp
> (setq lst '(2 3 4))
(2 3 4)
> `(1 ,@lst 5 6)
(1 2 3 4 5 6)
```Create a multibyte string:
```elisp
> (setq s "ñandú")
"ñandú"
> (multibyte-string-p s)
t
```## Design and general notes
In order to read about the design choices for Pimacs, how it works internally, and how it is different from Emacs' Elisp interpreter, see the [design.md](etc/design.md) document.## Tests
Use `make test` to run the test suite.## Similar projects
Check out [Rune](https://github.com/CeleritasCelery/rune), a re-implementation of Emacs from scratch using Rust.## License
Like Emacs, Pimacs is licensed under the GNU General Public License, version 3.