bang language
Go to file
2022-12-10 22:56:17 -05:00
bin blangfile(1) 2022-12-09 21:34:03 -05:00
example more reference 2022-12-10 22:56:17 -05:00
src mirror and brackets 2022-12-09 21:59:48 -05:00
.gitignore more doc 2022-12-09 21:59:24 -05:00
LICENSE
Makefile blangfile(1) 2022-12-09 21:34:03 -05:00
README.md more reference 2022-12-10 22:56:17 -05:00

/*  _     _                       _
   | |   / |                     / /
   | |__| ||__ _ _ __   __ _    / /
   | '_ | |/  ' | '_ \ / _' |  / /
   | \_|| | ||  | | | | /_| | /_/
    \___/_____/___| |__,_  / _
                     |____/  */

blang!

the bang language

Public domain. 2022 DTB.

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.

Examples

true(1)

; initialize hand to 0
^

; set the chart pointer to 0 - this destroys the chart
; and the program exits with the value of the hand
* 

Hello world:

; the <.> construct uses '<' to literally 'palm' the next value
; (store into hand), does so, and uses '>' to 'toss' (output hand's value)
<H><e><l><l><o><,>< ><w><o><r><l><d><!><
>^*