[m-users.] Free and Ground in the same error line?

Sean Charles (emacstheviking) objitsu at gmail.com
Sat Oct 28 21:27:25 AEDT 2023


I have an error I don't quite understand, here is the code, it's a simple DCG type predicate to check that either the next token is a class name or an s-expression containing just a class name and a superclass name,

    380 :- pred get_class_superclass(
    381     ps::out, maybe(ps)::out, sr_stack::in, sr_stack::out
    382 ) is semidet.
    383
    384 get_class_superclass(Class, Super) -->
    385     ( if [ tk(Cp, Cb) ] then {
    386         Class = ps(Cp, Cb),
    387         Super = no
    388     }
    389     else if [ sexp(_, [ tk(Cp, Cb), tk(Sp, Sb) ]) ] then {
    390         Class = ps(Cp, Cb),
    391         Super = yes(ps(Sp, Sb))
    392     } ).

and the error message:

Making Mercury/cs/shred.c
shred.m:389: In clause for `get_class_superclass(out, out, in, out)':
shred.m:389:   mode mismatch in if-then-else.
shred.m:389:   The variable `Class' is ground in some branches but not others.
shred.m:389:     In this branch, `Class' is free.
shred.m:389:     In this branch, `Class' is ground.
shred.m:389:   The variable `Super' is ground in some branches but not others.
shred.m:389:     In this branch, `Super' is free.
shred.m:389:     In this branch, `Super' is ground.
** Error making `Mercury/cs/shred.c'.
make: *** [felt] Error 1

How can a variable be both free and ground at the same time?
Is it the if/else-if and it being a semidet predicate?

Not sure!
Thanks,
Sean

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurylang.org/archives/users/attachments/20231028/9d07e377/attachment.html>


More information about the users mailing list