# 2. Getting started

## The prompt

Run `basic` with no arguments and you get a prompt:

```sh norun
$ ./build/basic
READY
```

`READY` is printed whenever the interpreter is waiting for you, which is at startup
and after a program stops.

At the prompt, anything you type **with a line number** is stored as part of a program,
and anything you type **without** one runs immediately:

```basic repl
PRINT 2 + 2
```

```output
4
```

That rule is the prompt's, and only the prompt's. **A program in a file does not need
line numbers at all** — see [Line numbers](#line-numbers) below.

## Your first program

```basic repl
10 PRINT "WHAT IS YOUR NAME"
20 INPUT "> " N$
30 PRINT "HELLO, " + N$
RUN
ADA
```

```output
WHAT IS YOUR NAME
> HELLO, ADA
READY
```

The last line of the first block is not part of the program — it is what you type when
`INPUT` asks.

Type `LIST` to see it back, `RUN` to run it again, and `NEW` to throw it away.

## Line numbers

Lines are stored under their numbers and run in numeric order, so the gaps are what
let you insert later:

```basic repl
10 PRINT "FIRST"
30 PRINT "THIRD"
20 PRINT "SECOND"
LIST
```

```output
10 PRINT "FIRST"
20 PRINT "SECOND"
30 PRINT "THIRD"
```

Typing a line number with nothing after it deletes that line. `DELETE 20-40` removes a
range, and `RENUMBER` tidies the whole program up — it rewrites every `GOTO` and
`GOSUB` to match, so it will not break your branches.

`AUTO 10` turns on automatic numbering so you do not have to type them; `AUTO 0` turns
it off again.

### A program in a file does not need them

Numbers are what tells the *prompt* a program line from a statement to run now. A file
has no such problem, so a program loaded from one — or handed to the library as a string
by a host — may leave them out entirely:

```basic
PRINT "COUNTING:"
FOR I# = 1 TO 3
  PRINT I# * I#
NEXT I#
PRINT "DONE"
```

```output
COUNTING:
1
4
9
DONE
```

Lines with no number are given the next one going, so they still run in the order you
wrote them, and a blank line costs nothing. You can mix the two: a numbered line sets
where the next unnumbered one goes.

**A program written this way branches by `LABEL`**, which is what makes it worth doing —
see [Chapter 4](04-control-flow.md#labels). Numbers you never wrote are not numbers you
can branch to, and saying so is the one thing the interpreter is strict about:

```basic
PRINT "A"
GOTO 2
```

```output
? 2 : PARSE ERROR Line 2: branch to line 2, which the program did not number. Branch by LABEL, or RENUMBER first

```

`LIST` shows the numbers it handed out, so you can still edit a loaded program at the
prompt, and `DSAVE` writes them into the file. They come out one apart, with no gaps to
insert into — `RENUMBER` before you save if you want the gaps back.

## Several statements on one line

Statements are separated by colons:

```basic
10 A# = 1 : B# = 2 : PRINT A# + B#
```

```output
3
```

There is one important limit: **block structures do not work inside a single line.**

```basic
10 FOR I# = 1 TO 3 : PRINT I# : NEXT I#
20 PRINT "DONE"
```

```output
DONE
```

prints nothing at all. The loop body is skipped entirely, because the interpreter skips
forward a *line* at a time looking for the `NEXT` and never finds one on the line it is
already past. Write loops across several lines:

```basic
10 FOR I# = 1 TO 3
20 PRINT I#
30 NEXT I#
```

```output
1
2
3
```

The same applies to `DO`/`LOOP`.

## Running a file

```sh setup=program
$ ./build/basic program.bas
```

```output
HELLO FROM A FILE
```

The file is read, stored, and run. It is exactly the same as typing the program in and
saving yourself the trouble.

You can also pipe a program in:

```sh
$ echo '10 PRINT "HI"
RUN' | ./build/basic
```

```output
READY
HI
READY
```

## Saving and loading

```basic repl
10 PRINT "HI"
DSAVE "myprogram.bas"
NEW
DLOAD "myprogram.bas"
LIST
```

```output
10 PRINT "HI"
```

That is a whole round trip: save it, throw it away with `NEW`, load it back, and `LIST`
shows it again.

`SAVE` and `LOAD` are the same verbs under their other names. `VERIFY "myprogram.bas"`
compares what is in memory against the file and prints `OK` if they match.

## Stopping

`QUIT` ends the interpreter. `STOP` stops a *program* and returns you to the prompt,
where `CONT` resumes it from where it stopped. `END` also stops the program, but does
not arm `CONT`.

In the SDL build, closing the window stops the program too.
