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

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

bug#47677: [PATCH] condition-case success continuation


From: Mattias Engdegård
Subject: bug#47677: [PATCH] condition-case success continuation
Date: Fri, 9 Apr 2021 22:26:49 +0200

This patch adds the condition-case handler syntax

  (:success BODY)

for code executed when the protected form terminates without error. BODY is 
then executed with the variable bound to the result of the protected form, and 
the result of BODY is then the value of the condition-case form as usual.

This plugs an annoying hole in elisp: there hasn't been any direct access to 
the success continuation which forced programmers to resort to various hacks 
such as tagging the returned value and then immediately testing that tag, as in

(let ((input (condition-case _
                 (cons 'ok (read buffer))
               (end-of-file 'eof))))
  (when (consp input)
    (use (cdr input))))

Now we can write

(condition-case result
    (read buffer)
  (end-of-file 'eof)
  (:success (use result)))

which is more concise, elegant and performant.

Like all condition-case handlers (but in contrast to the protected form), the 
success handler is in the tail position and the limited self-tail-recursion of 
cl-labels (and named-let) works there as expected.

Details of the syntax can be changed if there is a very good reason for it. 
Many other languages have more or less independently added equivalent 
constructs. Common Lisp's `handler-case` has a very similar feature (:no-error).

It would be nice to give `catch` the same treatment. A particularly flexible 
solution would be to add `catch` handlers to `condition-case`, which would then 
be able to handle everything. Unless there is a strong reason for doing it 
right away, it can be seen as a later improvement.

Attachment: 0001-Add-condition-case-success-handler.patch
Description: Binary data


reply via email to

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