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
|
|
|
```
|