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.

Regards,
Elias
On 14 Apr 2016 01:51, "Juergen Sauermann" <juergen.sauerm...@t-online.de>
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
> transcript):
>
>       ∇ FOO
> [1] FD←⎕FIO[3]STH
> [2] defer '⎕FIO[4]FD'
> [3] FUN FD
> [4] other stuff ∇
>
>       STH←'filename'
>       ⎕FX 'FUN F' '1+'
>
>       FOO
> SYNTAX ERROR
> FUN[1]  1+
>         ^^
>       ⍝ here situation can be examined
>       )VARS
> F   FD
>       )SIS
> FUN[1]  1+
>         ^^
> FOO[3]  FUN FD
>         ^
> ⋆  FOO
>    ^
>       →
>       ⍝ here ⎕FIO[4]FD is executed
>
> -k
>
>
>
>

Reply via email to