[m-rev.] for review: try goals

Julien Fischer juliensf at csse.unimelb.edu.au
Wed Feb 18 18:07:09 AEDT 2009


On Wed, 18 Feb 2009, Peter Wang wrote:

> 2009/2/18 Julien Fischer <juliensf at csse.unimelb.edu.au>:
>>
>> Hi Peter,
>>
>> Here are some initial comments that cover the change to the reference
>> manual.
>>
>> On Tue, 17 Feb 2009, Peter Wang wrote:
>>
>>> Branches: main
>>>
>>> Add support for `try' goals, syntactic sugar on top of the exception
>>> handling
>>> predicates in the standard library.  The syntax is documented in the
>>> reference
>>> manual.  Currently one of the proposed try parameters, io(!IO), is
>>> implemented,
>>> and the user must import the `exception' and `univ' modules explicitly.
>>
>> Is there some reason that add_implict_imports in
>> compiler/module_imports.m can not be extended to import them if a
>> module uses a try goal?
>
> I didn't know it existed.  I will add it for `exception'.

Yes, it is used for the implicit imports required by tabling and STM.

> `univ' however is an implementation detail, used I guess for historical reasons.
> I'll add private forwarding predicates in `exception' for `univ_value' and
> `univ_to_type' so `univ' doesn't need to be imported.
>
>> In the long run it might be nice to redefine the exception_result/1 type
>> as:
>>
>>        :- type exception_result(T)
>>                --->    succeeded(T)
>>                ;       failed
>>                ;       some [E] exception(E).
>>
>> and do away with the univ there entirely.
>
> Yes.

I am by no means suggesting you make that change now BTW.  It would
certainly break a lot of existing code.

>>> diff --git a/doc/reference_manual.texi b/doc/reference_manual.texi
>>> index a027612..93ad1e6 100644
>>> --- a/doc/reference_manual.texi
>>> +++ b/doc/reference_manual.texi
>>> @@ -105,6 +105,7 @@ into another language, under the above conditions
>>> for modified versions.
>>> * Impurity::          Users can write impure Mercury code.
>>> * Trace goals::       Trace goals allow programmers to add debugging and
>>>                      logging code to their programs.
>>> +* Try goals::         Exception handling.
>>
>> I think that the new chapter should occur much earlier in the reference
>> manual - I suggest placing it just after the ``Existential types''
>> chapter.  The name of the chapter should be ``Exception handling'' rather
>> than ``Try goals''.
>
> Ok.
>
>>> + at var{CatchAnyGoal} must be valid goals.
>>
>> @var{Goal} must have one of the following determinisms: det, semidet,
>> cc_multi, or cc_nondet.
>>
>> The non-locals of @var{Goal} must (presumably) not have an inst
>> equivalent to (mostly-)unique or any?  (Unless they have the type I/O state
>> or (later) the store/1.)
>>
>>> + at var{Params} must be a valid list of zero or more try parameters.
>>> +
>>> +The try parameter @samp{io} takes a single argument, which must be the
>>> name
>>> +of a state variable prefixed by @samp{!}; for example, @samp{io(!IO)}.
>>> +The state variable must have the type @samp{io.state}, and be in scope
>>> +of the try goal.
>>
>> Is the @samp{io} parameter really needed at all?  Can't the compiler
>> just infer it by the use of I/O state in @var{Goal}?
>
> It can.  I originally thought it might make the implementation hard, but
> actually it shouldn't make much difference.  I can change it later if people
> think it's a good idea.  The only objection I might have is that it break the
> parallel with the other proposed try parameters, but those are extremely
> uncommon whereas try_io is even more common than plain try.

The only other proposed try parameters I can think of are store/0 and
the STM state - it ought to be able to infer both of those as well.
(Certainly the latter.)

I was wondering about the use of io(!IO) with try goals because the
same syntax is used with trace goals but it means something different
there, i.e. introduce a new I/O state as opposed to pass one in from
the enclosing scope.

>> The above description covers the operational semantics of try goals,
>> I think there needs to be a description of their declarative semantics
>> as well.  (Like what we have in the library reference manual for
>> try and friends.)
>
> This is what Ian and I came up with:
>
> @noindent
> The declarative semantics of a try goal without I/O is:
>
> @example
>        (try [] Goal
>         then Then
>         else Else
>         catch CP1 -> CG1
>         catch CG2 -> CG2
>         ...
>         catch_any CAV -> CAG
>        )  <=>
>                (
>                        Goal, Then
>                ;
>                        not Goal, Else
>                ;
>                        some [Excp]
>                        ( Excp = CP1 -> CG1
>                        ; Excp = CP2 -> CG2
>                        ; ...
>                        ; Excp = CAV, CAG
>                        )
>                ).
> @end example
>
> If no @samp{else} branch is present, let @samp{Else = fail}.
> If no @samp{catch_any} branch is present, let @samp{CAG = fail}.

Could you please post an updated version of just the reference manual
changes.

Cheers,
Julien.
--------------------------------------------------------------------------
mercury-reviews mailing list
Post messages to:       mercury-reviews at csse.unimelb.edu.au
Administrative Queries: owner-mercury-reviews at csse.unimelb.edu.au
Subscriptions:          mercury-reviews-request at csse.unimelb.edu.au
--------------------------------------------------------------------------



More information about the reviews mailing list