* Re: condition-case [not found] ` <jwvbp4v9enz.fsf-monnier+gnu.emacs.help@gnu.org> @ 2010-12-10 18:40 ` Ted Zlatanov 2010-12-10 21:43 ` condition-case Stefan Monnier 2010-12-13 17:10 ` condition-case Ted Zlatanov 0 siblings, 2 replies; 7+ messages in thread From: Ted Zlatanov @ 2010-12-10 18:40 UTC (permalink / raw) To: help-gnu-emacs On Thu, 09 Dec 2010 10:04:12 -0500 Stefan Monnier <monnier@iro.umontreal.ca> wrote: >> Here's what Pascal posted originally. SM> The code looks fine (tho it needs a reindent to follow Elisp SM> convention). The docstring needs a completely rewrite, OTOH, to follow SM> Elisp convention: first line should succintly describe the macro, and SM> the rest should give details about what it does and what each SM> param means. I.e. someone not familiar with Common-Lisp should be able SM> to understand how to use it. Yes, that's not hard. I was worried about the code's behavior. >> (subst var (car clausvar) body))))) SM> Oh wait, I just noticed this one: `subst' is wrong here. I know CL SM> already uses it for similar purposes elsewhere, but it's simply wrong SM> because `subst' doesn't know about Elisp binding rules. SM> So (subst 'b 'a '(lambda () '(a b c))) will happily return SM> (lambda () '(b b c)). Better simply use `let', even if it has SM> a performance cost. I didn't catch that. I don't know enough about ELisp vs. CL scoping and binding rules to write this properly, unfortunately. Can you show how `let' could be used? I'll take the code and provide the doc string and reindent it, then propose the revised version in emacs-devel. On Thu, 09 Dec 2010 05:34:02 +0100 "Pascal J. Bourguignon" <pjb@informatimago.com> wrote: PJB> Ted Zlatanov <tzz@lifelogs.com> writes: >> Here's what Pascal posted originally. I tested it a little and it seems >> to work OK; it's basically syntactic sugar but pretty pleasant. We >> should also consider `handler-bind' which is like `handler-case' but >> executes handlers directly. Pascal, do you have an implementation of >> that as well? PJB> There's no condition-bind to wrap over. PJB> I'm not sure it would be possible to implement handler-bind without PJB> patching the virtual machine. Stefan, WDYT? Is `condition-bind' possible in today's GNU Emacs? I mean does the VM have any constraints that would block it? Ted ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: condition-case 2010-12-10 18:40 ` condition-case Ted Zlatanov @ 2010-12-10 21:43 ` Stefan Monnier 2010-12-13 17:12 ` condition-case Ted Zlatanov 2010-12-13 17:10 ` condition-case Ted Zlatanov 1 sibling, 1 reply; 7+ messages in thread From: Stefan Monnier @ 2010-12-10 21:43 UTC (permalink / raw) To: help-gnu-emacs PJB> There's no condition-bind to wrap over. PJB> I'm not sure it would be possible to implement handler-bind without PJB> patching the virtual machine. > Stefan, WDYT? Is `condition-bind' possible in today's GNU Emacs? I > mean does the VM have any constraints that would block it? There used to be some allowance made in the C code for such a feature, but since it was never used it bit-rotted and has "recently" been more actively removed. So adding a condition-bind or something like that would require a fair bit of work, I think. There is still some support for part of it since errors can jump into the debugger, but currently the debugger cannot return to the source of the error, it can only jump back up the stack like condition-case does. Stefan ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: condition-case 2010-12-10 21:43 ` condition-case Stefan Monnier @ 2010-12-13 17:12 ` Ted Zlatanov 0 siblings, 0 replies; 7+ messages in thread From: Ted Zlatanov @ 2010-12-13 17:12 UTC (permalink / raw) To: help-gnu-emacs On Fri, 10 Dec 2010 16:43:46 -0500 Stefan Monnier <monnier@iro.umontreal.ca> wrote: PJB> There's no condition-bind to wrap over. PJB> I'm not sure it would be possible to implement handler-bind without PJB> patching the virtual machine. >> Stefan, WDYT? Is `condition-bind' possible in today's GNU Emacs? I >> mean does the VM have any constraints that would block it? SM> There used to be some allowance made in the C code for such a feature, SM> but since it was never used it bit-rotted and has "recently" been more SM> actively removed. So adding a condition-bind or something like that SM> would require a fair bit of work, I think. There is still some support SM> for part of it since errors can jump into the debugger, but currently SM> the debugger cannot return to the source of the error, it can only jump SM> back up the stack like condition-case does. I also notice no one has complained in the last few years that `condition-case' is insufficient. So maybe `condition-bind' is simply not necessary. Ted ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: condition-case 2010-12-10 18:40 ` condition-case Ted Zlatanov 2010-12-10 21:43 ` condition-case Stefan Monnier @ 2010-12-13 17:10 ` Ted Zlatanov 2010-12-15 4:55 ` condition-case Stefan Monnier 1 sibling, 1 reply; 7+ messages in thread From: Ted Zlatanov @ 2010-12-13 17:10 UTC (permalink / raw) To: help-gnu-emacs On Fri, 10 Dec 2010 12:40:06 -0600 Ted Zlatanov <tzz@lifelogs.com> wrote: TZ> On Thu, 09 Dec 2010 10:04:12 -0500 Stefan Monnier <monnier@iro.umontreal.ca> wrote: >>> (subst var (car clausvar) body))))) SM> Oh wait, I just noticed this one: `subst' is wrong here. I know CL SM> already uses it for similar purposes elsewhere, but it's simply wrong SM> because `subst' doesn't know about Elisp binding rules. SM> So (subst 'b 'a '(lambda () '(a b c))) will happily return SM> (lambda () '(b b c)). Better simply use `let', even if it has SM> a performance cost. TZ> I didn't catch that. I don't know enough about ELisp vs. CL scoping and TZ> binding rules to write this properly, unfortunately. Can you show how TZ> `let' could be used? I'll take the code and provide the doc string and TZ> reindent it, then propose the revised version in emacs-devel. ...in other words, in the example you showed, is it just (let ((b a)) (lambda () '(b b c))) or is it more complicated? Ted ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: condition-case 2010-12-13 17:10 ` condition-case Ted Zlatanov @ 2010-12-15 4:55 ` Stefan Monnier 2010-12-15 16:50 ` condition-case Ted Zlatanov 0 siblings, 1 reply; 7+ messages in thread From: Stefan Monnier @ 2010-12-15 4:55 UTC (permalink / raw) To: help-gnu-emacs > ...in other words, in the example you showed, is it just > (let ((b a)) > (lambda () '(b b c))) Yes. I.e. let the interpreter perform the substitution, at run-time. Stefan ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: condition-case 2010-12-15 4:55 ` condition-case Stefan Monnier @ 2010-12-15 16:50 ` Ted Zlatanov 2010-12-16 22:03 ` condition-case Stefan Monnier 0 siblings, 1 reply; 7+ messages in thread From: Ted Zlatanov @ 2010-12-15 16:50 UTC (permalink / raw) To: help-gnu-emacs On Tue, 14 Dec 2010 23:55:45 -0500 Stefan Monnier <monnier@iro.umontreal.ca> wrote: >> ...in other words, in the example you showed, is it just >> (let ((b a)) >> (lambda () '(b b c))) SM> Yes. I.e. let the interpreter perform the substitution, at run-time. OK, so would it work as: (defmacro handler-case (expression &rest clauses) "Evaluate expression with `condition-case' and catch errors with CLAUSES. Longer explanation here..." (let* ((var (gensym)) (neclause (assoc :NO-ERROR clauses)) (nell (cadr neclause)) (nebody (cddr neclause)) (handlers (mapcar (lambda (clause) (let ((typespec (car clause)) (clausvar (cadr clause)) (body (cddr clause))) (cons (if (and (consp typespec) (eq 'or (car typespec))) (cdr typespec) typespec) (if (null clausvar) body (let ((var (car clausvar))) body))))) (remove neclause clauses)))) (if neclause `(condition-case ,var (multiple-value-bind ,nell ,expression ,@nebody) ,@handlers) `(condition-case ,var ,expression ,@handlers)))) Does that new `let' that pops the clause need to evaluated? And should it maybe be a `lexical-let'? Ted ^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: condition-case 2010-12-15 16:50 ` condition-case Ted Zlatanov @ 2010-12-16 22:03 ` Stefan Monnier 0 siblings, 0 replies; 7+ messages in thread From: Stefan Monnier @ 2010-12-16 22:03 UTC (permalink / raw) To: help-gnu-emacs > OK, so would it work as: > (defmacro handler-case (expression &rest clauses) > "Evaluate expression with `condition-case' and catch errors with CLAUSES. > Longer explanation here..." > (let* ((var (gensym)) > (neclause (assoc :NO-ERROR clauses)) > (nell (cadr neclause)) > (nebody (cddr neclause)) > (handlers (mapcar (lambda (clause) > (let ((typespec (car clause)) > (clausvar (cadr clause)) > (body (cddr clause))) > (cons (if (and (consp typespec) > (eq 'or (car typespec))) > (cdr typespec) > typespec) > (if (null clausvar) > body > (let ((var (car clausvar))) > body))))) You need backquotes around the let. > Does that new `let' that pops the clause need to evaluated? And should > it maybe be a `lexical-let'? Whether it should be lexical or not is up to you. Stefan ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2010-12-16 22:03 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <33e7a222-992c-4fc2-bbd2-d987a0d4d9b1@j32g2000prh.googlegroups.com> [not found] ` <877hfxokvh.fsf@lola.goethe.zz> [not found] ` <4d4ecf83-ffd8-43d9-8c27-4123856273e9@21g2000prv.googlegroups.com> [not found] ` <0b6e72ef-a605-4ac1-bc71-f3e180f162fb@j18g2000prn.googlegroups.com> [not found] ` <87r5e3zxyw.fsf@kuiper.lan.informatimago.com> [not found] ` <878w06lqcf.fsf@lifelogs.com> [not found] ` <8762vaodaw.fsf@kuiper.lan.informatimago.com> [not found] ` <8762v6ho6q.fsf@lifelogs.com> [not found] ` <jwv62v6ljkb.fsf-monnier+gnu.emacs.help@gnu.org> [not found] ` <87hbepd50p.fsf@lifelogs.com> [not found] ` <jwvmxohh8yt.fsf-monnier+gnu.emacs.help@gnu.org> [not found] ` <87pqtc9sd5.fsf@lifelogs.com> [not found] ` <jwvbp4v9enz.fsf-monnier+gnu.emacs.help@gnu.org> 2010-12-10 18:40 ` condition-case Ted Zlatanov 2010-12-10 21:43 ` condition-case Stefan Monnier 2010-12-13 17:12 ` condition-case Ted Zlatanov 2010-12-13 17:10 ` condition-case Ted Zlatanov 2010-12-15 4:55 ` condition-case Stefan Monnier 2010-12-15 16:50 ` condition-case Ted Zlatanov 2010-12-16 22:03 ` condition-case Stefan Monnier
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).