Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.
From | Thomas Jacobs <thomasjacobs@gmail.com> |
To | statalist@hsphsun2.harvard.edu |
Subject | Re: RE: st: RE: Irritating if...else question for mata vs. stata |
Date | Mon, 7 Jun 2010 11:51:36 -0500 |
Bill, Thanks very much. An education, as always. You captured my Sunday quite well, by the way, in Faulkner fashion. Tom On Mon, Jun 7, 2010 at 10:57 AM, William Gould, StataCorp LP <wgould@stata.com> wrote: > > Thomas Jacobs <thomasjacobs@gmail.com> writes, > > > Here is how the final part of the mata code appears utilizing the > > belief that mata if blocks need not be followed by empty else blocks > > and the error it generates: > > > > : if (FirstCDXDay > 0) { > > > > > > CDXAdjSizePowVRight = vec(CountCDXAdjSizePowRight') > > > CDXMktSizePowVRight = vec(CountCDXMktSizePowRight') > > > CDXAdjSizePowVLeft = vec(CountCDXAdjSizePowLeft') > > > CDXMktSizePowVLeft = vec(CountCDXMktSizePowLeft') > > > > > > } > > > > > > end > > unexpected end of line > (117 lines skipped) > > Thomas goes on to note that when he "adds back the heretofore extraneous else > block and the program continues on to successful completion": > > > : if (FirstCDXDay > 0) { > > > > > > CDXAdjSizePowVRight = vec(CountCDXAdjSizePowRight') > > > CDXMktSizePowVRight = vec(CountCDXMktSizePowRight') > > > CDXAdjSizePowVLeft = vec(CountCDXAdjSizePowLeft') > > > CDXMktSizePowVLeft = vec(CountCDXMktSizePowLeft') > > > > > > } > > > else{ > > > } > > Thomas concludes, > > > Any suggestions for what I may be missing or how I might better > > understand what is going on here? [...] > > [There] certainly there must be some explanation for such behavior. > > It has happened to me before and I make a habit of posting empty > > else blocks all over the place and > > > Why this is happening > --------------------- > > Thomas is entering > > : if (<exp>) { > > ... > > } > > _ > > interactively or in a do-file. Mata is trying to figure out when > Thomas is done entering the the line. Mata says to itself, "Thomas > start with -if-, entered an expression, and the body. I understand > that. Possibly Thomas will have an -else- clause following this. > Oops, Thomas hit Enter gain. I wonder why Thomas wants all that white > space? Oh well, possibly Thomas will have an -else- clause following > the -if- and white space. Hey! Where is Thomas? He hasn't typed > anything in while. Ah, there he is, reviewing the manuals again. > Smart. But getting back to the problem at hand, possibly Thomas will > have an -else- clause following the -if-, white space, and manual > review. What? Even more white space? Okay. Perhaps Thomas will > have an -else- clause following the -if-, white space, manual review, > and even more white space. Boy am I glad I don't have the microphone > on. Thomas looks really mad. I wonder why? Oh well, perhaps Thomas > will have an -else- clause following the -if-, white space, manual > reivew, more white space, and getting over his anger. Oh no, Thomas > is crying. I've seen him do that before. Oh well, possibly Thomas > will have an -else- clause following the -if-, white space, manual > review, more white space, getting over his anger, and now the bad news > he obviously received. I'll give him another ">" prompt. Maybe that > will make him feel better." > > Mata is a one-token look-ahead compiler, which is to say that in cases > such as -if- possibly followed by -else-, Mata has to wait and see > what follows before he it can interpret and compile what's typed. > > If Thomas had typed > > : if (<exp>) { > > ... > > } > > x = 3 > > : _ > > Mata would have quickly figure out that there is no -else- and Thomas > would never have known that Mata was looking ahead to determine whether > an -else- would follow the -if-. Usually, -if-s appear in function > definitions, and no one notices when Mata looks ahead. When > you type > > : function xxx() > > { > > ... > > } > > : _ > > Mata does not look seriously inside the braces until you enter the > final closing brace. Thus, Mata can look ahead all it wants and you > don't even know it. > > Most real compilers don't have a a line-by-line interactive mode. > Mata does. > > In line-by-line interatactive mode, most people don't type -if-. That's > why we've been able to go so long with no else noticing when Mata > looks ahead. > > > Another solution > ---------------- > > Thomas's solution has been to type -else- Mata is watching for: > > > : if (<exp>) { > > ... > > } > > else { > > } > > : _ > > That was a good solution in that it got Thomas through the problem. > Mata however, is not demanding that there be an -else-, Mata is just > waiting to see if there is an -else. Another solution is to type > a semicolon to the end the line: > > : if (<exp>) { > > ... > > } ; > > : _ > > Mata does not require semicolons to end lines as C does, but Mata allows > them, and when typed, Mata takes them seriously. > > When Mata was locked into its loop "Possibly Thomas wll have an > -else- clause following the -if-", had Thomas typed an -;- > Mata would have immediately thought, "Evidently not. This is fun". > > > > Cheers, > > -- Bill > wgould@stata.com > * > * For searches and help try: > * http://www.stata.com/help.cgi?search > * http://www.stata.com/support/statalist/faq > * http://www.ats.ucla.edu/stat/stata/ -- Thomas Jacobs * * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/statalist/faq * http://www.ats.ucla.edu/stat/stata/