Notice: On April 23, 2014, Statalist moved from an email list to a forum, based at statalist.org.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

From |
"William Gould, StataCorp LP" <[email protected]> |

To |
[email protected] |

Subject |
Re: st: Unexpected end of file in mata. |

Date |
Thu, 23 Jan 2014 12:01:02 -0600 |

Amadou Diallo <[email protected]> has more Mata questions. His first question -- paraphrased -- is I understand this: : i = 1 : if (i==1) { > i > } ; 1 : _ i is one, the statement is true, and i is displayed. I don't understand the following, however, at all : if (i=2) { <- note, =, not == : i : } ; 2 What is going on? Even worse, why is i now 2? In order to explain this, let me define what Mata means by the term expression: An expression is a string of characters that, interpreted as mathematical/Mata notation, returns a value. The following are examples of expressions: 2+3 2*3 i==1 i sqrt(a^2+b^2) That 2+3 and 2*3 are expressions is hardly surprising. Think hard, however, about what it means for i to be an expression. Isn't i a variable name? Well, yes it is, but in an expression context, i is just an expression. It is the expression that returns the current contents (value) of i. I admit this is a fine point, but it's important. Here's another fine point. Look at this expression: sqrt(a) You may look at that and say, "That's the instruction to calculate the square root of a." I look at it, however, and say, "That's an expression. sqrt() is a function that happens to take one argument. The argument in this case is a, which is also an expression. The way this whole thing works out is that the expression a is evaluated, returning the value of a, then the function sqrt() is evaluated on the value of a, and it returns the squareroot." In Mata, the following is an expression, too: i = 2 You look at that and think, "i = 2 is the instruction to assign i to 2". I look at it and say, "i = 2 is an expression. = is an operator, just as +, -, *, >, are <= are operators. (i=2), the whole thing, which is why I bound it in parenthesis, is an expression, just as (2+3) is an expression. Expressions evaluate to a value. (i=2) evaluates to 2 in the same sense that (2+3) evaluate to 5. + is an operator. a+b means add a and b and return that value. = is an operator. a=b means assign the value of b to a and return that value. Get it? In mata, you can type things like this: c=(a=2+3)*(b=2*4) Stored in a will be 5. Stored in b will be 8. Stored in c will be 40. So let's dissect what happened when Amadou typed : if (i=2) { <- note, =, not == : i : } ; i=2 is an expression that returns 2. The = operator also stored 2 in i. Type typing -if (i=2)- Amadou was asking whether 2 is not equal to 0. 2 is indeed not equal to 0, so -if- entered the body of the -if-. The body of the -if- said to display the current value i. Mata displayed 2. Amadou also asked, > 1. The almost impossibility to trace down a mata code when it > crashes. In mata v12 manual p.907, you gave a tracelog example. > However, if the function solve() itself is very big (some > millions of line), how do you detect the error? Maybe the > tracelog should indicate the exact line where the problem arises > (as in C++ compiler or VB). First, I respectfully request that Amadou stop using the word crash. For us at StataCorp crash means crash as in crash and burn. It means Stata collapses in on itself, stops running, and perhaps writes a file containing a dump of memory. For us, crashes are Level 2 events. The only thing worse than crash is a Level 1 event -- giving a wrong answer that a knowledgeable person might interpret as a correct answer. Mata did not crash; the program Amadou aborted with error. The way I debug is by adding lines to my code that display what's happening. See slides 56-63 of "Mata, the missing manual", a talk I gave in 2010 in London. The talk can be found at www.stata.com/meeting/uk10/UKSUG10.Gould.pdf > Are there any equivalent command such as "capture" and "assert" or > other useful commands in mata? -assert- most certainly exists. You can always code, if (!(2==2)) { "assumption failure: 2 not equal to itself" "Mata is broken!" _error() } You don't have to code that, however, because Mata has an -assert()- function; see -help mata assert()-. assert(2==2) There is no equivalent to -capture- because you don't need it. It is absolutely true that there are things you can do that can fail for reasons outside of your control. For instance, I want to open file bill.txt and it might not exist. I code, fh = fopen("bill.txt", "r") and if the file does not exist, my program stops. However, there is another function, _fopen(), that will not abort execution and instead communicate back that the file didn't exist, fh = _fopen("bill.txt", "r") if (fh<0) { /* the file could not be opened, and fh contains a code telling you why that happened */ } else { /* the file opened and now ready for reading */ ... fclose(fh) } Whenever a function can fail for a reason outside of your control, there is a variant of the function that, rather than abort execution (note, I did not say crash), will send you back a code telling you whether the operation succeeded. Admittedly, Stata's -capture- command is an elegant solution for these kinds of problems. The problem is that -capture- just does not fit with a compiled as opposed to interpreted language. -- Bill [email protected] * * For searches and help try: * http://www.stata.com/help.cgi?search * http://www.stata.com/support/faqs/resources/statalist-faq/ * http://www.ats.ucla.edu/stat/stata/

**Follow-Ups**:**Re: st: Unexpected end of file in mata.***From:*Amadou DIALLO <[email protected]>

- Prev by Date:
**Re: st: graph results of bitest stratified with by(var)** - Next by Date:
**Re: st: graph results of bitest stratified with by(var)** - Previous by thread:
**Re: st: Unexpected end of file in mata.** - Next by thread:
**Re: st: Unexpected end of file in mata.** - Index(es):