<div class="gmail_quote">On 2 February 2012 05:50, Julian Fondren <span dir="ltr"><<a href="mailto:ayrnieu@gmail.com">ayrnieu@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<p>to make the problem clearer, you have here</p>
<p>  A = (func(X) = B, C),</p>
<p>How is this not like your definitions of named functions?<br></p>
<p></p></blockquote></div><div><br></div>It's got a lambda instead of a :- func body?<div><br></div><div>Maybe I'm fundamentally misunderstanding the syntax of funcs vs. preds.  (There doesn't appear to be a grammar for Mercury in the language reference so I'm only inferring what's permitted and what's not.)<br clear="all">
<div><br></div><div>Let's say I have a predicate like this:</div><div><br></div><div>a(X,Y) :- Y = X.</div><div><br></div><div>This is fine, right?  And the equivalent written as a function is this:</div><div><br></div>
<div>a(X) = X.</div><div><br></div><div>I know this is fine because I've just tested it.  The compiler doesn't vomit.  Now let's say that I want to do a calculation on X first.  Here it'll be a brain-dead calculation but the principle is the same whether it's something stupid like this or something that actually warrants breaking out the calculation into its own sub-step:</div>
<div><br></div><div>a(X,Y) :- B = X * 2, Y = B.</div><div><br></div><div>Again, the compiler doesn't puke on this and the result is as expected.  So the equivalent function is:</div><div><br></div><div>a(X) = B = X * 2, B.</div>
<div><br></div><div>Only that doesn't work because you get an operator precedence error on "=".  (It also looks pretty retarded.)  Time for plan B.</div><div><br></div><div>a(X) = (B = X * 2, B).</div><div><br>
</div><div>Whiiiiiiiiiiich… gives me the error that's mystified me so long.  I may be on to something here!  Let me take another crack at it.  Looking at the library source I see another way that functions are defined.  Let me see if the same kind of structure helps here.</div>
<div><br></div><div>a(X) = Y :- B = X * 2, Y = B.</div><div><br></div><div>OK, that works.  So let's see how that looks in a lambda.</div><div><br></div><div>A = (func(X) = Y :- B = X * 2, Y = B).</div><div><br></div>
<div>OK, that seems to work, so let's make B a func as well:</div><div><br></div><div><div>    A = (func(X) = Y :- </div><div>            B = (func(X) = Y :-</div><div>                    Y = X * 2</div><div>                ),</div>
<div>            Y = B</div><div>        ).</div></div><div><br></div><div>And…  Now I'm even more confused.  Yesterday when I tried that very structure I got lots of whining from the compiler about syntax errors on the :-. Damn.</div>
<div><br></div><div>Well, thanks for making me look at it more rigorously, Julian.  I don't know why it broke when I first tried it that way, but at least this gets me a step farther now!</div><div><br></div>-- <br>"Perhaps people don't believe this, but throughout all of the discussions of entering China our focus has really been what's best for the Chinese people. It's not been about our revenue or profit or whatnot."<br>
--Sergey Brin, demonstrating the emptiness of the "don't be evil" mantra.<br>
</div>