Finish format/typo check 1991/brnstnd/README.md
This commit is contained in:
1 parent
b7784a3102
commit
d7332c2165
1 file changed
+37
-38
+37
-38
@@ -51,7 +51,7 @@ instance, not to mention infinite-depth tail recursion.
|
|||||||
|
|
||||||
SORTA ignores its arguments (though it makes them available to the
|
SORTA ignores its arguments (though it makes them available to the
|
||||||
script); it takes all commands, character by character, from its
|
script); it takes all commands, character by character, from its
|
||||||
standard input. Unrecognized commands are repeated with a `'?'`.
|
standard input. Unrecognized commands are repeated with a '?'.
|
||||||
|
|
||||||
SORTA maintains an `i` stack for integers and an `s` stack for strings. It also
|
SORTA maintains an `i` stack for integers and an `s` stack for strings. It also
|
||||||
keeps track of `programs`, one for each character. Operations are silently
|
keeps track of `programs`, one for each character. Operations are silently
|
||||||
@@ -72,28 +72,28 @@ delimiters.
|
|||||||
- `"string"`: push that string on top of the `s` stack, no length limit
|
- `"string"`: push that string on top of the `s` stack, no length limit
|
||||||
- `[string]`: push that string on top of the `s` stack, no length limit
|
- `[string]`: push that string on top of the `s` stack, no length limit
|
||||||
- `#`: make top of `i` stack non-destructively in ASCII, push result onto `s` stack
|
- `#`: make top of `i` stack non-destructively in ASCII, push result onto `s` stack
|
||||||
- ` ` `: print top of `s` stack non-destructively
|
- `` ` ``: print top of `s` stack non-destructively
|
||||||
- `$`: print top of `s` stack non-destructively without newline
|
- `$`: print top of `s` stack non-destructively without newline
|
||||||
- `d`: drop (pop) top of `i` stack
|
- `d`: drop (pop) top of `i` stack
|
||||||
- `D`: dup (duplicate) top of `i` stack
|
- `D`: dup (duplicate) top of `i` stack
|
||||||
- `'`: dup top of s stack
|
- `'`: dup top of `s` stack
|
||||||
- `s`: pop top of i stack. If it is `n`, swap `(n+1)`th-top of `i` stack with top.
|
- `s`: pop top of `i` stack. If it is `n`, swap `(n+1)`th-top of `i` stack with top.
|
||||||
`1s`, for example, swaps the top two elements; `2s` swaps the top with the
|
`1s`, for example, swaps the top two elements; `2s` swaps the top with the
|
||||||
third down; etc. This always pops the top of the `i` stack, even upon
|
third down; etc. This always pops the top of the `i` stack, even upon
|
||||||
failure.
|
failure.
|
||||||
- `S`: pop top of `i` stack, then act just like `s` but upon `s` stack
|
- `S`: pop top of `i` stack, then act just like `s` but upon `s` stack
|
||||||
- `l`: pop top of `s` stack, push its length onto `i` stack
|
- `l`: pop top of `s` stack, push its length onto `i` stack
|
||||||
- `a`: push argc onto i stack
|
- `a`: push argc onto `i` stack
|
||||||
- `A`: pop top of `i` stack, push `argv[i]` on top of `s` stack
|
- `A`: pop top of `i` stack, push `argv[i]` on top of `s` stack
|
||||||
- `T`: concatenate top two elements of `s` stack
|
- `T`: concatenate top two elements of `s` stack
|
||||||
- ` _ `: negate top of i stack
|
- `_`: negate top of `i` stack
|
||||||
- `+`: pop top two elements of i stack, add, push back sum
|
- `+`: pop top two elements of `i` stack, add, push back sum
|
||||||
- ` * `: pop top two elements of i stack, multiply, push back product
|
- `*`: pop top two elements of `i` stack, multiply, push back product
|
||||||
- `/`: pop top two elements of i stack, divide, push back quotient
|
- `/`: pop top two elements of `i` stack, divide, push back quotient
|
||||||
- `>`: pop top two elements of i stack, compare, push back 1 or 0 as in C
|
- `>`: pop top two elements of `i` stack, compare, push back 1 or 0 as in C
|
||||||
- `&`: pop top two elements of i stack, nand, push back bitwise result
|
- `&`: pop top two elements of `i` stack, NAND, push back bitwise result
|
||||||
Note that nand is sufficient to construct all bitwise operations, as
|
Note that NAND is sufficient to construct all bitwise operations, as
|
||||||
demonstrated by icalc below.
|
demonstrated by `icalc` in [sorta.README.md](sorta.README.md).
|
||||||
|
|
||||||
### System operations
|
### System operations
|
||||||
|
|
||||||
@@ -106,31 +106,31 @@ reading keyboard input or a script, as the forked programs share file
|
|||||||
descriptors. It is always safe inside a program (see below).
|
descriptors. It is always safe inside a program (see below).
|
||||||
- `P`: `pipe()`, push two ends `<p0> <p1>` onto `i` stack. In case of trouble,
|
- `P`: `pipe()`, push two ends `<p0> <p1>` onto `i` stack. In case of trouble,
|
||||||
`push <?> <-1>` onto `i` stack.
|
`push <?> <-1>` onto `i` stack.
|
||||||
- `w`: `wait()`, push successful result (or -1 if no children) on `i` stack
|
- `w`: `wait()`, push successful result (or `-1` if no children) on `i` stack
|
||||||
- `!`: `execvp()` top of the `s` stack. Arguments are the next things down on
|
- `!`: `execvp()` top of the `s` stack. Arguments are the next things down on
|
||||||
the s stack, in reverse order from popping; the first character of
|
the `s` stack, in reverse order from popping; the first character of
|
||||||
each string is lopped off. There must be an empty string somewhere
|
each string is lopped off. There must be an empty string somewhere
|
||||||
in the s stack to terminate the argument list. If the execve()
|
in the `s` stack to terminate the argument list. If the `execve()`
|
||||||
fails, any operation involving current members of the s stack has
|
fails, any operation involving current members of the `s` stack has
|
||||||
undefined effects, and -1 is pushed onto the i stack.
|
undefined effects, and `-1` is pushed onto the `i` stack.
|
||||||
|
|
||||||
### High-level language operations
|
### High-level language operations
|
||||||
|
|
||||||
- :x: copy the top of the s stack into a program labeled by character x
|
- `:x`: copy the top of the `s` stack into a program labeled by character `x`
|
||||||
- =x: pop the top of the i stack. If it was nonzero, execute the program
|
- `=x`: pop the top of the `i` stack. If it was nonzero, execute the program
|
||||||
labeled by character x. Note that a digit at the end of a program
|
labeled by character `x`. Note that a digit at the end of a program
|
||||||
will merge with any digits after =x; in that case you usually want
|
will merge with any digits after `=x`; in that case you usually want
|
||||||
to add a space at the end of the program.
|
to add a space at the end of the program.
|
||||||
|
|
||||||
Common idioms: To drop the top of the s stack, ld. To do a <, 1s>. To
|
Common idioms: To drop the top of the `s` stack, `ld`. To do a `<`, `1s>`. To
|
||||||
unconditionally execute the program labeled by character x, 1=x (or any
|
unconditionally execute the program labeled by character `x`, `1=x` (or any
|
||||||
nonzero number followed by =x). To print the top of the i stack
|
nonzero number followed by `=x`). To print the top of the `i` stack
|
||||||
non-destructively, `# ` ` (or `#$` if you don't want the newline). To
|
non-destructively, `#` (or `#$` if you don't want the newline). To
|
||||||
subtract, `_+`. To do mod or and or any of the other missing operations,
|
subtract, `_+`. To do mod or and or any of the other missing operations,
|
||||||
combine the available operations as illustrated below. To introduce a
|
combine the available operations as illustrated below. To introduce a
|
||||||
comment, `[ this is a comment string which is promptly eliminated ]ld`.
|
comment, `[ this is a comment string which is promptly eliminated ]ld`.
|
||||||
|
|
||||||
SORTA's requirements: it wants `fork()`, `execvp()`, `open()`,
|
`SORTA`'s requirements: it wants `fork()`, `execvp()`, `open()`,
|
||||||
`close()`, `dup()`, `pipe()`, and `wait()`, so it obviously won't even compile
|
`close()`, `dup()`, `pipe()`, and `wait()`, so it obviously won't even compile
|
||||||
on a non-UNIX machine. It also assumes that you have a size-256
|
on a non-UNIX machine. It also assumes that you have a size-256
|
||||||
character set and that the characters between `'0'` and `'9'` are exactly
|
character set and that the characters between `'0'` and `'9'` are exactly
|
||||||
@@ -155,17 +155,16 @@ Without documentation and example scripts, someone would find it
|
|||||||
a challenge to figure out what the arrays are used for, let alone
|
a challenge to figure out what the arrays are used for, let alone
|
||||||
that SORTA is a scripting language.
|
that SORTA is a scripting language.
|
||||||
|
|
||||||
Another nice feature is that the SORTA language itself encourages
|
Another nice feature is that the SORTA language itself encourages you to write
|
||||||
you to write not merely obfuscated but plain incomprehensible
|
not merely obfuscated but plain incomprehensible scripts (like the [examples in
|
||||||
scripts (like the examples below---after working with the language
|
sorta.README.md](sorta.README.md) ---after working with the language for a
|
||||||
for a while, I guess I can read it pretty easily, but I also think
|
while, I guess I can read it pretty easily, but I also think FORTH is a
|
||||||
FORTH is a beautiful language). The numbers running around
|
beautiful language). The numbers running around everywhere will make people
|
||||||
everywhere will make people think of ASCII, even though the code is
|
think of ASCII, even though the code is not ASCII-dependent. What's your first
|
||||||
not ASCII-dependent. What's your first thought when you see
|
thought when you see several `arrays[256]`? This is pretty standard obfuscation
|
||||||
several arrays[256]? This is pretty standard obfuscation otherwise.
|
otherwise. I like the way that unbalanced macro braces can throw off the reader
|
||||||
I like the way that unbalanced macro braces can throw off the
|
in `if(c>0){y+1]=z[c];`, and I had fun covering the alphabet with `#define`s,
|
||||||
reader in `if(c>0){y+1]=z[c];`, and I had fun covering the
|
but that's nothing special.
|
||||||
alphabet with `#define`s, but that's nothing special.
|
|
||||||
|
|
||||||
Possible future extensions to SORTA include string extraction and
|
Possible future extensions to SORTA include string extraction and
|
||||||
matching, reading from files into strings, and encrypting the string
|
matching, reading from files into strings, and encrypting the string
|
||||||
|
|||||||
Reference in new issue
Block a user