help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: condition-case


From: Ted Zlatanov
Subject: Re: condition-case
Date: Wed, 15 Dec 2010 10:50:38 -0600
User-agent: Gnus/5.110011 (No Gnus v0.11) Emacs/24.0.50 (gnu/linux)

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


reply via email to

[Prev in Thread] Current Thread [Next in Thread]