Philipp Stephani
schrieb am So., 4. Okt. 2015 um
11:41 Uhr:
>
>> > 3) How exactly do we represent catch/throw values?
>> >
>> >
>> > I've thought about this a bit, and I think it would be simplest to add a
>> > new function env->set_throw and have get_error and check_error return an
>> > enum { normal, signal, throw }. One could come up with something like
>> > creating a list (error-kind error-tag error-value), but it looks like
>> > the module implementation would create such lists only for the module
>> > code to convert them back, so it's simpler to represent the two kinds of
>> > non-local exits directly in the interface.
>>
>> I'm fine with a list; keep in mind that we'll need to handle OOM
>> somehow, so I'd suggest an opaque type.
>>
>
> I think OOM is currently handled by doing the equivalent of
>
> (apply #'signal memory-signal-data)
>
> so it would be part of the normal signal handling. Using a list would be
> possible, but then the distinction between error tag and data could be
> removed from the module code. But I think the 'magic lists' idiom common in
> Emacs is more of an antipattern and we should try to avoid it in the module
> interface, thus the suggestion to use an enum.
>
>
I've amended the PR with basic handling of throw. It's treated as if it
were at the top level, i.e. it generates a signal with symbol 'no-catch and
data (tag value). There is currently no functionality available to "throw"
from module code, and probably none is needed because "throw" is generally
used as a local control flow mechanism, and modules can use the control
flow mechanisms available in their languages instead.