From: "Phillip Lord" <phillip.lord@russet.org.uk>
To: "\"Etienne Prud’homme\"" <e.e.f.prudhomme@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: Emacs Lisp container
Date: Tue, 27 Jun 2017 07:22:02 -0000 [thread overview]
Message-ID: <481a66a174a3059874f60d8f882cf18f.squirrel@cloud103.planethippo.com> (raw)
In-Reply-To: <87podqdtdu.fsf@x230.lts>
On Tue, June 27, 2017 3:03 am, Etienne Prud’homme wrote:
> 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!
It's a nice idea, but I think that C-level calls to setq will just ignore
your changes. Likewise for all your other alterations.
So, this will get you some of the way there, but not all of the way.
Besides which you still allow buffer changes which is, of course, a major
issue with statelessness.
Phil
next prev parent reply other threads:[~2017-06-27 7:22 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-27 3:03 Emacs Lisp container Etienne Prud’homme
2017-06-27 4:37 ` Marcin Borkowski
2017-07-02 18:06 ` Wilfred Hughes
2017-06-27 7:22 ` Phillip Lord [this message]
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=481a66a174a3059874f60d8f882cf18f.squirrel@cloud103.planethippo.com \
--to=phillip.lord@russet.org.uk \
--cc=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.