[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