* Re: async 1.0 [not found] ` <E1ShiKM-0000Aa-5G@fencepost.gnu.org> @ 2012-06-21 21:23 ` John Wiegley 2012-06-22 7:00 ` Teemu Likonen 2012-06-22 11:38 ` Richard Stallman 0 siblings, 2 replies; 36+ messages in thread From: John Wiegley @ 2012-06-21 21:23 UTC (permalink / raw) To: rms; +Cc: Emacs developers >>>>> Richard Stallman <rms@gnu.org> writes: > async.el uses `start-process' to spawn a child Emacs process for the > purpose of invoking the lambda that is passed as the first argument to > `async-start'. > I see it would work, but wouldn't it be horribly slow to start up? You know, Emacs is suprisingly fast to execute if you use "emacs -batch -Q". For example: vulcan ~ $ average -n 100 emacs -Q -batch --eval "(+ 10 20)" 0.0393513631821 It's only 39.4ms overhead per invocation to use Emacs this way -- plus the time required load modules used by the async process, and injection of the variable environment. For example: vulcan ~ $ average -n 100 emacs -Q -batch \ --eval "(progn (require 'smtpmail) (+ 10 20))" 0.143285052776 Now we're up to 143ms. What makes this OK is that the job I'm asking `async-start' to do takes many seconds, such that the overhead of starting a new Emacs interpreter is completely lost in the time required to do the work -- time otherwise spent with me staring at a wait cursor. As a further example: In Gnus, hitting M-g on the emacs-devel group takes around 60s (I have a lot of back articles). If async.el were integrated, this operation would return instantly, with some kind of fontification to show the group being updated in the background, and blocking behavior if I hit RET to actually visit the group before it's done. That's kind of how dired-async.el operates now: When you copy a bunch of large files, control returns to you immediately, and each file is colorized with a yellow background that gets removed once that copy operation is completed. John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-21 21:23 ` async 1.0 John Wiegley @ 2012-06-22 7:00 ` Teemu Likonen 2012-06-22 10:54 ` John Wiegley 2012-06-22 11:38 ` Richard Stallman 1 sibling, 1 reply; 36+ messages in thread From: Teemu Likonen @ 2012-06-22 7:00 UTC (permalink / raw) To: John Wiegley; +Cc: rms, emacs-devel John Wiegley [2012-06-21 16:23:26 -0500] wrote: > You know, Emacs is suprisingly fast to execute if you use "emacs -batch -Q". > For example: > > vulcan ~ $ average -n 100 emacs -Q -batch --eval "(+ 10 20)" > 0.0393513631821 It loads quickly from cache: $ time emacs -Q --batch --eval t real 0m0.044s user 0m0.024s sys 0m0.020s But: $ sync; sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches' $ time emacs -Q --batch --eval t real 0m2.288s user 0m0.036s sys 0m0.020s ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 7:00 ` Teemu Likonen @ 2012-06-22 10:54 ` John Wiegley 2012-06-22 12:39 ` Michael Albinus [not found] ` <82d34r8ej9.fsf@gmail.com> 0 siblings, 2 replies; 36+ messages in thread From: John Wiegley @ 2012-06-22 10:54 UTC (permalink / raw) To: Teemu Likonen; +Cc: rms, emacs-devel >>>>> Teemu Likonen <tlikonen@iki.fi> writes: > It loads quickly from cache: > real 0m0.044s > But: > real 0m2.288s Understood, but still miniscule compared to the 30 seconds I have to wait to send an e-mail with a multi-megabyte attachment. Now, a smart `fork' primitive could make this all moot, if it were able to fork the "base" state of Emacs only.... John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 10:54 ` John Wiegley @ 2012-06-22 12:39 ` Michael Albinus 2012-06-22 22:02 ` John Wiegley [not found] ` <82d34r8ej9.fsf@gmail.com> 1 sibling, 1 reply; 36+ messages in thread From: Michael Albinus @ 2012-06-22 12:39 UTC (permalink / raw) To: Teemu Likonen; +Cc: rms, emacs-devel John Wiegley <johnw@newartisans.com> writes: >>>>>> Teemu Likonen <tlikonen@iki.fi> writes: > >> It loads quickly from cache: >> real 0m0.044s > >> But: >> real 0m2.288s > > Understood, but still miniscule compared to the 30 seconds I have to wait to > send an e-mail with a multi-megabyte attachment. > > Now, a smart `fork' primitive could make this all moot, if it were able to > fork the "base" state of Emacs only.... Or you keep the Emacs daemons running in the background, waiting for new tasks. Communication could be via D-Bus (queued services). But I have no idea, how much it would improve reactiveness. And it wouldn't run on all platforms Emacs supports. > John Best regards, Michael. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 12:39 ` Michael Albinus @ 2012-06-22 22:02 ` John Wiegley 2012-07-04 17:10 ` Samuel Bronson 0 siblings, 1 reply; 36+ messages in thread From: John Wiegley @ 2012-06-22 22:02 UTC (permalink / raw) To: emacs-devel >>>>> Michael Albinus <michael.albinus@gmx.de> writes: > Or you keep the Emacs daemons running in the background, waiting for new > tasks. Communication could be via D-Bus (queued services). But I have no > idea, how much it would improve reactiveness. > > And it wouldn't run on all platforms Emacs supports. And it introduces state bugs, which would be insane to debug, since presently there is no a way to debug the child Emacs. I'm having a hard time even getting stack traces from the point of failure (a condition-case handler gives you the backtrace for the handler, not the error's origin. This may need new functionality in Emacs to pass the trace as part of the error data). I've been talking with someone else who is interested in creating a Swank backend for Elisp that would make such debugging possible, but even then it's not something I'd want to rely on after only the 20th `async-start' call failed, though all the prior ones had succeeded... The startup cost for async Emacs is currently dwarfed by the size of the tasks I'm using it for. If your async job is only running for a few hundred milliseconds, I would say don't use async.el for that job, rather than trying to optimize that case. John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 22:02 ` John Wiegley @ 2012-07-04 17:10 ` Samuel Bronson 2012-07-05 4:09 ` John Wiegley 0 siblings, 1 reply; 36+ messages in thread From: Samuel Bronson @ 2012-07-04 17:10 UTC (permalink / raw) To: emacs-devel John Wiegley <jwiegley@gmail.com> wrote: > >>>>> Michael Albinus <michael.albinus@gmx.de> writes: > > > Or you keep the Emacs daemons running in the background, waiting for new > > tasks. Communication could be via D-Bus (queued services). But I have no > > idea, how much it would improve reactiveness. > > > > And it wouldn't run on all platforms Emacs supports. > > And it introduces state bugs, which would be insane to debug, since presently > there is no a way to debug the child Emacs. I'm having a hard time even > getting stack traces from the point of failure (a condition-case handler gives > you the backtrace for the handler, not the error's origin. This may need new > functionality in Emacs to pass the trace as part of the error data). I've long thought Emacs should keep the backtrace along with the error/condition/exception (whichever you want to call it), like Python does: the way things are now is fairly painful even for single-process debugging, in all but the simplest cases. Captured backtraces would allow the user to manually examine only those errors that they are actually interested in, and should permit handlers to augment them with additional information before re-throwing. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-07-04 17:10 ` Samuel Bronson @ 2012-07-05 4:09 ` John Wiegley 2012-07-05 19:58 ` Samuel Bronson 0 siblings, 1 reply; 36+ messages in thread From: John Wiegley @ 2012-07-05 4:09 UTC (permalink / raw) To: emacs-devel >>>>> Samuel Bronson <naesten@gmail.com> writes: > I've long thought Emacs should keep the backtrace along with the > error/condition/exception (whichever you want to call it), like Python does: > the way things are now is fairly painful even for single-process debugging, > in all but the simplest cases. Captured backtraces would allow the user to > manually examine only those errors that they are actually interested in, and > should permit handlers to augment them with additional information before > re-throwing. I agree. Does anybody with experience in this area know how difficult this would be to add? John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-07-05 4:09 ` John Wiegley @ 2012-07-05 19:58 ` Samuel Bronson 0 siblings, 0 replies; 36+ messages in thread From: Samuel Bronson @ 2012-07-05 19:58 UTC (permalink / raw) To: John Wiegley; +Cc: emacs-devel On Jul 5, 2012, at 12:09 AM, John Wiegley wrote: >>>>>> Samuel Bronson <naesten@gmail.com> writes: > >> I've long thought Emacs should keep the backtrace along with the >> error/condition/exception (whichever you want to call it), like >> Python does: >> the way things are now is fairly painful even for single-process >> debugging, >> in all but the simplest cases. Captured backtraces would allow the >> user to >> manually examine only those errors that they are actually >> interested in, and >> should permit handlers to augment them with additional information >> before >> re-throwing. > > I agree. Does anybody with experience in this area know how > difficult this > would be to add? I haven't got any experience to speak of, but I did notice that the current API for error/condition handling involves giving handlers a single value of the form (ERROR-SYMBOL . DATA), where ERROR-SYMBOL and DATA are the two things that were passed to `signal'. There is no obvious place to cram an extra BACKTRACE value, and making a new type that acted like a cons but had an extra field would be rather evil... I noticed this while trying to figure out how to get ert.el to report *both* a backtrace *and* the accompanying error message when an error occurs during testing. Right now, it's easy enough to get a backtrace (ert.el already does this using a call to `backtrace' in an `unwind- protect' cleanup) or an error message (just quote/comment out the cleanup)... Oh. I can just remove the "(kill-emacs 2)", I guess? Of course, that changes the exit code for this case to 1, which is meant to indicate test failures, not testing errors. And the backtrace is absurdly long, and comes before the actual error message. I guess there's always the `debugger' variable? ^ permalink raw reply [flat|nested] 36+ messages in thread
[parent not found: <82d34r8ej9.fsf@gmail.com>]
* Re: async 1.0 [not found] ` <82d34r8ej9.fsf@gmail.com> @ 2012-06-22 21:50 ` John Wiegley 2012-06-23 1:44 ` Stefan Monnier ` (2 more replies) 0 siblings, 3 replies; 36+ messages in thread From: John Wiegley @ 2012-06-22 21:50 UTC (permalink / raw) To: Emacs developers; +Cc: Sivaram Neelakantan >>>>> Sivaram Neelakantan <nsivaram.net@gmail.com> writes: > As a lowly user of Emacs, is this going to get into the main branch as I > seem to be doing a lot of stuff in Emacs that makes the wait icon a regular > screen feature? Getting async.el into the main branch can happen next week, if Stefan and RMS approve. But modifying Emacs packages to take advantage of asnynchronicity would require a lot more time and testing. One thing that would make async.el _incredibly_ useful would be a `call/cc' function in Emacs. Then I could write the following: (defun some-complicated-command () (interactive) (async-start/cc (lambda () ... do hard processing in a sub-emacs ...) ;; Instead of being called with just the return value, the ;; finish function is now also called with the result of ;; (call/cc) after invoking the sub-Emacs (lambda (ret cont) (funcall cont))) (message "This processing happens *after* the callback is called.")) The difference here is that right now, `async-start' returns to the *caller* immediately, with finalization code in the callback. If I had `call/cc', `async-start/cc' would return to the *user* immediately. The callback's only job would be to call the continuation, which would resume execution of the stack that has spawned the asynchronous process. The issue this addresses is that right now, if you call `async-start' when call stacks are deep (Gnus, Eshell, etc.), the code has to be made aware that finalization has been moved to a callback function. It essentially has to be "short-circuited", to know that asynchronicity is involved. With continuations, we can push the current runtime stack into a variable, pop back to the Emacs event loop immediately, and then resume that runtime stack once the asynchronous function has finished executing. Stefan/Chong: how hard would this be to add? I'm aware we'd have to move away from reliance on the C stack; but since they were able to make Python stackless, I wonder how hard it would be to make Emacs Lisp the same? John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 21:50 ` John Wiegley @ 2012-06-23 1:44 ` Stefan Monnier 2012-06-23 3:00 ` Stefan Monnier 2012-06-23 6:25 ` async 1.0 Stephen J. Turnbull 2 siblings, 0 replies; 36+ messages in thread From: Stefan Monnier @ 2012-06-23 1:44 UTC (permalink / raw) To: Emacs developers; +Cc: Sivaram Neelakantan > Stefan/Chong: how hard would this be to add? I'm aware we'd have to > move away from reliance on the C stack; but since they were able to > make Python stackless, I wonder how hard it would be to make Emacs > Lisp the same? It's pretty much the same problem as the one that the concurrency branch tackled: having several stacks at the same time. In the concurrency branch, they made switching from one branch to another fairly fast because it seemed to be an important property. In your case, that property might be less important, so you could use a different approach where you unwind&rewind the specpdl stack. Not using the C stack at all would require significant changes to the C code, tho. But you don't need that as long as you enforce that the continuations are not called more than once. Then you just need several C stacks (pthreads provides that, for example). Stefan ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 21:50 ` John Wiegley 2012-06-23 1:44 ` Stefan Monnier @ 2012-06-23 3:00 ` Stefan Monnier 2012-06-23 16:26 ` Lennart Borgman 2012-06-23 21:08 ` John Wiegley 2012-06-23 6:25 ` async 1.0 Stephen J. Turnbull 2 siblings, 2 replies; 36+ messages in thread From: Stefan Monnier @ 2012-06-23 3:00 UTC (permalink / raw) To: Emacs developers; +Cc: Sivaram Neelakantan >> As a lowly user of Emacs, is this going to get into the main branch as I >> seem to be doing a lot of stuff in Emacs that makes the wait icon a regular >> screen feature? > Getting async.el into the main branch can happen next week, if Stefan and RMS > approve. I'm not completely sure about including it at this point. But you can put it up on GNU ELPA, of course. Stefan ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-23 3:00 ` Stefan Monnier @ 2012-06-23 16:26 ` Lennart Borgman 2012-06-23 21:08 ` John Wiegley 1 sibling, 0 replies; 36+ messages in thread From: Lennart Borgman @ 2012-06-23 16:26 UTC (permalink / raw) To: Stefan Monnier; +Cc: Sivaram Neelakantan, Emacs developers On Sat, Jun 23, 2012 at 5:00 AM, Stefan Monnier <monnier@iro.umontreal.ca> wrote: >>> As a lowly user of Emacs, is this going to get into the main branch as I >>> seem to be doing a lot of stuff in Emacs that makes the wait icon a regular >>> screen feature? >> Getting async.el into the main branch can happen next week, if Stefan and RMS >> approve. > > I'm not completely sure about including it at this point. But you can > put it up on GNU ELPA, of course. Here is a somewhat related wish for RPC calls between two Emacs: http://sourceforge.net/mailarchive/forum.php?thread_name=4FE5DA0C.8000203%40siege-engine.com&forum_name=cedet-devel ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-23 3:00 ` Stefan Monnier 2012-06-23 16:26 ` Lennart Borgman @ 2012-06-23 21:08 ` John Wiegley 2012-06-23 21:28 ` Jeremiah Dodds ` (2 more replies) 1 sibling, 3 replies; 36+ messages in thread From: John Wiegley @ 2012-06-23 21:08 UTC (permalink / raw) To: emacs-devel >>>>> Stefan Monnier <monnier@iro.umontreal.ca> writes: > I'm not completely sure about including it at this point. But you can put > it up on GNU ELPA, of course. I want this to be a core service any Emacs author can use, not something that requires users to install a package from ELPA. Is there a problem with my including it? I am fully signed up with the FSF. John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-23 21:08 ` John Wiegley @ 2012-06-23 21:28 ` Jeremiah Dodds 2012-06-23 21:50 ` Thierry Volpiatto 2012-06-24 15:02 ` Christopher Schmidt 2 siblings, 0 replies; 36+ messages in thread From: Jeremiah Dodds @ 2012-06-23 21:28 UTC (permalink / raw) To: emacs-devel John Wiegley <jwiegley@gmail.com> writes: >>>>>> Stefan Monnier <monnier@iro.umontreal.ca> writes: > >> I'm not completely sure about including it at this point. But you can put >> it up on GNU ELPA, of course. > > I want this to be a core service any Emacs author can use, not something that > requires users to install a package from ELPA. > > Is there a problem with my including it? I am fully signed up with the FSF. > > John It strikes me as the type of thing that could benefit by releasing through ELPA first, and then including in core, a sort of "beta" release style that should help catch any ... things that need caught. Just my two cents. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-23 21:08 ` John Wiegley 2012-06-23 21:28 ` Jeremiah Dodds @ 2012-06-23 21:50 ` Thierry Volpiatto 2012-06-24 15:02 ` Christopher Schmidt 2 siblings, 0 replies; 36+ messages in thread From: Thierry Volpiatto @ 2012-06-23 21:50 UTC (permalink / raw) To: emacs-devel John Wiegley <jwiegley@gmail.com> writes: >>>>>> Stefan Monnier <monnier@iro.umontreal.ca> writes: > >> I'm not completely sure about including it at this point. But you can put >> it up on GNU ELPA, of course. > > I want this to be a core service any Emacs author can use, not something that > requires users to install a package from ELPA. Agree, I vote for inclusion in Emacs, this package works really well now. > Is there a problem with my including it? I am fully signed up with the FSF. > > John > > -- Thierry Get my Gnupg key: gpg --keyserver pgp.mit.edu --recv-keys 59F29997 ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-23 21:08 ` John Wiegley 2012-06-23 21:28 ` Jeremiah Dodds 2012-06-23 21:50 ` Thierry Volpiatto @ 2012-06-24 15:02 ` Christopher Schmidt 2012-06-24 15:42 ` Bastien ` (3 more replies) 2 siblings, 4 replies; 36+ messages in thread From: Christopher Schmidt @ 2012-06-24 15:02 UTC (permalink / raw) To: emacs-devel John Wiegley <jwiegley@gmail.com> writes: > I want this to be a core service any Emacs author can use, not ^^^^^^^^^^^^ > something that requires users to install a package from ELPA. > > Is there a problem with my including it? I am fully signed up with > the FSF. Whilst this is an incredibly interesting package, I do not think that async.el should be a "core service" that may be used by other core packages. This approach to asynchronousy breaks things. I have customizations all over the place. I add functionality to tons of hooks and I have lots of defadvice's around core functions. `async-inject-variables' does not help very much in this regard as it just handles the tip of the iceberg. It does not remotely cover all customisation points that might need to be translated to the child Emacs instance. smtpmail-async would break my setup. It would break my setup in a way very hard to fix. Other than that, GNU Emacs has excellent asynchronous process and network facilities already. Why not use them? In this case one does not loose customisation, progress, error, debugging and bidirectional communication functionality. Of course this would require some development effort, but in the end there are only very few core packages (tramp, dired, mail sending, anything else?) that benefit from a true asynchronous dispatch-and-forget implementation anyway. There are tons of real issues with async.el. To make a long story short, I think true asynchronous I/O in Emacs is a hard, and forking is not a solution. Do not get me wrong. This is an interesting package. When it comes to side-effect free CPU work that does not require user feedback this is the way to go. (I have no actual example for this use-case, though.) When it comes to I/O, and this is what all posts in this thread are about, async.el IMO totally undermines everything Emacs stands for. It seems to be like a forbidden fruit. A nice short-term solution with severe long-term consequences. If this package makes it into GNU Emacs, please make every single usage opt-in by default. Document on a per use-case basis which functions and hooks are run in the child Emacs instance. If async.el somehow finds its way on my machine, the very first form in my init.el will be responsible for redefining all `async-'-functions to unconditionally signal an error. Slightly off topic... I do not agree with GNU ELPA not being applicable for core services. I think every single package that is not absolutely necessary for running a bare Emacs should be moved to GNU ELPA. In particular I am thinking of packages like CEDET, Calc, Calendar, ECB, ERC, Gnus, Org-mode, all prog-modes, eshell, mh-e, rmail, shell, term etc. On top of that, IMO every single core package should have a copy on GNU ELPA so one can to overwrite the native GNU Emacs one with the one from GNU ELPA. This would decouple all packages from the Emacs release cycle and allow bug fixes to be distributed instantly. On top of that, this would make actual core emacs development, test, release and bug management a lot easier.[1] Just my two cents. Christopher [1] I realise this would require substantial modifications to pretty much every single aspect of GNU Emacs and GNU ELPA. Yet I think this is an approach worth discussing. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-24 15:02 ` Christopher Schmidt @ 2012-06-24 15:42 ` Bastien 2012-06-24 21:01 ` John Wiegley ` (2 subsequent siblings) 3 siblings, 0 replies; 36+ messages in thread From: Bastien @ 2012-06-24 15:42 UTC (permalink / raw) To: emacs-devel Hi Christopher, Christopher Schmidt <christopher@ch.ristopher.com> writes: > I think every single package that is not absolutely > necessary for running a bare Emacs should be moved to GNU ELPA. In > particular I am thinking of packages like CEDET, Calc, Calendar, ECB, > ERC, Gnus, Org-mode, all prog-modes, eshell, mh-e, rmail, shell, term > etc. I disagree. As Eli said, this is just some additional MO in GNU Emacs. Moreover, there is no useless burden when launching Emacs. If there is, that can be fixed without removing stuff. I'm fine with the current policy for GNU Emacs and GNU ELPA, as they complete each other in a useful way: a light-weight policy for GNU ELPA ("from FSF-copyrighted authors") and a strong policy for Emacs ("be accepted by Emacs maintainers.") By moving stuff to GNU ELPA, you will not only decentralize maintainance (it is already decentralized for many packages), you will also remove the pride of "being part of GNU Emacs". If you want people to be pride of "being part of GNU ELPA", then you will have to define a stronger policy for GNU ELPA. And you will end up with more work, as you'll now have two things to maintain. (Also, I think it's good for a package to have two categories of users: regular users that use the package from GNU Emacs, and power users that want to test the latest versions. Telling people to use the constantly updated version from GNU ELPA will make your userbase perhaps too homogeneous.) > On top of that, IMO every single core package should have a copy > on GNU ELPA so one can to overwrite the native GNU Emacs one with the > one from GNU ELPA. At least for Org-mode, this is already the case. > This would decouple all packages from the Emacs > release cycle and allow bug fixes to be distributed instantly. On top > of that, this would make actual core emacs development, test, release > and bug management a lot easier.[1] There is Elisp code everywhere on the web, emacswiki, etc. It *is* pretty chaotic and creative. Having many useful packages included in GNU Emacs helps users to find some order in this chaos, and my guess is that it's part of the motivations of Elisp hackers. Best, -- Bastien ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-24 15:02 ` Christopher Schmidt 2012-06-24 15:42 ` Bastien @ 2012-06-24 21:01 ` John Wiegley 2012-06-25 14:53 ` Christopher Schmidt 2012-06-24 21:12 ` ELPA and core services John Wiegley 2012-06-25 4:32 ` stdlib for Emacs? [was: async 1.0] Stephen J. Turnbull 3 siblings, 1 reply; 36+ messages in thread From: John Wiegley @ 2012-06-24 21:01 UTC (permalink / raw) To: emacs-devel >>>>> Christopher Schmidt <christopher@ch.ristopher.com> writes: > Whilst this is an incredibly interesting package, I do not think that > async.el should be a "core service" that may be used by other core packages. I think that it should definitely be a core service, but _of course_, "opt-in" until it is discovered that each particular use of async.el cannot break in any way (and I'm open to the thought that this may never be true, and it will be opt-in forever). For example, I have changes to dired to make it asynchronous. They work great here, and I'm not sure what all your doom and gloom is about. However, I wouldn't imagine enabling such a change by default; I would add a `dired-use-async' variable. *However*, such a variable loses a lot of value if dired is part of Emacs but async isn't. How can I modify dired (and it does require core modifications to support async.el) if the changes rely on macros contained in a package from ELPA? Dired gets byte-compiled as part of the Emacs bootstrap, yet those macros are not present until the user installs async.el from ELPA. Do they have to re-compile dired to establish the proper definitions in byte-code? Further, even though enabling `dired-use-async' purports to make dired async, it doesn't really. The user has to additionally install async through ELPA for that variable to become meaningful. This is a needless burden on the user, not all of whom are familiar and comfortable with installing packages through ELPA. Async should be something people can just turn on, not something they have to jump through hoops to get. So, I think async.el should be a core services so that other core services can rely on its definitions at compile time, as Emacs is being built. Otherwise, changing dired, eshell, smtpmail, etc., to use async.el ends up being way too hacky to be worth doing. I believe requiring distribution through ELPA would kill chance at real adoption for async.el. > smtpmail-async would break my setup. It would break my setup in a way very > hard to fix. Can you explain that a bit more? Otherwise, it sounds like FUD. > Other than that, GNU Emacs has excellent asynchronous process and network > facilities already. Why not use them? And these would be? I'm not aware of any core service that lets me asynchronously call lambdas. > If this package makes it into GNU Emacs, please make every single usage > opt-in by default. I wouldn't dream of enabling this by default for unsuspecting users. It needs years of battle testing before I'd even begin to have that kind of confidence. > If async.el somehow finds its way on my machine, the very first form in my > init.el will be responsible for redefining all `async-'-functions to > unconditionally signal an error. Again, a bit FUD-y. > Slightly off topic... I do not agree with GNU ELPA not being applicable for > core services. I think every single package that is not absolutely > necessary for running a bare Emacs should be moved to GNU ELPA. In > particular I am thinking of packages like CEDET, Calc, Calendar, ECB, ERC, > Gnus, Org-mode, all prog-modes, eshell, mh-e, rmail, shell, term etc. On > top of that, IMO every single core package should have a copy on GNU ELPA so > one can to overwrite the native GNU Emacs one with the one from GNU ELPA. > This would decouple all packages from the Emacs release cycle and allow bug > fixes to be distributed instantly. On top of that, this would make actual > core emacs development, test, release and bug management a lot easier.[1] This is a discussion for another thread, please. John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-24 21:01 ` John Wiegley @ 2012-06-25 14:53 ` Christopher Schmidt 2012-06-25 23:54 ` John Wiegley 0 siblings, 1 reply; 36+ messages in thread From: Christopher Schmidt @ 2012-06-25 14:53 UTC (permalink / raw) To: emacs-devel John Wiegley <jwiegley@gmail.com> writes: >>>>>> Christopher Schmidt <christopher@ch.ristopher.com> writes: [...] > I think that it should definitely be a core service, but _of course_, > "opt-in" until it is discovered that each particular use of async.el > cannot break in any way (and I'm open to the thought that this may > never be true, and it will be opt-in forever). You did not mention that before. [...] > Further, even though enabling `dired-use-async' purports to make dired > async, it doesn't really. The user has to additionally install async > through ELPA for that variable to become meaningful. This is a > needless burden on the user, not all of whom are familiar and > comfortable with installing packages through ELPA. Async should be > something people can just turn on, not something they have to jump > through hoops to get. I was not arguing in favour of making async.el a GNU ELPA package rather than a core GNU Emacs package. I did not question asynchronous beef-ups of dired or smtpmail per se. [...] >> smtpmail-async would break my setup. It would break my setup in a >> way very hard to fix. > > Can you explain that a bit more? Otherwise, it sounds like FUD. This is off-topic. Executive summary: I rewrote the network stack of Emacs in order to perform certificate pinning and OCSP verification. This is integrated into a setup where user-visible mutable state (this is fuzzy!) is stored persistently on a per-frame basis - frames bound to distinct modes and instances - with these instances keeping track off all file and network activity. This stuff is integrated into my OS environment, with Emacs modifying firewall rules whenever necessary. >> Other than that, GNU Emacs has excellent asynchronous process and >> network facilities already. Why not use them? > > And these would be? I'm not aware of any core service that lets me > asynchronously call lambdas. I do not like that you snipped context out of my quotes. Other than that, GNU Emacs has excellent asynchronous process and network facilities already. Why not use them? In this case one does not loose customisation, progress, error, debugging and bidirectional communication functionality. Of course this would require some development effort, but in the end there are only very few core packages (tramp, dired, mail sending, anything else?) that benefit from a true asynchronous dispatch-and-forget implementation anyway. [...] When it comes to side-effect free CPU work that does not require user feedback this [async.el] is the way to go. (I have no actual example for this use-case, though.) When it comes to I/O, and this is what all posts in this thread are about, async.el IMO totally undermines everything Emacs stands for. Why do you want complex forms to be called asynchronously out of the context of the original Emacs process? Does the advantage of an easy and little intrusive implementation in comparison to Masashi's deferred.el or the use of manual async primitives outweigh the loss of "customisation, progress, error, debugging and bidirectional communication functionality"? Does it outweigh that a minority of end-users would have to fiddle with async to translate their customizations into child emacsen? Is there any non-I/O (non-tramp) related use-case for async.el? The point I was trying to make is that async.el can make development and actual end-user usage both simpler and harder. Some issues could be avoided by using non-forking asynchronous I/O in the first place. "A nice short-term solution with severe long-term consequences." (Now that I looked up 'severe' in a dictionary, I think it is the wrong term. I wanted to say that async.el can cause unexpected surprises.) [...] >> If async.el somehow finds its way on my machine, the very first form >> in my init.el will be responsible for redefining all >> `async-'-functions to unconditionally signal an error. > > Again, a bit FUD-y. I am sorry. That comment was not appropriate, it does not matter. Implementing asynchronous smtp on top of smtpmail within 19 LOC is impressive. No doubt whatsoever. This is a great opt-in feature. You did not mention opt-in-ness before and to me it was not obvious from the context, especially because AFAICT dired-async.el unconditionally redefines dired internals to use async.el. John, I have no intention to spread FUD. I am sorry for offending you if that is the case. I have lots of respect for your work.[1] I am not a GNU Emacs developer and I do not want to be one. I was just brainstorming, raising a few points that went through my head, from an Emacs user point of view, when I read the messages regarding async.el. I was under the impression that you would use async.el to revamp the core packages of Emacs, one after another, wreaking havoc upon my precious customizations. Greetings, Christopher [1] I borrowed some stuff from your dotemacs. Eshell is featured in a Hollywood movie and your work on git modularization should make Boost fun again. I loved your OpenGenera blog post ;) This is great stuff! ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-25 14:53 ` Christopher Schmidt @ 2012-06-25 23:54 ` John Wiegley 0 siblings, 0 replies; 36+ messages in thread From: John Wiegley @ 2012-06-25 23:54 UTC (permalink / raw) To: emacs-devel >>>>> Christopher Schmidt <christopher@ch.ristopher.com> writes: >>> Other than that, GNU Emacs has excellent asynchronous process and network >>> facilities already. Why not use them? >> >> And these would be? I'm not aware of any core service that lets me >> asynchronously call lambdas. > I do not like that you snipped context out of my quotes. I really am very sorry if I dropped your context. I didn't meant to antagonize, just to reduce the length of my reply. > Why do you want complex forms to be called asynchronously out of the context > of the original Emacs process? My core argument for async.el is that certain Emacs primitives, such as `copy-file' and `process-send-region', cannot benefit from the tricks employed by packages like deferred.el. I think deferred.el is an excellent approach to deferred computation: when things don't need to happen right away, they can be interleaved with the user's commands as the interpreter becomes available. But there are cases when Emacs *must* block the main process for minutes at a time (such as copying a 10G file on my local machine). It is these cases that async.el is designed to address. Otherwise, if deferred.el can solve the problem, I think it's preferrable to use that over full asynchronicity. It's easier to debug with it, behavior is less surprising, and backtraces are more revealing. So we actually have many tools in our toolbox. Async.el would just be one more, with its own caveats and gotchas. So far we have: 1. `start-process'. Works great, if you have an external executable to call. `copy-file' cannot be made asynchronous using this primitive alone, as you cannot depend on the existence of "cp" or "copy.exe" on all platforms. 2. Timers. This is how deferred.el and a few other packages give the semblance of asynchronicity: by returning to the caller immediately, and queueing up code to be executed as the interpreter becomes available. 3. Self-hosting (aka async.el), where a child Emacs is spawned to do work on behalf of the parent Emacs. 4. The "concurrency" branch in Emacs Bzr. I'd really like to know more about what's in here, and what problems it creates and solves. Each of the first three has been used many times over, by many packages. Eshell uses #1 to make use of external programs asynchronously; el-get (thanks to Dave Abrahams) used to use #2 to make updates and installs asynchronous; deferred.el is based on #2; #3 is used by elnode and helm, who rolled their own implementations of what async.el does. So async.el does not invent anything new. The same approach (`start-process' of a child Emacs) is currently "out there" and being used. I just wanted to wrap a simple and generalized interface around this practice, to aid in its further use. > The point I was trying to make is that async.el can make development and > actual end-user usage both simpler and harder. Some issues could be avoided > by using non-forking asynchronous I/O in the first place. "A nice > short-term solution with severe long-term consequences." (Now that I looked > up 'severe' in a dictionary, I think it is the wrong term. I wanted to say > that async.el can cause unexpected surprises.) Yes, this is the bane of asynchronicity in general. And perhaps the best argument for why it should always be "opt-in". > Implementing asynchronous smtp on top of smtpmail within 19 LOC is > impressive. No doubt whatsoever. This is a great opt-in feature. You did > not mention opt-in-ness before and to me it was not obvious from the > context, especially because AFAICT dired-async.el unconditionally redefines > dired internals to use async.el. Sorry if I failed to make my position more clear. I want async.el to be available to everyone, but by no means do I want to inflict it on everyone without their consent. I take a very conservative approach to core Emacs changes, since this is a platform people use to get real work done. I _live_ in Emacs; it's core of my professional life. I wouldn't want it to be disrupted any more than I would want to do the same to you. > I am sorry for offending you if that is the case. I have lots of respect > for your work.[1] None taken, Christopher. I'm just a parent defending his little child. :) John ^ permalink raw reply [flat|nested] 36+ messages in thread
* ELPA and core services 2012-06-24 15:02 ` Christopher Schmidt 2012-06-24 15:42 ` Bastien 2012-06-24 21:01 ` John Wiegley @ 2012-06-24 21:12 ` John Wiegley 2012-06-24 21:40 ` Lennart Borgman ` (3 more replies) 2012-06-25 4:32 ` stdlib for Emacs? [was: async 1.0] Stephen J. Turnbull 3 siblings, 4 replies; 36+ messages in thread From: John Wiegley @ 2012-06-24 21:12 UTC (permalink / raw) To: emacs-devel >>>>> Christopher Schmidt <christopher@ch.ristopher.com> writes: > I do not agree with GNU ELPA not being applicable for core services. I > think every single package that is not absolutely necessary for running a > bare Emacs should be moved to GNU ELPA. Please, please no. I use lots of Emacsen on lots of machines, and only a few have my configuration copied over. Please don't turn unconfigured Emacsen into brain-dead zombies of little value. I rely on the fact that Eshell exists on every Windows machine that has Emacs. And not all of these have a network connection for me to even use ELPA, if that company's web proxy would even allow it. I think you may be considering this issue only from the single-power-user-with-net-access point of view. > On top of that, IMO every single core package should have a copy on GNU ELPA > so one can to overwrite the native GNU Emacs one with the one from GNU ELPA. > This would decouple all packages from the Emacs release cycle and allow bug > fixes to be distributed instantly. Now, this I agree with completely. ELPA overrides is a great idea, and I think it could accelerate development -- as long as inter-package version dependencies are managed. If the newest Gnus suddenly depends on the the newest something-else, that something-else should be installed/updated along with it automatically. John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: ELPA and core services 2012-06-24 21:12 ` ELPA and core services John Wiegley @ 2012-06-24 21:40 ` Lennart Borgman 2012-06-25 2:20 ` Stefan Monnier ` (2 subsequent siblings) 3 siblings, 0 replies; 36+ messages in thread From: Lennart Borgman @ 2012-06-24 21:40 UTC (permalink / raw) To: emacs-devel On Sun, Jun 24, 2012 at 11:12 PM, John Wiegley <jwiegley@gmail.com> wrote: >>>>>> Christopher Schmidt <christopher@ch.ristopher.com> writes: > >> I do not agree with GNU ELPA not being applicable for core services. I >> think every single package that is not absolutely necessary for running a >> bare Emacs should be moved to GNU ELPA. > > Please, please no. I use lots of Emacsen on lots of machines, and only a few > have my configuration copied over. Please don't turn unconfigured Emacsen > into brain-dead zombies of little value. I rely on the fact that Eshell > exists on every Windows machine that has Emacs. And not all of these have a > network connection for me to even use ELPA, if that company's web proxy would > even allow it. > > I think you may be considering this issue only from the > single-power-user-with-net-access point of view. > >> On top of that, IMO every single core package should have a copy on GNU ELPA >> so one can to overwrite the native GNU Emacs one with the one from GNU ELPA. >> This would decouple all packages from the Emacs release cycle and allow bug >> fixes to be distributed instantly. > > Now, this I agree with completely. ELPA overrides is a great idea, and I > think it could accelerate development -- as long as inter-package version > dependencies are managed. If the newest Gnus suddenly depends on the the > newest something-else, that something-else should be installed/updated along > with it automatically. I agree with John on both points here. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: ELPA and core services 2012-06-24 21:12 ` ELPA and core services John Wiegley 2012-06-24 21:40 ` Lennart Borgman @ 2012-06-25 2:20 ` Stefan Monnier 2012-06-25 4:39 ` Stephen J. Turnbull 2012-06-25 6:01 ` Achim Gratz 3 siblings, 0 replies; 36+ messages in thread From: Stefan Monnier @ 2012-06-25 2:20 UTC (permalink / raw) To: emacs-devel > have my configuration copied over. Please don't turn unconfigured Emacsen > into brain-dead zombies of little value. I rely on the fact that Eshell There's no such plan, of course. The only plan I have in this area is to bundle some ELPA packages in the Emacs release tarball and maybe after that move some large externally maintained bundled packages (think Org or Gnus) to ELPA (while keeping them bundled in the release). But I have many other things to do, and it's not very high on my list of priorities. Stefan ^ permalink raw reply [flat|nested] 36+ messages in thread
* ELPA and core services 2012-06-24 21:12 ` ELPA and core services John Wiegley 2012-06-24 21:40 ` Lennart Borgman 2012-06-25 2:20 ` Stefan Monnier @ 2012-06-25 4:39 ` Stephen J. Turnbull 2012-06-25 6:01 ` Achim Gratz 3 siblings, 0 replies; 36+ messages in thread From: Stephen J. Turnbull @ 2012-06-25 4:39 UTC (permalink / raw) To: John Wiegley; +Cc: emacs-devel John Wiegley writes: > Please, please no. I use lots of Emacsen on lots of machines, and only a few > have my configuration copied over. Please don't turn unconfigured Emacsen > into brain-dead zombies of little value. That won't happen. XEmacs made the mistake of distributing core XEmacs without the SUMO package, but Emacs doesn't need to make the same mistake, and even if it did it would be easy to rectify once you have a package system. (It's also not that big a mistake, as the continued, if attenuated, existence of XEmacs shows.) > Now, this I agree with completely. ELPA overrides is a great idea, and I > think it could accelerate development -- as long as inter-package version > dependencies are managed. I doubt it will accelerate development by much. Managing the real dependencies between separately maintained code bases (even if they're in the same tree!) is what slows down development, not distributing changes. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: ELPA and core services 2012-06-24 21:12 ` ELPA and core services John Wiegley ` (2 preceding siblings ...) 2012-06-25 4:39 ` Stephen J. Turnbull @ 2012-06-25 6:01 ` Achim Gratz 2012-07-03 14:38 ` Tom Tromey 3 siblings, 1 reply; 36+ messages in thread From: Achim Gratz @ 2012-06-25 6:01 UTC (permalink / raw) To: emacs-devel John Wiegley writes: >> On top of that, IMO every single core package should have a copy on GNU ELPA >> so one can to overwrite the native GNU Emacs one with the one from GNU ELPA. >> This would decouple all packages from the Emacs release cycle and allow bug >> fixes to be distributed instantly. > > Now, this I agree with completely. ELPA overrides is a great idea, and I > think it could accelerate development -- as long as inter-package version > dependencies are managed. If the newest Gnus suddenly depends on the the > newest something-else, that something-else should be installed/updated along > with it automatically. It may be a great idea, but even ignoring inter-package dependencies it currently doesn't really work due to the way autoloads are generated and used in both Emacs and ELPA. Putting two different fixes for this issue into Emacs and ELPA to me seems a bad idea, so that suggests something more general would be needed and extending ELPA to allow for "layered" installations by default (site-elpa, elpa-24.x, user-elpa, ...) and delivering core packages via a "built-in" ELPA might becmome an option. Distribution of bug fixes is actually a seperate issue that could be solved in other ways, IMHO. Regards, Achim. -- +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+ Wavetables for the Terratec KOMPLEXER: http://Synth.Stromeko.net/Downloads.html#KomplexerWaves ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: ELPA and core services 2012-06-25 6:01 ` Achim Gratz @ 2012-07-03 14:38 ` Tom Tromey 2013-01-22 19:13 ` Achim Gratz 0 siblings, 1 reply; 36+ messages in thread From: Tom Tromey @ 2012-07-03 14:38 UTC (permalink / raw) To: Achim Gratz; +Cc: emacs-devel >>>>> "Achim" == Achim Gratz <Stromeko@nexgo.de> writes: Achim> It may be a great idea, but even ignoring inter-package dependencies it Achim> currently doesn't really work due to the way autoloads are generated and Achim> used in both Emacs and ELPA. Emacs should use the package.el activation code for cases where a package is going to be distributed both in Emacs and separately. That was my original intent; just nobody has implemented this on the Emacs side. Tom ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: ELPA and core services 2012-07-03 14:38 ` Tom Tromey @ 2013-01-22 19:13 ` Achim Gratz 0 siblings, 0 replies; 36+ messages in thread From: Achim Gratz @ 2013-01-22 19:13 UTC (permalink / raw) To: emacs-devel Tom Tromey writes: > Emacs should use the package.el activation code for cases where a > package is going to be distributed both in Emacs and separately. > That was my original intent; just nobody has implemented this on the > Emacs side. Sorry for digging up this old thread again, this is what I currently have in package-directory-list from emacs-24 pretest: ("/usr/local/share/emacs/24.2.92/site-lisp/elpa" "/usr/local/share/emacs/site-lisp/elpa" "/usr/share/emacs/site-lisp/elpa") This seems to collect the directories in reverse from load-path and other such variables (I don't know if the precedence is also in that order, but from a cursory look not) and it is missing a package directory for the Emacs installation, maybe it should be : "/usr/local/share/emacs/24.2.92/lisp/packages". Any Emacs core package that is also in ELPA would then be moved into …/packages and would be pre-activated unless the same package was present somewhere up the package directory list or the user explicitly deactivated that package. Is that what you had in mind? Regards, Achim. -- +<[Q+ Matrix-12 WAVE#46+305 Neuron microQkb Andromeda XTk Blofeld]>+ SD adaptation for Waldorf microQ V2.22R2: http://Synth.Stromeko.net/Downloads.html#WaldorfSDada ^ permalink raw reply [flat|nested] 36+ messages in thread
* stdlib for Emacs? [was: async 1.0] 2012-06-24 15:02 ` Christopher Schmidt ` (2 preceding siblings ...) 2012-06-24 21:12 ` ELPA and core services John Wiegley @ 2012-06-25 4:32 ` Stephen J. Turnbull 3 siblings, 0 replies; 36+ messages in thread From: Stephen J. Turnbull @ 2012-06-25 4:32 UTC (permalink / raw) To: Christopher Schmidt; +Cc: emacs-devel Christopher Schmidt writes: > Slightly off topic... I do not agree with GNU ELPA not being applicable > for core services. I think every single package that is not absolutely > necessary for running a bare Emacs should be moved to GNU ELPA. If you want to know what that would look like, look at XEmacs. It's a win for XEmacs, but I have to suspect that win has a lot to do with getting free maintenance for the core of many packages that are core parts of Emacs, plus a different development culture (see below). The XEmacs packagization side either has a volunteer maintainer -- sometimes the core maintainer but we prefer not to burden them if another volunteer is available -- or it's done by the "XEmacs Dev Team". Note that packages maintained by the dev team typically have much longer response times, etc, even when there is an upstream. It's not obvious to me that it would be a win for Emacs to *move* those packages to ELPA, even if it would reduce duplication of effort and cooperation costs. Ask the Gnus team. > On top of that, IMO every single core package should have a copy on > GNU ELPA so one can to overwrite the native GNU Emacs one with the > one from GNU ELPA. This would decouple all packages from the Emacs > release cycle and allow bug fixes to be distributed instantly. Bug fixes are already mostly distributed instantly, by bzr. So AFAICS what you are claiming is that this would speed up distribution of bug fixes to users who don't care enough about Emacs to build it themselves. This is very unlikely based on XEmacs experience. AFAICT, such users mostly get their fixes when they are picked up by the OS distros, but guess what? The distros don't distribute upstream binary packages, they build their own from their own repos which are (near) clones of Emacs's or upstream. > On top of that, this would make actual core emacs development, > test, release and bug management a lot easier.[1] No. It only helps if package distribution is completely decoupled from Emacs distribution, but this would be very costly to the Emacs "I can hack any part of Emacs" mindset because it would require codifying a lot of APIs that are currently more or less internal. (The fungibility of "internal-ish" APIs causes me a certain amount of hair-tearing every time we do a major sync to Emacs, since XEmacs is by necessity and by preference more friendly to fixed APIs than Emacs.) It would also probably result in more integration bugs getting through to end users. > [1] I realise this would require substantial modifications to pretty > much every single aspect of GNU Emacs and GNU ELPA. Yet I think this is > an approach worth discussing. As a gross estimate, it took Steve Baur and a few others about one man-year of effort to break out the packages that were available in XEmacs 20.4 for the XEmacs 20.5 release in 1996. There are a lot more packages in Emacs now, and it would probably be more effort in total to do the same for Emacs. Even in hindsight, I don't think the package split-off in XEmacs was a mistake. It didn't turn out as well as hoped, but it could have in theory, even in the theory I have now. But Emacs is in a different situation. GNU ELPA is successful, let it grow for a while and see what happens before turning Emacs upside down. ;-) ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 21:50 ` John Wiegley 2012-06-23 1:44 ` Stefan Monnier 2012-06-23 3:00 ` Stefan Monnier @ 2012-06-23 6:25 ` Stephen J. Turnbull 2012-06-23 21:05 ` John Wiegley 2012-07-01 8:16 ` Michael Sperber 2 siblings, 2 replies; 36+ messages in thread From: Stephen J. Turnbull @ 2012-06-23 6:25 UTC (permalink / raw) To: John Wiegley; +Cc: Emacs developers John Wiegley writes: > One thing that would make async.el _incredibly_ useful would be a `call/cc' > function in Emacs. XEmacs efs (or maybe it's dired -- not to be confused with any dired in Emacs IIRC, you need the XEmacs versions) has an implementation of call/cc. I don't know how close to "true" call/cc it is. For correct info, ask Mike Sperber <mike@xemacs.org>. ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-23 6:25 ` async 1.0 Stephen J. Turnbull @ 2012-06-23 21:05 ` John Wiegley 2012-07-01 8:16 ` Michael Sperber 1 sibling, 0 replies; 36+ messages in thread From: John Wiegley @ 2012-06-23 21:05 UTC (permalink / raw) To: Stephen J. Turnbull; +Cc: Emacs developers >>>>> Stephen J Turnbull <stephen@xemacs.org> writes: > XEmacs efs (or maybe it's dired -- not to be confused with any dired in > Emacs IIRC, you need the XEmacs versions) has an implementation of call/cc. > I don't know how close to "true" call/cc it is. For correct info, ask Mike > Sperber <mike@xemacs.org>. I'll have to check that out. Eshell has a poor man's implementation of call/cc, called `eshell-do-eval'. It throws `eshell-defer' as the equivalent of calling `call/cc', returning an object you can `eval' later to resume execution. The way it works is by taking the form you want to `eval' and transforming it as it evaluates, performing substitutions so that (let ((a (+ 10 20))) ...) becomes (let ((a 30)) ...), etc., on down to where you throw `eshell-defer' (and of course removing the throw). The next time you evaluate, no additional evaluations are done until you reach the point where you deferred. The downsides are: (a) it's slow to walk and eval in Lisp, (b) it doesn't work with byte-compiled forms, and (c) it's limited to a subset of the Emacs Lisp language, since each single special form needs to be treated specially, and I only implemented transforms for the ones that Eshell actually used. Oh, and (a) it doesn't peer past function call boundaries. That said, it could be extended to fully support Emacs Lisp; it would simply require that nothing be byte-compiled. Unless bytecode stream instrumentation was added to the mix... On the other hand, how hard would it be to make Emacs stackless and provide a native call/cc that works not only with byte-compiled code, but with interposing native function calls? For example: (let* ((a (+ 10 20)) (c '(1 2 3))) (d (mapcar #'(lambda (b) (+ b a) (call/cc)) c))) I cannot think of any way to fake continuations here, other than having intimate of every native function, and transforming the `let' into this: (let* ((a 30) (b '(2 3)) (d (cons 1 (mapcar #'(lambda (b) (+ b a)) c)))) The problem gets pretty hairy fairly quickly. John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-23 6:25 ` async 1.0 Stephen J. Turnbull 2012-06-23 21:05 ` John Wiegley @ 2012-07-01 8:16 ` Michael Sperber 1 sibling, 0 replies; 36+ messages in thread From: Michael Sperber @ 2012-07-01 8:16 UTC (permalink / raw) To: emacs-devel "Stephen J. Turnbull" <stephen@xemacs.org> writes: > John Wiegley writes: > > > One thing that would make async.el _incredibly_ useful would be a `call/cc' > > function in Emacs. > > XEmacs efs (or maybe it's dired -- not to be confused with any dired > in Emacs IIRC, you need the XEmacs versions) has an implementation of > call/cc. I don't know how close to "true" call/cc it is. For correct > info, ask Mike Sperber <mike@xemacs.org>. It doesn't have call/cc, but large parts of it are effectively written in CPS. EFS also rolls its own version of closures. -- Cheers =8-} Mike Friede, Völkerverständigung und überhaupt blabla ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-21 21:23 ` async 1.0 John Wiegley 2012-06-22 7:00 ` Teemu Likonen @ 2012-06-22 11:38 ` Richard Stallman 2012-06-22 21:39 ` John Wiegley 1 sibling, 1 reply; 36+ messages in thread From: Richard Stallman @ 2012-06-22 11:38 UTC (permalink / raw) To: John Wiegley; +Cc: emacs-devel I didn't realize it could be so fast. On my machine, emacs -Q -batch --eval "(+ 10 20)" takes about 1/4 second. -- Dr Richard Stallman President, Free Software Foundation 51 Franklin St Boston MA 02110 USA www.fsf.org www.gnu.org Skype: No way! That's nonfree (freedom-denying) software. Use Ekiga or an ordinary phone call ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 11:38 ` Richard Stallman @ 2012-06-22 21:39 ` John Wiegley 2012-06-22 23:02 ` Richard Stallman 0 siblings, 1 reply; 36+ messages in thread From: John Wiegley @ 2012-06-22 21:39 UTC (permalink / raw) To: rms; +Cc: emacs-devel >>>>> Richard Stallman <rms@gnu.org> writes: > I didn't realize it could be so fast. On my machine, emacs -Q -batch --eval > "(+ 10 20)" takes about 1/4 second. What kind of hardware are you using? The Emacs that I'm running in off an SSD with a lot of cache RAM available. If I do it on my laptop, which also has an SSD, I get the same times: 0.03713s. I've also found another use for async.el: sandboxing. The following allows me execute a lambda synchronously, but without affecting the host Emacs environment: (async-get (async-start FUNC)) I see this idiom being useful enough that I've reduced it to one function, (async-sandbox FUNC). Here's an example of using sandboxing to byte-compile a file, without letting `eval-when-compile' forms affect the host environment: (let ((proc (async-start `(lambda () (require 'bytecomp) ,(async-inject-variables "\\`load-path\\'") (let ((default-directory ,(file-name-directory file))) (add-to-list 'load-path default-directory) (ignore-errors (load ,file)) ;; returns nil if there were any errors (prog1 (byte-compile-file ,file) (load ,file))))))) (unless (condition-case err (async-get proc) (error (ignore (message "Error: %s" err)))) (ignore (message "Recompiling %s...FAILED" file)))) John ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 21:39 ` John Wiegley @ 2012-06-22 23:02 ` Richard Stallman 2012-06-23 7:46 ` zwz 0 siblings, 1 reply; 36+ messages in thread From: Richard Stallman @ 2012-06-22 23:02 UTC (permalink / raw) To: John Wiegley; +Cc: emacs-devel I am using an Yeeloong with an SSD that is somewhat slow. -- Dr Richard Stallman President, Free Software Foundation 51 Franklin St Boston MA 02110 USA www.fsf.org www.gnu.org Skype: No way! That's nonfree (freedom-denying) software. Use Ekiga or an ordinary phone call ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-22 23:02 ` Richard Stallman @ 2012-06-23 7:46 ` zwz 2012-06-23 20:49 ` Richard Stallman 0 siblings, 1 reply; 36+ messages in thread From: zwz @ 2012-06-23 7:46 UTC (permalink / raw) To: emacs-devel This may be a little off the topic, but I just came across a report about your bag getting stolen in Argentina. Did you lost your Yeeloong? Richard Stallman <rms@gnu.org> writes: > I am using an Yeeloong with an SSD that is somewhat slow. > > -- > Dr Richard Stallman > President, Free Software Foundation > 51 Franklin St > Boston MA 02110 > USA > www.fsf.org www.gnu.org > Skype: No way! That's nonfree (freedom-denying) software. > Use Ekiga or an ordinary phone call ^ permalink raw reply [flat|nested] 36+ messages in thread
* Re: async 1.0 2012-06-23 7:46 ` zwz @ 2012-06-23 20:49 ` Richard Stallman 0 siblings, 0 replies; 36+ messages in thread From: Richard Stallman @ 2012-06-23 20:49 UTC (permalink / raw) To: zwz; +Cc: emacs-devel My Yeeloong was stolen. Unfortunately we did not have a recent backup for the software configuration, and I still have some problems. -- Dr Richard Stallman President, Free Software Foundation 51 Franklin St Boston MA 02110 USA www.fsf.org www.gnu.org Skype: No way! That's nonfree (freedom-denying) software. Use Ekiga or an ordinary phone call ^ permalink raw reply [flat|nested] 36+ messages in thread
end of thread, other threads:[~2013-01-22 19:13 UTC | newest] Thread overview: 36+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <m2hau86tfk.fsf@vulcan.local.i-did-not-set--mail-host-address--so-tickle-me> [not found] ` <E1ShM8F-0006IY-L9@fencepost.gnu.org> [not found] ` <m2txy51z1k.fsf@newartisans.com> [not found] ` <E1ShiKM-0000Aa-5G@fencepost.gnu.org> 2012-06-21 21:23 ` async 1.0 John Wiegley 2012-06-22 7:00 ` Teemu Likonen 2012-06-22 10:54 ` John Wiegley 2012-06-22 12:39 ` Michael Albinus 2012-06-22 22:02 ` John Wiegley 2012-07-04 17:10 ` Samuel Bronson 2012-07-05 4:09 ` John Wiegley 2012-07-05 19:58 ` Samuel Bronson [not found] ` <82d34r8ej9.fsf@gmail.com> 2012-06-22 21:50 ` John Wiegley 2012-06-23 1:44 ` Stefan Monnier 2012-06-23 3:00 ` Stefan Monnier 2012-06-23 16:26 ` Lennart Borgman 2012-06-23 21:08 ` John Wiegley 2012-06-23 21:28 ` Jeremiah Dodds 2012-06-23 21:50 ` Thierry Volpiatto 2012-06-24 15:02 ` Christopher Schmidt 2012-06-24 15:42 ` Bastien 2012-06-24 21:01 ` John Wiegley 2012-06-25 14:53 ` Christopher Schmidt 2012-06-25 23:54 ` John Wiegley 2012-06-24 21:12 ` ELPA and core services John Wiegley 2012-06-24 21:40 ` Lennart Borgman 2012-06-25 2:20 ` Stefan Monnier 2012-06-25 4:39 ` Stephen J. Turnbull 2012-06-25 6:01 ` Achim Gratz 2012-07-03 14:38 ` Tom Tromey 2013-01-22 19:13 ` Achim Gratz 2012-06-25 4:32 ` stdlib for Emacs? [was: async 1.0] Stephen J. Turnbull 2012-06-23 6:25 ` async 1.0 Stephen J. Turnbull 2012-06-23 21:05 ` John Wiegley 2012-07-01 8:16 ` Michael Sperber 2012-06-22 11:38 ` Richard Stallman 2012-06-22 21:39 ` John Wiegley 2012-06-22 23:02 ` Richard Stallman 2012-06-23 7:46 ` zwz 2012-06-23 20:49 ` Richard Stallman
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).