Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/Wilfred/peval
partial evaluator for elisp
https://github.com/Wilfred/peval
emacs-lisp partial-evaluators
Last synced: 2 months ago
JSON representation
partial evaluator for elisp
- Host: GitHub
- URL: https://github.com/Wilfred/peval
- Owner: Wilfred
- Created: 2017-04-27T22:47:52.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2017-12-20T09:54:36.000Z (about 7 years ago)
- Last Synced: 2024-10-19T10:42:38.650Z (3 months ago)
- Topics: emacs-lisp, partial-evaluators
- Language: Emacs Lisp
- Size: 41 KB
- Stars: 6
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Partial Evaluator for Emacs Lisp [![Build Status](https://travis-ci.org/Wilfred/peval.svg?branch=master)](https://travis-ci.org/Wilfred/peval) [![Coverage Status](https://coveralls.io/repos/github/Wilfred/peval/badge.svg?branch=master)](https://coveralls.io/github/Wilfred/peval?branch=master)
Partially evaluate elisp forms. Handy for debugging, and [inspired by
a discussion on Reddit](https://www.reddit.com/r/emacs/comments/60tl6o/tips_on_reading_dense_emacs_lisp_code/dfa92hg/) and
[this talk on Program Slicing](https://www.youtube.com/watch?v=dSqLt8BgbRQ).## Fundamental Limitations
* Assumes lexical scope.
* Assumes that if a macro call site does not contain a symbol, than
that symbol is not modified (TODO: example).
* (No plan to implement) recursive functions.## Current limitations
* Some special forms are not implemented.
* Loops are not implemented and their effects are ignored.
* Does not macro expand forms to see if we can simplify them entirely.
* Does not simplify known s-expressions in macro arguments that are
known to be evaluated.* Does not properly print simplified values that are now lists.
* Mutation `(push 1 foo)` is not handled correctly.
* Mutation does not currently cause preservation of let
forms. E.g. `(let ((x 1)) (fn1 x)` can be `(fn1 1)` (numbers are
value types), but `(let ((x '(1))) (fn1 x) (fn2 x))` cannot be
`(progn (fn1 '(1)) (fn2 '(1)))`.* (Fundamental?) Does not handle aliasing of values.