First draft of a real README for the VVS stdlib.
authorAaron Taylor <ataylor@subgeniuskitty.com>
Mon, 30 Mar 2020 07:36:44 +0000 (00:36 -0700)
committerAaron Taylor <ataylor@subgeniuskitty.com>
Mon, 30 Mar 2020 07:36:44 +0000 (00:36 -0700)
Also corrected license info in stdlib headers.

stdlib/README.md
stdlib/convert.pvvs
stdlib/debug.pvvs
stdlib/heap.pvvs
stdlib/logic.pvvs
stdlib/math.pvvs
stdlib/stack.pvvs
stdlib/stdio.pvvs
stdlib/string.pvvs

index efa3220..32b5091 100644 (file)
@@ -1,33 +1,88 @@
 # Overview #
 
 This folder contains a library of useful functions written in VVhitespace.
 # Overview #
 
 This folder contains a library of useful functions written in VVhitespace.
-Standard include guards are used with `cpp` to include the stdlib in user
-programs. For an example, see `examples/hello-stdlib`. This also means
-`cpp` syntax must be respected.
-
-# Reservations #
+They are intended to remove the tedium of frequently repeated patterns while
+remaining short enough to easily comprehend and modify.
+
+For those eager to jump right in, all functions have comments in the source
+code containing a text description as well as both call and return stacks.
+Simply `#include` the relevant file, setup your call stack per the
+documentation and then `JSR` to the stdlib function of your choice.
+
+Some functions, like `deepdup`, `stackrotate` and `stackrotatereverse`, ease
+stack manipulations by allowing easy access to elements deep on the stack.
+Similarly, `slurp` and `spew` help move bulk data between the stack and heap.
+
+User interactions were also targeted. The included `printf` function provides a
+variety of substitutions to ease user interactions. For user input, `get user
+string` and `atoi` allow easy creation of basic user interfaces.
+
+The library includes a variety of bitwise logic functions as well as heap
+manipulation functions and a handful of math functions including a random
+number generator.
+
+
+# Instructions #
+
+Before we can use this library, we must `#include` it in our program.  Looking
+at the "Entry Points" table below, if we wanted to call `deepdup` we would need
+to `#include <stack.pvvs>` in our code, but where?
+
+Recall that VVhitespace processes our code from top to bottom. Thus, it is
+always safe to `#include` files at the bottom, after our program's text. This
+way the files are included in our source code but won't be accidentally
+executed by the interpreter. For example:
+
+    @ Put two elements on the stack.
+    SSSTTTTSTSSN    | PUSH 244
+    SSSTN           | PUSH 1
+    @ Duplicate the deeper element.
+    SSSTSN          | PUSH 2 (argument to deepdup)
+    NSTTTSSN        | JSR > 1100 (deepdup)
+    NNN             | DIE
+    #include <stack.pvvs>
+
+What about that `PUSH 2` instruction that is an argument to `deepdup`? If we
+check `stack.pvvs`, we will find the following comment above the `deepdup`
+function:
+
+    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+    @ Name:
+    @   deepdup
+    @ Description:
+    @   Duplicates an item deep on the stack, placing the duplicate on TOS.
+    @   By default, maximum depth is 13.
+    @   True maximum depth is (max depth of stackrotate & stackrotatereverse)-1.
+    @ Call Stack:
+    @   stack word n
+    @   ...
+    @   stack word 1
+    @   dupdepth   <-- TOS
+    @ Return Stack: (dupdepth=3)
+    @   stack word n
+    @   ...
+    @   stack word 1
+    @   copy of stack word 3   <-- TOS
+    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+    NSSVTTSSN               | Mark: 1100 (deepdup)
+    ...
+
+From the "Call Stack" example, we can see that `deepdup` requires a `dupdepth`
+argument on the TOS. Since we wanted to duplicate the second item on the stack,
+we used `PUSH 2` immediately before calling `deepdup`.
+
+In addition to the call stack, the code comments also show you what to expect
+on the return stack, as well as any other information you might need in order
+to use the function.
+
+
+# Resource Reservations #
 
 Since all labels share a global namespace, the standard library makes the
 following reservations:
 
 
 Since all labels share a global namespace, the standard library makes the
 following reservations:
 
-## Label ##
 
 
-    00000000 0xxxxxxx - reserved for stdlib function entry points
-    00000000 1xxxxxxx - available for use in user programs
-    0xxxxxxx xxxxxxxx - reserved for private use by stdlib
-    1xxxxxxx xxxxxxxx - available for use in user programs
-
-## Heap and Pointers ##
-
-The first 16 heap addresses (`0-15`) are reserved when using the stdlib.
-Within that reservation, heap[0] is used by `random` and the block
-heap[1]-heap[15] by the stack rotation subroutines which time-share
-pseudo-registers between the various stdlib subroutines.
-
-By convention, functions which return a pointer will use the address `0` to
-represent a `NULL` pointer.
-
-# Entry Points #
+## Entry Points ##
 
 The following labels are entry points to stdlib functions. Read the
 header comment for each function to learn the call and return stack.
 
 The following labels are entry points to stdlib functions. Read the
 header comment for each function to learn the call and return stack.
@@ -55,7 +110,7 @@ header comment for each function to learn the call and return stack.
          100xxx - string functions
          100000 ----- strlen                        (string.pvvs)
          100001 ----- isdigit                       (string.pvvs)
          100xxx - string functions
          100000 ----- strlen                        (string.pvvs)
          100001 ----- isdigit                       (string.pvvs)
-         100010 ----- get_user_string               (string.pvvs)
+         100010 ----- get user string               (string.pvvs)
          101xxx - logic functions
          101000 ----- not                           (logic.pvvs)
          101001 ----- and                           (logic.pvvs)
          101xxx - logic functions
          101000 ----- not                           (logic.pvvs)
          101001 ----- and                           (logic.pvvs)
@@ -81,16 +136,43 @@ header comment for each function to learn the call and return stack.
         1000100 ----- print string from stack       (stdio.pvvs)
         1000101 ----- print string from heap        (stdio.pvvs)
 
         1000100 ----- print string from stack       (stdio.pvvs)
         1000101 ----- print string from heap        (stdio.pvvs)
 
+
+## Labels ##
+
+    00000000 0xxxxxxx - reserved for stdlib function entry points
+    00000000 1xxxxxxx - available for use in user programs
+    0xxxxxxx xxxxxxxx - reserved for private use by stdlib
+    1xxxxxxx xxxxxxxx - available for use in user programs
+
+
+## Heap and Pointers ##
+
+The first 16 heap addresses (`0-15`) are reserved when using the stdlib.
+Within that reservation, heap[0] is used by `random` and the block
+heap[1]-heap[15] by the stack rotation subroutines which time-share
+pseudo-registers between the various stdlib subroutines.
+
+By convention, chosen since no function other than `random` should use heap[0],
+functions which return a pointer will use the address `0` to represent a `NULL`
+pointer.
+
+
 # Misc #
 
 # Misc #
 
-## Private Label Space ##
 
 
-By convention, each public stdlib label will have 8 bits of private label space
-associated with it, formed as follows:
+## Bitwise Logic Constants ##
+
+Be cautious when pushing constants in your code for use as bit arrays. Due to
+the mismatch between the VVhitespace language's sign-magnitude representation
+of integers and the interpreter's internal twos-complement representation, bit
+arrays with a leading `1` (i.e. negative numbers) may appear quite different
+then expected in your source code.
+
+For example, to push a 64-bit array of all `1`'s on to the stack we must push
+`SSTTN`, or `-1`, not
+`SSSTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTN`
+(2^65-1).
 
 
-    00001000 xxxxxxxx - for use by 1000
-    00001001 xxxxxxxx - for use by 1001
-    ...etc
 
 ## Extending Heap Reservation ##
 
 
 ## Extending Heap Reservation ##
 
@@ -101,3 +183,58 @@ Edit these functions to increase the stdlib's heap reservation.
 The remainder of the stdlib is written to automatically use the new allocation.
 Functions like `printf`, for example, allow more substitutions when the heap
 allocation is increased.
 The remainder of the stdlib is written to automatically use the new allocation.
 Functions like `printf`, for example, allow more substitutions when the heap
 allocation is increased.
+
+
+## Private Label Space ##
+
+By convention, each public stdlib label will have 8 bits of private label space
+associated with it, formed as follows:
+
+    00001000 xxxxxxxx - for use by 1000
+    00001001 xxxxxxxx - for use by 1001
+    ...etc
+
+
+## Strings ##
+
+Strings in VVhitespace are stored as one character per 64-bit word since the
+`LOAD` and `STORE` instructions are word length and the heap is word
+addressable.
+
+All strings terminate with an ASCII NUL (`\0`) character.
+
+
+## Using the C Preprocessor ##
+
+The standard library uses ordinary include guards of the following form:
+
+    #ifndef FOO
+    #define FOO
+    ...
+    #endif
+
+This means you can `#include` a file multiple times without problems. To ease
+refactoring, I recommend writing the `#include` statements per-function rather
+than per-file. See the stdlib for examples.
+
+Use of the C Preprocessor also means its syntax must be respected as though the
+file were C rather than VVhitespace. For example, use of a single apostrophe in
+a VVhitespace comment (e.g. don't) throws out a warning:
+
+    warning: missing terminating ' character [-Winvalid-pp-token]
+
+You won't run into any errors if you copy the stdlib's format but if you
+stray I'm sure one could concoct some combination of characters that is both a
+comment in VVhitespace and a hard error for `cpp`.
+
+
+## Whitespace Compatibility ##
+
+Most of this library will run on most Whitespace interpreters. Some parts, like
+the bitwise logic functions, make assumptions about the representation of
+integers in the interpreter that may be less portable than the rest of the
+library.
+
+Regardless, tests are included for every stdlib function and can be run though
+the Whitespace interpreter of your choice to determine compatibility.
+
index e20c809..592af9a 100644 (file)
@@ -1,3 +1,6 @@
+@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+@ See LICENSE.txt file for copyright and license details.
+
 #ifndef VVS_STDLIB_CONVERT
 #define VVS_STDLIB_CONVERT
 
 #ifndef VVS_STDLIB_CONVERT
 #define VVS_STDLIB_CONVERT
 
index d272b6c..ea1bd5c 100644 (file)
@@ -1,3 +1,6 @@
+@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+@ See LICENSE.txt file for copyright and license details.
+
 #ifndef VVS_STDLIB_DEBUG
 #define VVS_STDLIB_DEBUG
 
 #ifndef VVS_STDLIB_DEBUG
 #define VVS_STDLIB_DEBUG
 
index 4626995..81fe610 100644 (file)
@@ -1,3 +1,6 @@
+@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+@ See LICENSE.txt file for copyright and license details.
+
 #ifndef VVS_STDLIB_HEAP
 #define VVS_STDLIB_HEAP
 
 #ifndef VVS_STDLIB_HEAP
 #define VVS_STDLIB_HEAP
 
index 8ac7a39..a69cd3a 100644 (file)
@@ -1,3 +1,6 @@
+@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+@ See LICENSE.txt file for copyright and license details.
+
 #ifndef VVS_STDLIB_LOGIC
 #define VVS_STDLIB_LOGIC
 
 #ifndef VVS_STDLIB_LOGIC
 #define VVS_STDLIB_LOGIC
 
index a72203f..90a3666 100644 (file)
@@ -1,3 +1,6 @@
+@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+@ See LICENSE.txt file for copyright and license details.
+
 #ifndef VVS_STDLIB_MATH
 #define VVS_STDLIB_MATH
 
 #ifndef VVS_STDLIB_MATH
 #define VVS_STDLIB_MATH
 
index 0403044..8ed5e9d 100644 (file)
@@ -1,3 +1,6 @@
+@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+@ See LICENSE.txt file for copyright and license details.
+
 #ifndef VVS_STDLIB_STACK
 #define VVS_STDLIB_STACK
 
 #ifndef VVS_STDLIB_STACK
 #define VVS_STDLIB_STACK
 
index 15cbb2c..26171e6 100644 (file)
@@ -1,3 +1,6 @@
+@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+@ See LICENSE.txt file for copyright and license details.
+
 #ifndef VVS_STDLIB_STDIO
 #define VVS_STDLIB_STDIO
 
 #ifndef VVS_STDLIB_STDIO
 #define VVS_STDLIB_STDIO
 
index e3135c2..f108539 100644 (file)
@@ -1,3 +1,6 @@
+@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
+@ See LICENSE.txt file for copyright and license details.
+
 #ifndef VVS_STDLIB_STRING
 #define VVS_STDLIB_STRING
 
 #ifndef VVS_STDLIB_STRING
 #define VVS_STDLIB_STRING