# Tampio vs JavaScript

Side-by-side comparisons. Every Tampio program compiles to JavaScript — these show what that translation looks like.

## Hello World

**Tampio**
```tampio
Kun nykyinen sivu avautuu,
    teksti "Hei maailma!" näytetään käyttäjälle.
```

**JavaScript**
```js
document.avautua = function() {
    alert("Hei maailma!");
};
document.avautua();
```

---

## Function Definition

**Tampio**
```tampio
Pienen luvun kertoma on
    riippuen siitä, onko se pienempi tai yhtä suuri kuin yksi,
    joko yksi
    tai pieni luku kerrottuna pienen luvun edeltäjän kertomalla.

Luvun edeltäjä on se vähennettynä yhdellä.
```

**JavaScript**
```js
Number.prototype.f_kertoma = function() {
    var pieni_luku = this;
    return (this <= 1) ? 1 : pieni_luku * pieni_luku.f_edeltäjä().f_kertoma();
};

Number.prototype.f_edeltäjä = function() {
    return this - 1;
};
```

The parameter `pieni luku` ("small number") becomes the variable name in the compiled JS. `se` compiles to `this`.

---

## Variable Declaration

**Tampio**
```tampio
Olkoon pieni muuttuja uusi muuttuja, jonka arvo on nolla.
```

**JavaScript**
```js
var pieni_muuttuja = new muuttuja({ arvo: 0 });
```

---

## Class Definition

**Tampio**
```tampio
Vektorilla on komponentit.
```

**JavaScript**
```js
function vektori(vals) {
    if ("komponentit" in vals) this.komponentit = vals["komponentit"];
    else this.komponentit = [];
}
```

Fields are constructor parameters. Plural fields become arrays, singular fields become single values.

### Subclass

**Tampio**
```tampio
Työntekijä on henkilö, jolla on työnantaja.
```

**JavaScript**
```js
function tyontekija(vals) {
    henkilö.call(this, vals);
    if ("työnantaja" in vals) this.työnantaja = vals["työnantaja"];
}
tyontekija.prototype = Object.create(henkilö.prototype);
```

---

## Method Definition

**Tampio**
```tampio
Kun nykyinen sivu avautuu,
    pieneen muuttujaan luetaan luku
ja  nykyinen sivu näyttää pienen muuttujan arvon kertoman.
```

**JavaScript**
```js
HTMLDocument.prototype.avautua = function() {
    pieni_muuttuja.lukea_luku();
    this.write(pieni_muuttuja.f_arvo().f_kertoma());
};
```

`Kun` = method definition. The self object (`nykyinen sivu`) becomes `this`. Multiple statements separated by commas compile to sequential calls; `ja` marks the last one.

---

## If Statement

**Tampio**
```tampio
jos lyhyen vektorin dimensio ei ole nolla, niin
    nykyinen sivu näyttää lyhyen vektorin ensimmäisen komponentin
ja  lyhyen vektorin häntä painetaan nykyiselle sivulle.
```

**JavaScript**
```js
if (lyhyt_vektori.f_dimensio() !== 0) {
    nykyinen_sivu.näyttää(lyhyt_vektori.f_ensimmäinen_komponentti());
    lyhyt_vektori.f_häntä().painetaan(nykyinen_sivu);
}
```

---

## Arithmetic

**Tampio**
```tampio
pieni luku kerrottuna pienen luvun edeltäjän kertomalla
```

**JavaScript**
```js
pieni_luku * pieni_luku.f_edeltäjä().f_kertoma()
```

| Tampio | JS | Second arg case |
|---|---|---|
| `x lisättynä y:hin` | `x + y` | illative |
| `x vähennettynä y:llä` | `x - y` | adessive |
| `x kerrottuna y:llä` | `x * y` | adessive |
| `x jaettuna y:llä` | `x / y` | adessive |
| `x rajattuna y:hin` | `x % y` | illative |

---

## Field Access

Field access looks identical to a function call — both use genitive.

**Tampio**
```tampio
pienen muuttujan arvo        # field access
pienen luvun kertoma         # function call
```

**JavaScript**
```js
pieni_muuttuja.arvo          // field access
pieni_luku.f_kertoma()       // function call (note the f_ prefix)
```

The compiler adds an `f_` prefix to function calls to distinguish them from raw field accesses.

---

## Output

**Tampio**
```tampio
nykyinen sivu näyttää tekstin "Tulos: "
nykyinen sivu näyttää pienen luvun kertoman
teksti "Virhe!" näytetään käyttäjälle
```

**JavaScript**
```js
document.write("Tulos: ");
document.write(pieni_luku.f_kertoma());
alert("Virhe!");
```
