<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-15">
<META content="MSHTML 6.00.6000.16825" name=GENERATOR></HEAD>
<BODY style="MARGIN: 4px 4px 1px">
<DIV>Martin:</DIV>
<DIV> </DIV>
<DIV>I've only scanned your code briefly here, but I would suspect that you are running out of stack space due to infinite recursion.</DIV>
<DIV> </DIV>
<DIV>I may be wrong here, but I think you have an infinite loop.</DIV>
<DIV> </DIV>
<DIV>Reason is that in B() you call A() again, but in the call to A() you also recursively call B() as one of the parameters to A().  Since all the parameters have to be evaluated before you can call A(), you wind up calling B() recursively with no termination condition since the test for k<=0 only occurs in A(), not B().</DIV>
<DIV> </DIV>
<DIV>Regards,</DIV>
<DIV>Randy Coleburn<BR><BR>>>> Martin Bishop <martinbishop@bellsouth.net> 5/14/2009 2:25 PM >>><BR>I tried implementing Knuth's Man or Boy test in Modula-3, but I can't <BR>get it to work.<BR><BR>I assumed the code I had wouldn't work (and I was right), but eventually <BR>I fiddled enough and got it to compile, but now it just segfaults when run.<BR><BR>MODULE ManOrBoy EXPORTS Main;<BR><BR>IMPORT IO, Fmt;<BR><BR>PROCEDURE Zero(): INTEGER = BEGIN RETURN 0; END Zero;<BR>PROCEDURE One(): INTEGER = BEGIN RETURN 1; END One;<BR>PROCEDURE Neg(): INTEGER = BEGIN RETURN -1; END Neg;<BR><BR>PROCEDURE A(k:INTEGER; x1, x2, x3, x4, x5: INTEGER): INTEGER =<BR><BR>  PROCEDURE B(): INTEGER =<BR>    BEGIN<BR>      DEC(k);<BR>      RETURN A(k, B(), x1, x2, x3, x4);<BR>    END B;<BR><BR>  BEGIN<BR>    IF k <= 0 THEN<BR>      RETURN x4 + x5;<BR>    ELSE<BR>      RETURN B();<BR>    END;<BR>  END A;<BR><BR>BEGIN<BR>  IO.Put(Fmt.Int(A(10, One(), Neg(), Neg(), One(), Zero())) & "\n");<BR>END ManOrBoy.<BR><BR>All I know is that it segfaults at procedure B.<BR><BR></DIV></BODY></HTML>