From: "Etienne Prud’homme" <e.e.f.prudhomme@gmail.com>
To: emacs-devel@gnu.org
Subject: Emacs Lisp container
Date: Mon, 26 Jun 2017 23:03:25 -0400 [thread overview]
Message-ID: <87podqdtdu.fsf@x230.lts> (raw)
Hi,
I’ve tried to find a library or some tool to execute Elisp in a running
session while keeping the same environment, but found none. Some call
it a container or sandbox or even jail.
What I mean by that, is that I would like to execute a body of code and
get the result without actually modifying the variables, functions,
loaded features, etc. of the current session.
I’m fully aware that starting a new session seem to do the same thing,
but I want to execute the piece of code in the *current running
environment*.
I finally came up with a small library I named _container_[1]. There
are many ways to escape the container (like using `funcall` & `apply`
and also using `eval` on a quoted `eval` form). It’s more of a proof a
concept than a working library right now.
e.g.
> (let ((container-ignore-error t)
> (container
> (add-to-list 'load-path "~/Documents/")
> (require 'foo)
> (setq emacs-version "0.0.0")
> emacs-version)) ; => "0.0.0"
> emacs-version ; => 26.0.50
The above snippet doesn’t (seem to) have side-effects.
What it does is the following:
* Saves the window configuration and opens a new buffer.
* Overrides the `require` & `load` functions to unload after the
container finished executing.
* Overrides the `load-theme` function to restore the original theme
configuration after.
* Overrides the `set`, `setq` & `set-default` functions to make the
variable buffer local.
* Overrides the `eval` function to apply the above. This one is
particularly tricky since we could escape it using a quoted form. I’m
considering disabling it altogheter and signal an error.
* (Work in Progress) Overrides the `funcall` & `apply` functions to
apply the rules above. This is also tricky since the evaluation
process doesn’t make much sense to me. I’m probably not used enough
with evalutation. I can’t figure out why:
> (funcall #'setq test 1)
works while:
> (funcall #'setq 'test 1)
doesn’t work.
Of course, I may be totally wrong in my approach and would appreciate
being corrected. Help and comments are welcomed!
[1] https://github.com/notetiene/emacs-lisp-container
--
Etienne
next reply other threads:[~2017-06-27 3:03 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-27 3:03 Etienne Prud’homme [this message]
2017-06-27 4:37 ` Emacs Lisp container Marcin Borkowski
2017-07-02 18:06 ` Wilfred Hughes
2017-06-27 7:22 ` Phillip Lord
2017-06-28 19:07 ` Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87podqdtdu.fsf@x230.lts \
--to=e.e.f.prudhomme@gmail.com \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.