# Syntax error: newline character interpreted as multiplication

I'm getting this error in Wolfram Workbench, and I don't know where it comes from: "Syntax error: newline character interpreted as multiplication"

This error happens around an If[] function, in a custom function, defined as

myFunction[x_,y_] :=

Module[{variable},

(* some code *)
variable = 1
If[x==2,x=3,x=4]

(* some code *)

]


No matter where I try to put my If[] function inside myFunction[], I get this error, but I don't get it if I put it outside myFunction[].

Maybe the problem comes from the Module[] function, as when I take it out the error disappears.

Any idea what's going on?

-
Adding ; solved the problem but I don't get what's wrong if I don't put it! –  su1 Jan 15 '13 at 13:06
I actually cannot reproduce the error in question with Mathematica 8, even adding a line of code after the If statement with no semicolon does not yield an error, it just multiplies the two lines together. Could you edit your question to include the minimum amount of code to reproduce the error message? –  Guillochon Jan 16 '13 at 1:10
done. The above code will give the error at the line of "variable = 1", underlining "1" and "If". In the example above, I have to add a ";" after "variable = 1" to solve the problem. Note that I see this error only in Workbench and not in Mathematica, and that I'm using Mathematica 9 and Workbench 2.0 –  su1 Jan 16 '13 at 9:26

This is a very common error, and one I am guilty of making more often than I care to admit. The difficulty lies in how Mathematica determines where one expression ends and another begins, and how this interpretation seems to change within a construct like Module, Block, For, etc. In the following, I will primarily discuss how this applies to the front-end, but the conclusions are valid for WorkBench, too.

Consider the following examples:

p = 5; q = 6
DownValues[In]
(* { ...
HoldPattern[In[7]] :> (p = 5; q = 6)
...}
*)


and

(r = 5;
s = 6)
DownValues[In]
(* { ...
HoldPattern[In[17]] :> (r = 5; s = 6)
...}
*)


versus

c = 5;
d = 6
DownValues[In]
(* { ...
HoldPattern[In[4]] :> (c = 5;), HoldPattern[In[5]] :> (d = 6)
...}
*)


where I used the DownValues of In to show how Mathematica interprets the input lines. The first two examples are interpreted in exactly the same way as a single input line of code, but the third example produces two input lines. The key difference is that in the second example the carriage return is no longer interpreted as an input line delimiter because it is within an expression. Of course, this does not mean that

a
b


is interpreted as Times[a, b] as there is no obvious way to interpret the two as connected. Within parentheses or as a function parameter, the interpretation of the carriage-return as a input line delimiter is suspended, and it is treated as multiplication along with the rest of the whitespace characters.

The change in behavior from an input line delimiter to an implicit multiplication has an interesting consequence, the following generates an error

(l = 5
m = 6)
DownValues[In]
(*
Set::write: "Tag Times in 5 m is Protected."
{ ...
HoldPattern[In[14]] :> (l = 5 m = 6)
...}
*)


Looking at the FullForm of Hold[(l = 5 m = 6)] reveals

FullForm[Hold[(l = 5 m = 6)]]
(*
Hold[Set[l, Set[Times[5, m], 6]]]
*)


telling us that we were trying to assign a value to Times. So, inside parentheses or as a function parameter, a semi-colon must be used to indicate that it is a compound expression.

-
What if the compound expression is a ListPlot? Adding a semi-colon will prevent the plot to be plotted. –  su1 Mar 26 '13 at 16:39
@SullivanOrlean yes it will, but, to be clear, that is a side effect of the Front-end encountering a Graphics object. The semi-colon prevents that by returning the second argument to ListPlot[Range[5]]; which is Null. –  rcollyer Mar 26 '13 at 18:13
OK so there is no way to prevent that? When I add a ListPlot command I get this error message "newline character interpreted as multiplication", same thing when I add parenthesis around my ListPlot, and if I add a semi-colon the graph is not plotted. Can we say to the Front-end that we have a compound expression in another way than by adding a semi-colon after the expression? –  su1 Mar 28 '13 at 13:41
Either capture the output, like Module[{g}, g=ListPlot[...]; (* do something *); g], or put it on the last line: Module[{...}, (* do something *); ListPlot[...]]. A third alternative is to include it as part of a List: Module[{...}, (* ... *); {output, ListPlot[...]}]. Note, in every case, the Graphics object is part of the return value of Module, so that the Front-end will see it. In a lot of what I do, I capture the output, as the Graphics object can be manipulated like any other expression, only its display form is special. –  rcollyer Mar 28 '13 at 13:54
None of the solutions work for me (mathematica 9.0.0.0, workbench 2.0). I always get the error message after g, after ListPlot[] in last positin or after the list containing ListPlot. –  su1 Mar 28 '13 at 14:04