Instructor: Stefan Mitsch
What should be the basic building blocks of computations?
x := 5
x >= y
if (x<4) then 2 else 3
x := * from [0,10]
x := * s.t. 0 <= x
x := * s.t. x=5
Is this Scala?
def f (x: Int) : Int = var y: Int = 0 if x!=0 then y=1 else y=2 y
Is this C?
int f (int x) { int y; if (x) y=1; else y=2; return y;}
def f (x: Int) : Int = { var y: Int = 0 y = if x!=0 then 1 else 2 y}
int f (int x) { int y; y = if (x) 1 else 2; return y;}
if ... else
def f (x: Int) : Int = { var y: Int = 0 y = (x!=0 ? 1 : 2) y}
if ...
int f (int x) { int y; y = x ? 1 : 2; return y;}
def f (x: Int) : Int = { var xx = x var y: Int = 0 y = { var z=0 while (xx>0) do {xx=xx-1; z=z+1} z } y}
int f (int x) { int y; y = { int z=0; while (x>0) {x--; z++;} return z; } return y;}
def g (x: Int) : Int = { var xx = x var z = 0 while xx>0 do { xx=xx-1; z=z+1 } z}def f (x: Int) : Int = g(x)
int g (int x) { int z=0; while (x>0) { x--; z++; } return z;}int f (int x) { return g(x);}
mov eax, 5add eax, 6mov ebx, eax
5+6
f (1 + 2 * "hello".length)
Scala does not have statements, everything is an expression!
printf("hello");^^^^^^^^^^^^^^^ expression^^^^^^^^^^^^^^^^ statement
return 1+x; ^^^ expression^^^^^^^^^^^ statement
int count = 0;while (1) { int ch = getchar(); switch (ch) { case -1: return count; case 'a': count = count + 1; default: continue; }}
Cannot use statements verbatim as part of expressions How can we turn statements into an expression?
Post-increment
x++
Add and assign
x += 2
Assignment
x = (y = 5)
Combined
x -= (y += 5)
int x = 1;printf ("%d\n", ++x); ////
int x = 1;printf ("%d\n", x++); ////
x = 1 + (y = 5); //
int x = 1;printf ("%d\n", (x = x + 1) + x); //
int x = 1;printf ("%d\n", ++x); // pre increment, prints 2// value of x is now 2
int x = 1;printf ("%d\n", x++); // post increment, prints 1// value of x is now 2
x = 1 + (y = 5); // assigns 5 to y and 6 to x
int x = 1;printf ("%d\n", (x = x + 1) + x); // no "sequence point", undefined!
{ e1; e2; ...; en }
{ e1 e2 ... en}
( e1, e2, ..., en )
( e1, e2, ... en)
e1
en-1
en
string s; while(read_string(s), s.len() > 5) { // do something }
int main () { int x = 5; x *= 2; printf ("%d\n", x);}
int main () { int x = 5; printf ("%d\n", (x *= 2, x)); // behavior defined because comma operator introduces sequence point}
e1, e2, ... en
e1 ? e2 : e3