[Top][All Lists]

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

Re: [Bug-apl] Error handling and IO

From: Elias Mårtenson
Subject: Re: [Bug-apl] Error handling and IO
Date: Wed, 20 Apr 2016 14:31:21 +0800

Do you think it would be possible to implement a "finally" construct for native libraries? Basically, what I'm asking for is the ability to register a callback with a specific stack frame that is called when that frame is unrolled.


On 14 Apr 2016 01:51, "Juergen Sauermann" <address@hidden> wrote:
Hi Kacper et al,

I understand. But I would say that using ⎕EA as you describe is exactly how
cleanup should be done. I see ⎕EA not like (as the name may suggest) a means of
trying different paths until one succeeds like in:

'try_A' ⎕EA 'try_B' ⎕EA 'try_C' ...

but rather as:

'cleanup_failed_B' ⎕EA 'try_B'

I also don;t see a good way of introducing a defer function without introducing
a dubious APL syntax extension that would be difficult to read for people not
knowing the extended syntax. For the sake of compatibility, such things should,
IMHO, be avoided.

/// Jürgen

On 04/12/2016 02:10 AM, Kacper Gutowski wrote:
If I understand correctly, Elias wants to have something that would
ensure that every file opened is eventually closed (only more general so
it can be applied to any external resources not only files).  That is in
a code similar to the following, to ensure the line 3 is always run even
if there's an error in FUN.

[1] FD←⎕FIO[3]STH
[2] FUN FD
[3] ⎕FIO[4]FD

This can be ensured by wrapping FUN call with ⎕EA or ⎕EC.  They return
to the caller instead of suspending execution if error happens and this
is correct and expected behaviour.  But the intention is to have the
file closed, not making the function unsuspendable, so this would be
a side effect of the solution of using ⎕EA rather than the intended
behaviour.  But this doesn't mean there's anything wrong with ⎕EA or
⎕EC, of course.

My understanding is that requested is some way to associate some kind of
clean up code with )SI entry that would be run upon that entry being
cleared from )SI regardless of how that happens.

The way I imagine it, it could look like this (using an imaginary
function ‘defer’ with a name borrowed from Golang; not an actual

      ∇ FOO
[1] FD←⎕FIO[3]STH
[2] defer '⎕FIO[4]FD'
[3] FUN FD
[4] other stuff ∇

      ⎕FX 'FUN F' '1+'

FUN[1]  1+
      ⍝ here situation can be examined
F   FD
FUN[1]  1+
⋆  FOO
      ⍝ here ⎕FIO[4]FD is executed


reply via email to

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