blang/README.md

126 lines
2.6 KiB
Markdown
Raw Normal View History

2022-12-09 04:45:46 +00:00
```
2022-12-09 04:46:43 +00:00
/* _ _ _
| | / | / /
| |__| ||__ _ _ __ __ _ / /
| '_ | |/ ' | '_ \ / _' | / /
| \_|| | || | | | | /_| | /_/
\___/_____/___| |__,_ / _
|____/ */
2022-12-09 04:45:46 +00:00
```
# blang!
the bang language
2022-12-09 04:41:52 +00:00
2022-12-09 04:45:46 +00:00
Public domain. 2022 DTB.
2022-12-11 03:56:17 +00:00
## Glossary
### chart
The listing of the program currently running.
This can be modified during runtime.
### command
A character that indicates what the bang language executor should do next.
### hand
The general-purpose register.
### catch
To set the hand to a value.
### throw
To set a value to the contents of the hand.
## Reference
All operations are one character long.
When an unknown operation is executed the resulting behavior is undefined
(and maliciously so; for example, execution can stop or garbage can be written to the chart).
### `'!'`
No-op. Does nothing.
`' '`, `'\n'`, `'\r'`, `'\t'`, and `'\v'` are all also no-ops
\- keep this in mind when styling code that contains `'?'`!
### `';'`
Denotes a comment.
A comment starts with a semicolon (or `'#'`, for compatibility with shebangs)
and ends with a bang (`'!'`) or line feed (`'\n'`).
### `'%'`
Throws at the current location in the program listing to which chart points.
### `'^'`
Catches the constant `0`.
### `'&'` and `'*'`
`'&'` (ampersand) palms the chart. `'*'` (splat) throws the chart.
The following program rewrites itself during runtime using ampersand and splat:
```
^{?>!&++*<!%&++*<<%&+*<
%&+*<>%&+*<^%<!}
^; zero out hand
{?>; set return point; if hand is non-zero, print hand
!&++*; palm the chart; add 2 to palm; splat the new chart
<!%; write '!' to the new chart position
&++*; palm the chart; add 2 to palm; splat the new chart
<<%; write '<' to the new chart position
&+*; advance the chart one space
<
%; write '\n' to the new chart position
&+*; advance the chart one space
<>%; write '>' to the new chart position
&+*; advance the chart one space
<^%; write '^' to the new chart position
<!; palm '!'
}; return
```
Right before the final `'}'`, the chart is the following:
```
^{!><
>^*<!%&++*<<%&+*<
%&+*<>%&+*<^%<!}
^; zero out hand
{!>; print hand
<
>; palm `'\n'`; print hand
^*; splat zero to chart
The rest of the program isn't executed.
```
2022-12-10 02:59:24 +00:00
## Examples
2022-12-09 04:45:46 +00:00
2022-12-10 02:59:24 +00:00
### true(1)
2022-12-09 04:45:46 +00:00
```
2022-12-10 02:05:38 +00:00
; initialize hand to 0
^
2022-12-10 00:46:32 +00:00
; set the chart pointer to 0 - this destroys the chart
; and the program exits with the value of the hand
*
2022-12-09 04:45:46 +00:00
```
2022-12-10 02:59:24 +00:00
### Hello world:
2022-12-09 04:45:46 +00:00
```
2022-12-10 02:05:38 +00:00
; the <.> construct uses '<' to literally 'palm' the next value
; (store into hand), does so, and uses '>' to 'toss' (output hand's value)
2022-12-09 04:45:46 +00:00
<H><e><l><l><o><,>< ><w><o><r><l><d><!><
2022-12-10 00:46:32 +00:00
>^*
2022-12-09 04:45:46 +00:00
```