changelog shortlog graph tags branches files raw help

Mercurial > demo / changeset: removed fig, use sexprs instead

changeset 18: a1137af05c8d
parent 17: e4c9ec452eb6
child 19: fd19fdc77a20
author: ellis <ellis@rwest.io>
date: Mon, 29 May 2023 21:46:21 -0400
files: Cargo.toml demo demo.asd ffi.lisp fig/Cargo.toml fig/src/lib.rs fig/src/tests.rs fig/tests/core.fr fig/tests/tester.fr install.lisp lib.rs makefile obj/src/cfg.rs pkg.lisp readme.org system-index.txt ui/Cargo.toml ui/ui.slint
description: removed fig, use sexprs instead
     1.1--- a/Cargo.toml	Sat May 27 21:07:55 2023 -0400
     1.2+++ b/Cargo.toml	Mon May 29 21:46:21 2023 -0400
     1.3@@ -6,10 +6,9 @@
     1.4 path = "lib.rs"
     1.5 crate-type = ["rlib","cdylib"]
     1.6 [workspace]
     1.7-members = ["obj","fig","ui"]
     1.8+members = ["obj","ui"]
     1.9 [dependencies]
    1.10 libc = "0.2"
    1.11 obj = {version = "0.1.0",path = "obj"}
    1.12-fig = {version = "0.1.0",path = "fig"}
    1.13 [build-dependencies]
    1.14 cbindgen = "0.24.3"
    1.15\ No newline at end of file
     2.1Binary file demo has changed
     3.1--- a/demo.asd	Sat May 27 21:07:55 2023 -0400
     3.2+++ b/demo.asd	Mon May 29 21:46:21 2023 -0400
     3.3@@ -11,7 +11,7 @@
     3.4 	       #+(or ccl sbcl)
     3.5 	       :clack
     3.6 	       :clog
     3.7-	       :cl-rocksdb
     3.8+;;	       :cl-rocksdb
     3.9 	       :verbose
    3.10 	       :alexandria
    3.11 	       :cl-ppcre
    3.12@@ -19,16 +19,16 @@
    3.13 	       :clingon)
    3.14   :serial T
    3.15   :components ((:file "pkg")
    3.16-	       (:file "ffi")
    3.17+;;	       (:file "ffi")
    3.18 	       (:file "tk")
    3.19 	       (:file "cfg")
    3.20-	       (:file "db")
    3.21+;;	       (:file "db")
    3.22 	       (:file "ui")
    3.23 	       (:file "demo"))
    3.24   ;; :in-order-to ((test-op (test-op "demo/tests")))
    3.25   ;; :defsystem-depends-on (:deploy)
    3.26   ;; :build-operation "deploy"
    3.27-  :build-pathname "demo"
    3.28+  :build-pathname "out/demo"
    3.29   :entry-point "demo:main")
    3.30 
    3.31 ;; (asdf:defsystem "cl-demo:tests"
     4.1--- a/ffi.lisp	Sat May 27 21:07:55 2023 -0400
     4.2+++ b/ffi.lisp	Mon May 29 21:46:21 2023 -0400
     4.3@@ -1,6 +1,6 @@
     4.4 (in-package :demo)
     4.5 (defparameter quiche-lib-path #p"./ffi/libquiche.dylib")
     4.6-(defparameter rocksdb-lib-path #p"./ffi/librocksdb.dylib")
     4.7+;;(defparameter rocksdb-lib-path #p"./ffi/librocksdb.dylib")
     4.8 (defparameter demo-lib-path (find-rs-cdylib "libdemo.dylib"))
     4.9 (defmacro find-rs-cdylib (name &optional debug)
    4.10   "Find the rust dll specified by NAME."
    4.11@@ -19,10 +19,10 @@
    4.12 (define-foreign-library quiche
    4.13   (:win32 (:default "quiche"))
    4.14   (t (:default "libquiche")))
    4.15-(define-foreign-library rocksdb
    4.16-  (:win32 (:default "rocksdb"))
    4.17-  (t (:default "librocksdb")))
    4.18+;; (define-foreign-library rocksdb
    4.19+;;   (:win32 (:default "rocksdb"))
    4.20+;;   (t (:default "librocksdb")))
    4.21 
    4.22 (defun load-libdemo () (load-foreign-library (find-rs-cdylib "libdemo.dylib")))
    4.23 (defun install-quiche-lib (&optional path) (load-foreign-library (or path quiche-lib-path)))
    4.24-(defun install-rocksdb-lib (&optional path) (load-foreign-library (or path rocksdb-lib-path)))
    4.25+;; (defun install-rocksdb-lib (&optional path) (load-foreign-library (or path rocksdb-lib-path)))
     5.1--- a/fig/Cargo.toml	Sat May 27 21:07:55 2023 -0400
     5.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     5.3@@ -1,8 +0,0 @@
     5.4-[package]
     5.5-name = "fig"
     5.6-version = "0.1.0"
     5.7-edition = "2021"
     5.8-[dependencies]
     5.9-obj = {version = "0.1.0",path = "../obj"}
    5.10-serde = "1.0.163"
    5.11-serde_dhall = "0.12.1"
     6.1--- a/fig/src/lib.rs	Sat May 27 21:07:55 2023 -0400
     6.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     6.3@@ -1,51 +0,0 @@
     6.4-//! fig/src/lib.rs --- Configuration types
     6.5-use serde::{Serialize, Deserialize};
     6.6-use obj::Objective;
     6.7-use std::collections::HashMap as M;
     6.8-use std::path::PathBuf;
     6.9-use std::string::String as S;
    6.10-use std::error::Error as E;
    6.11-use std::boxed::Box as B;
    6.12-type R<X> = std::result::Result<X,B<dyn E>>;
    6.13-
    6.14-/// common trait for all config modules. This trait provides functions
    6.15-/// for de/serializing to/from RON, updating fields, and formatting.
    6.16-pub trait Configure: Objective {
    6.17-  fn update(&self) -> R<()> {
    6.18-    Ok(())
    6.19-  }
    6.20-}
    6.21-
    6.22-#[derive(Serialize, Deserialize, Debug, Default)]
    6.23-pub struct ShellConfig {
    6.24-  pub env: M<S,S>,
    6.25-  pub cmds: M<S,S>,
    6.26-  pub shell: ShellType,
    6.27-}
    6.28-impl Objective for ShellConfig {}
    6.29-
    6.30-#[derive(Serialize, Deserialize, Debug, Hash, Default)]
    6.31-pub enum ShellType {
    6.32-  #[default]
    6.33-  Bash,
    6.34-  Zsh,
    6.35-  Sh,
    6.36-}
    6.37-
    6.38-#[derive(Serialize, Deserialize, Debug, Default)]
    6.39-pub enum EditorType {
    6.40-  #[default]
    6.41-  Emacs,
    6.42-  Vi,
    6.43-  Nano,
    6.44-}
    6.45-
    6.46-#[derive(Serialize, Deserialize, Debug, Default)]
    6.47-pub struct EditorConfig {
    6.48-  pub editor: EditorType,
    6.49-  pub cmds: M<S,S>,
    6.50-  pub init_file: PathBuf,
    6.51-}
    6.52-
    6.53-#[cfg(test)]
    6.54-mod tests;
     7.1--- a/fig/src/tests.rs	Sat May 27 21:07:55 2023 -0400
     7.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     7.3@@ -1,6 +0,0 @@
     7.4-//! cfg/src/tests --- unit tests
     7.5-use crate::*;
     7.6-#[test]
     7.7-fn test_hello() {
     7.8-  println!("looks good chief");
     7.9-}
     8.1--- a/fig/tests/core.fr	Sat May 27 21:07:55 2023 -0400
     8.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     8.3@@ -1,1003 +0,0 @@
     8.4-\ From: John Hayes S1I
     8.5-\ Subject: core.fr
     8.6-\ Date: Mon, 27 Nov 95 13:10
     8.7-
     8.8-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
     8.9-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
    8.10-\ VERSION 1.2
    8.11-\ THIS PROGRAM TESTS THE CORE WORDS OF AN ANS FORTH SYSTEM.
    8.12-\ THE PROGRAM ASSUMES A TWO'S COMPLEMENT IMPLEMENTATION WHERE
    8.13-\ THE RANGE OF SIGNED NUMBERS IS -2^(N-1) ... 2^(N-1)-1 AND
    8.14-\ THE RANGE OF UNSIGNED NUMBERS IS 0 ... 2^(N)-1.
    8.15-\ I HAVEN'T FIGURED OUT HOW TO TEST KEY, QUIT, ABORT, OR ABORT"...
    8.16-\ I ALSO HAVEN'T THOUGHT OF A WAY TO TEST ENVIRONMENT?...
    8.17-
    8.18-CR
    8.19-TESTING CORE WORDS
    8.20-HEX
    8.21-
    8.22-\ ------------------------------------------------------------------------
    8.23-TESTING BASIC ASSUMPTIONS
    8.24-
    8.25-T{ -> }T               \ START WITH CLEAN SLATE
    8.26-( TEST IF ANY BITS ARE SET; ANSWER IN BASE 1 )
    8.27-T{ : BITSSET? IF 0 0 ELSE 0 THEN ; -> }T
    8.28-T{  0 BITSSET? -> 0 }T      ( ZERO IS ALL BITS CLEAR )
    8.29-T{  1 BITSSET? -> 0 0 }T      ( OTHER NUMBER HAVE AT LEAST ONE BIT )
    8.30-T{ -1 BITSSET? -> 0 0 }T
    8.31-
    8.32-\ ------------------------------------------------------------------------
    8.33-TESTING BOOLEANS: INVERT AND OR XOR
    8.34-
    8.35-T{ 0 0 AND -> 0 }T
    8.36-T{ 0 1 AND -> 0 }T
    8.37-T{ 1 0 AND -> 0 }T
    8.38-T{ 1 1 AND -> 1 }T
    8.39-
    8.40-T{ 0 INVERT 1 AND -> 1 }T
    8.41-T{ 1 INVERT 1 AND -> 0 }T
    8.42-
    8.43-0    CONSTANT 0S
    8.44-0 INVERT CONSTANT 1S
    8.45-
    8.46-T{ 0S INVERT -> 1S }T
    8.47-T{ 1S INVERT -> 0S }T
    8.48-
    8.49-T{ 0S 0S AND -> 0S }T
    8.50-T{ 0S 1S AND -> 0S }T
    8.51-T{ 1S 0S AND -> 0S }T
    8.52-T{ 1S 1S AND -> 1S }T
    8.53-
    8.54-T{ 0S 0S OR -> 0S }T
    8.55-T{ 0S 1S OR -> 1S }T
    8.56-T{ 1S 0S OR -> 1S }T
    8.57-T{ 1S 1S OR -> 1S }T
    8.58-
    8.59-T{ 0S 0S XOR -> 0S }T
    8.60-T{ 0S 1S XOR -> 1S }T
    8.61-T{ 1S 0S XOR -> 1S }T
    8.62-T{ 1S 1S XOR -> 0S }T
    8.63-
    8.64-\ ------------------------------------------------------------------------
    8.65-TESTING 2* 2/ LSHIFT RSHIFT
    8.66-
    8.67-( WE TRUST 1S, INVERT, AND BITSSET?; WE WILL CONFIRM RSHIFT LATER )
    8.68-1S 1 RSHIFT INVERT CONSTANT MSB
    8.69-T{ MSB BITSSET? -> 0 0 }T
    8.70-
    8.71-T{ 0S 2* -> 0S }T
    8.72-T{ 1 2* -> 2 }T
    8.73-T{ 4000 2* -> 8000 }T
    8.74-T{ 1S 2* 1 XOR -> 1S }T
    8.75-T{ MSB 2* -> 0S }T
    8.76-
    8.77-T{ 0S 2/ -> 0S }T
    8.78-T{ 1 2/ -> 0 }T
    8.79-T{ 4000 2/ -> 2000 }T
    8.80-T{ 1S 2/ -> 1S }T            \ MSB PROPOGATED
    8.81-T{ 1S 1 XOR 2/ -> 1S }T
    8.82-T{ MSB 2/ MSB AND -> MSB }T
    8.83-
    8.84-T{ 1 0 LSHIFT -> 1 }T
    8.85-T{ 1 1 LSHIFT -> 2 }T
    8.86-T{ 1 2 LSHIFT -> 4 }T
    8.87-T{ 1 F LSHIFT -> 8000 }T         \ BIGGEST GUARANTEED SHIFT
    8.88-T{ 1S 1 LSHIFT 1 XOR -> 1S }T
    8.89-T{ MSB 1 LSHIFT -> 0 }T
    8.90-
    8.91-T{ 1 0 RSHIFT -> 1 }T
    8.92-T{ 1 1 RSHIFT -> 0 }T
    8.93-T{ 2 1 RSHIFT -> 1 }T
    8.94-T{ 4 2 RSHIFT -> 1 }T
    8.95-T{ 8000 F RSHIFT -> 1 }T         \ BIGGEST
    8.96-T{ MSB 1 RSHIFT MSB AND -> 0 }T      \ RSHIFT ZERO FILLS MSBS
    8.97-T{ MSB 1 RSHIFT 2* -> MSB }T
    8.98-
    8.99-\ ------------------------------------------------------------------------
   8.100-TESTING COMPARISONS: 0= = 0< < > U< MIN MAX
   8.101-0 INVERT         CONSTANT MAX-UINT
   8.102-0 INVERT 1 RSHIFT      CONSTANT MAX-INT
   8.103-0 INVERT 1 RSHIFT INVERT   CONSTANT MIN-INT
   8.104-0 INVERT 1 RSHIFT      CONSTANT MID-UINT
   8.105-0 INVERT 1 RSHIFT INVERT   CONSTANT MID-UINT+1
   8.106-
   8.107-0S CONSTANT <FALSE>
   8.108-1S CONSTANT <TRUE>
   8.109-
   8.110-T{ 0 0= -> <TRUE> }T
   8.111-T{ 1 0= -> <FALSE> }T
   8.112-T{ 2 0= -> <FALSE> }T
   8.113-T{ -1 0= -> <FALSE> }T
   8.114-T{ MAX-UINT 0= -> <FALSE> }T
   8.115-T{ MIN-INT 0= -> <FALSE> }T
   8.116-T{ MAX-INT 0= -> <FALSE> }T
   8.117-
   8.118-T{ 0 0 = -> <TRUE> }T
   8.119-T{ 1 1 = -> <TRUE> }T
   8.120-T{ -1 -1 = -> <TRUE> }T
   8.121-T{ 1 0 = -> <FALSE> }T
   8.122-T{ -1 0 = -> <FALSE> }T
   8.123-T{ 0 1 = -> <FALSE> }T
   8.124-T{ 0 -1 = -> <FALSE> }T
   8.125-
   8.126-T{ 0 0< -> <FALSE> }T
   8.127-T{ -1 0< -> <TRUE> }T
   8.128-T{ MIN-INT 0< -> <TRUE> }T
   8.129-T{ 1 0< -> <FALSE> }T
   8.130-T{ MAX-INT 0< -> <FALSE> }T
   8.131-
   8.132-T{ 0 1 < -> <TRUE> }T
   8.133-T{ 1 2 < -> <TRUE> }T
   8.134-T{ -1 0 < -> <TRUE> }T
   8.135-T{ -1 1 < -> <TRUE> }T
   8.136-T{ MIN-INT 0 < -> <TRUE> }T
   8.137-T{ MIN-INT MAX-INT < -> <TRUE> }T
   8.138-T{ 0 MAX-INT < -> <TRUE> }T
   8.139-T{ 0 0 < -> <FALSE> }T
   8.140-T{ 1 1 < -> <FALSE> }T
   8.141-T{ 1 0 < -> <FALSE> }T
   8.142-T{ 2 1 < -> <FALSE> }T
   8.143-T{ 0 -1 < -> <FALSE> }T
   8.144-T{ 1 -1 < -> <FALSE> }T
   8.145-T{ 0 MIN-INT < -> <FALSE> }T
   8.146-T{ MAX-INT MIN-INT < -> <FALSE> }T
   8.147-T{ MAX-INT 0 < -> <FALSE> }T
   8.148-
   8.149-T{ 0 1 > -> <FALSE> }T
   8.150-T{ 1 2 > -> <FALSE> }T
   8.151-T{ -1 0 > -> <FALSE> }T
   8.152-T{ -1 1 > -> <FALSE> }T
   8.153-T{ MIN-INT 0 > -> <FALSE> }T
   8.154-T{ MIN-INT MAX-INT > -> <FALSE> }T
   8.155-T{ 0 MAX-INT > -> <FALSE> }T
   8.156-T{ 0 0 > -> <FALSE> }T
   8.157-T{ 1 1 > -> <FALSE> }T
   8.158-T{ 1 0 > -> <TRUE> }T
   8.159-T{ 2 1 > -> <TRUE> }T
   8.160-T{ 0 -1 > -> <TRUE> }T
   8.161-T{ 1 -1 > -> <TRUE> }T
   8.162-T{ 0 MIN-INT > -> <TRUE> }T
   8.163-T{ MAX-INT MIN-INT > -> <TRUE> }T
   8.164-T{ MAX-INT 0 > -> <TRUE> }T
   8.165-
   8.166-T{ 0 1 U< -> <TRUE> }T
   8.167-T{ 1 2 U< -> <TRUE> }T
   8.168-T{ 0 MID-UINT U< -> <TRUE> }T
   8.169-T{ 0 MAX-UINT U< -> <TRUE> }T
   8.170-T{ MID-UINT MAX-UINT U< -> <TRUE> }T
   8.171-T{ 0 0 U< -> <FALSE> }T
   8.172-T{ 1 1 U< -> <FALSE> }T
   8.173-T{ 1 0 U< -> <FALSE> }T
   8.174-T{ 2 1 U< -> <FALSE> }T
   8.175-T{ MID-UINT 0 U< -> <FALSE> }T
   8.176-T{ MAX-UINT 0 U< -> <FALSE> }T
   8.177-T{ MAX-UINT MID-UINT U< -> <FALSE> }T
   8.178-
   8.179-T{ 0 1 MIN -> 0 }T
   8.180-T{ 1 2 MIN -> 1 }T
   8.181-T{ -1 0 MIN -> -1 }T
   8.182-T{ -1 1 MIN -> -1 }T
   8.183-T{ MIN-INT 0 MIN -> MIN-INT }T
   8.184-T{ MIN-INT MAX-INT MIN -> MIN-INT }T
   8.185-T{ 0 MAX-INT MIN -> 0 }T
   8.186-T{ 0 0 MIN -> 0 }T
   8.187-T{ 1 1 MIN -> 1 }T
   8.188-T{ 1 0 MIN -> 0 }T
   8.189-T{ 2 1 MIN -> 1 }T
   8.190-T{ 0 -1 MIN -> -1 }T
   8.191-T{ 1 -1 MIN -> -1 }T
   8.192-T{ 0 MIN-INT MIN -> MIN-INT }T
   8.193-T{ MAX-INT MIN-INT MIN -> MIN-INT }T
   8.194-T{ MAX-INT 0 MIN -> 0 }T
   8.195-
   8.196-T{ 0 1 MAX -> 1 }T
   8.197-T{ 1 2 MAX -> 2 }T
   8.198-T{ -1 0 MAX -> 0 }T
   8.199-T{ -1 1 MAX -> 1 }T
   8.200-T{ MIN-INT 0 MAX -> 0 }T
   8.201-T{ MIN-INT MAX-INT MAX -> MAX-INT }T
   8.202-T{ 0 MAX-INT MAX -> MAX-INT }T
   8.203-T{ 0 0 MAX -> 0 }T
   8.204-T{ 1 1 MAX -> 1 }T
   8.205-T{ 1 0 MAX -> 1 }T
   8.206-T{ 2 1 MAX -> 2 }T
   8.207-T{ 0 -1 MAX -> 0 }T
   8.208-T{ 1 -1 MAX -> 1 }T
   8.209-T{ 0 MIN-INT MAX -> 0 }T
   8.210-T{ MAX-INT MIN-INT MAX -> MAX-INT }T
   8.211-T{ MAX-INT 0 MAX -> MAX-INT }T
   8.212-
   8.213-\ ------------------------------------------------------------------------
   8.214-TESTING STACK OPS: 2DROP 2DUP 2OVER 2SWAP ?DUP DEPTH DROP DUP OVER ROT SWAP
   8.215-
   8.216-T{ 1 2 2DROP -> }T
   8.217-T{ 1 2 2DUP -> 1 2 1 2 }T
   8.218-T{ 1 2 3 4 2OVER -> 1 2 3 4 1 2 }T
   8.219-T{ 1 2 3 4 2SWAP -> 3 4 1 2 }T
   8.220-T{ 0 ?DUP -> 0 }T
   8.221-T{ 1 ?DUP -> 1 1 }T
   8.222-T{ -1 ?DUP -> -1 -1 }T
   8.223-T{ DEPTH -> 0 }T
   8.224-T{ 0 DEPTH -> 0 1 }T
   8.225-T{ 0 1 DEPTH -> 0 1 2 }T
   8.226-T{ 0 DROP -> }T
   8.227-T{ 1 2 DROP -> 1 }T
   8.228-T{ 1 DUP -> 1 1 }T
   8.229-T{ 1 2 OVER -> 1 2 1 }T
   8.230-T{ 1 2 3 ROT -> 2 3 1 }T
   8.231-T{ 1 2 SWAP -> 2 1 }T
   8.232-
   8.233-\ ------------------------------------------------------------------------
   8.234-TESTING >R R> R@
   8.235-
   8.236-T{ : GR1 >R R> ; -> }T
   8.237-T{ : GR2 >R R@ R> DROP ; -> }T
   8.238-T{ 123 GR1 -> 123 }T
   8.239-T{ 123 GR2 -> 123 }T
   8.240-T{ 1S GR1 -> 1S }T   ( RETURN STACK HOLDS CELLS )
   8.241-
   8.242-\ ------------------------------------------------------------------------
   8.243-TESTING ADD/SUBTRACT: + - 1+ 1- ABS NEGATE
   8.244-
   8.245-T{ 0 5 + -> 5 }T
   8.246-T{ 5 0 + -> 5 }T
   8.247-T{ 0 -5 + -> -5 }T
   8.248-T{ -5 0 + -> -5 }T
   8.249-T{ 1 2 + -> 3 }T
   8.250-T{ 1 -2 + -> -1 }T
   8.251-T{ -1 2 + -> 1 }T
   8.252-T{ -1 -2 + -> -3 }T
   8.253-T{ -1 1 + -> 0 }T
   8.254-T{ MID-UINT 1 + -> MID-UINT+1 }T
   8.255-
   8.256-T{ 0 5 - -> -5 }T
   8.257-T{ 5 0 - -> 5 }T
   8.258-T{ 0 -5 - -> 5 }T
   8.259-T{ -5 0 - -> -5 }T
   8.260-T{ 1 2 - -> -1 }T
   8.261-T{ 1 -2 - -> 3 }T
   8.262-T{ -1 2 - -> -3 }T
   8.263-T{ -1 -2 - -> 1 }T
   8.264-T{ 0 1 - -> -1 }T
   8.265-T{ MID-UINT+1 1 - -> MID-UINT }T
   8.266-
   8.267-T{ 0 1+ -> 1 }T
   8.268-T{ -1 1+ -> 0 }T
   8.269-T{ 1 1+ -> 2 }T
   8.270-T{ MID-UINT 1+ -> MID-UINT+1 }T
   8.271-
   8.272-T{ 2 1- -> 1 }T
   8.273-T{ 1 1- -> 0 }T
   8.274-T{ 0 1- -> -1 }T
   8.275-T{ MID-UINT+1 1- -> MID-UINT }T
   8.276-
   8.277-T{ 0 NEGATE -> 0 }T
   8.278-T{ 1 NEGATE -> -1 }T
   8.279-T{ -1 NEGATE -> 1 }T
   8.280-T{ 2 NEGATE -> -2 }T
   8.281-T{ -2 NEGATE -> 2 }T
   8.282-
   8.283-T{ 0 ABS -> 0 }T
   8.284-T{ 1 ABS -> 1 }T
   8.285-T{ -1 ABS -> 1 }T
   8.286-T{ MIN-INT ABS -> MID-UINT+1 }T
   8.287-
   8.288-\ ------------------------------------------------------------------------
   8.289-TESTING MULTIPLY: S>D * M* UM*
   8.290-
   8.291-T{ 0 S>D -> 0 0 }T
   8.292-T{ 1 S>D -> 1 0 }T
   8.293-T{ 2 S>D -> 2 0 }T
   8.294-T{ -1 S>D -> -1 -1 }T
   8.295-T{ -2 S>D -> -2 -1 }T
   8.296-T{ MIN-INT S>D -> MIN-INT -1 }T
   8.297-T{ MAX-INT S>D -> MAX-INT 0 }T
   8.298-
   8.299-T{ 0 0 M* -> 0 S>D }T
   8.300-T{ 0 1 M* -> 0 S>D }T
   8.301-T{ 1 0 M* -> 0 S>D }T
   8.302-T{ 1 2 M* -> 2 S>D }T
   8.303-T{ 2 1 M* -> 2 S>D }T
   8.304-T{ 3 3 M* -> 9 S>D }T
   8.305-T{ -3 3 M* -> -9 S>D }T
   8.306-T{ 3 -3 M* -> -9 S>D }T
   8.307-T{ -3 -3 M* -> 9 S>D }T
   8.308-T{ 0 MIN-INT M* -> 0 S>D }T
   8.309-T{ 1 MIN-INT M* -> MIN-INT S>D }T
   8.310-T{ 2 MIN-INT M* -> 0 1S }T
   8.311-T{ 0 MAX-INT M* -> 0 S>D }T
   8.312-T{ 1 MAX-INT M* -> MAX-INT S>D }T
   8.313-T{ 2 MAX-INT M* -> MAX-INT 1 LSHIFT 0 }T
   8.314-T{ MIN-INT MIN-INT M* -> 0 MSB 1 RSHIFT }T
   8.315-T{ MAX-INT MIN-INT M* -> MSB MSB 2/ }T
   8.316-T{ MAX-INT MAX-INT M* -> 1 MSB 2/ INVERT }T
   8.317-
   8.318-T{ 0 0 * -> 0 }T            \ TEST IDENTITIES
   8.319-T{ 0 1 * -> 0 }T
   8.320-T{ 1 0 * -> 0 }T
   8.321-T{ 1 2 * -> 2 }T
   8.322-T{ 2 1 * -> 2 }T
   8.323-T{ 3 3 * -> 9 }T
   8.324-T{ -3 3 * -> -9 }T
   8.325-T{ 3 -3 * -> -9 }T
   8.326-T{ -3 -3 * -> 9 }T
   8.327-
   8.328-T{ MID-UINT+1 1 RSHIFT 2 * -> MID-UINT+1 }T
   8.329-T{ MID-UINT+1 2 RSHIFT 4 * -> MID-UINT+1 }T
   8.330-T{ MID-UINT+1 1 RSHIFT MID-UINT+1 OR 2 * -> MID-UINT+1 }T
   8.331-
   8.332-T{ 0 0 UM* -> 0 0 }T
   8.333-T{ 0 1 UM* -> 0 0 }T
   8.334-T{ 1 0 UM* -> 0 0 }T
   8.335-T{ 1 2 UM* -> 2 0 }T
   8.336-T{ 2 1 UM* -> 2 0 }T
   8.337-T{ 3 3 UM* -> 9 0 }T
   8.338-
   8.339-T{ MID-UINT+1 1 RSHIFT 2 UM* -> MID-UINT+1 0 }T
   8.340-T{ MID-UINT+1 2 UM* -> 0 1 }T
   8.341-T{ MID-UINT+1 4 UM* -> 0 2 }T
   8.342-T{ 1S 2 UM* -> 1S 1 LSHIFT 1 }T
   8.343-T{ MAX-UINT MAX-UINT UM* -> 1 1 INVERT }T
   8.344-
   8.345-\ ------------------------------------------------------------------------
   8.346-TESTING DIVIDE: FM/MOD SM/REM UM/MOD */ */MOD / /MOD MOD
   8.347-
   8.348-T{ 0 S>D 1 FM/MOD -> 0 0 }T
   8.349-T{ 1 S>D 1 FM/MOD -> 0 1 }T
   8.350-T{ 2 S>D 1 FM/MOD -> 0 2 }T
   8.351-T{ -1 S>D 1 FM/MOD -> 0 -1 }T
   8.352-T{ -2 S>D 1 FM/MOD -> 0 -2 }T
   8.353-T{ 0 S>D -1 FM/MOD -> 0 0 }T
   8.354-T{ 1 S>D -1 FM/MOD -> 0 -1 }T
   8.355-T{ 2 S>D -1 FM/MOD -> 0 -2 }T
   8.356-T{ -1 S>D -1 FM/MOD -> 0 1 }T
   8.357-T{ -2 S>D -1 FM/MOD -> 0 2 }T
   8.358-T{ 2 S>D 2 FM/MOD -> 0 1 }T
   8.359-T{ -1 S>D -1 FM/MOD -> 0 1 }T
   8.360-T{ -2 S>D -2 FM/MOD -> 0 1 }T
   8.361-T{  7 S>D  3 FM/MOD -> 1 2 }T
   8.362-T{  7 S>D -3 FM/MOD -> -2 -3 }T
   8.363-T{ -7 S>D  3 FM/MOD -> 2 -3 }T
   8.364-T{ -7 S>D -3 FM/MOD -> -1 2 }T
   8.365-T{ MAX-INT S>D 1 FM/MOD -> 0 MAX-INT }T
   8.366-T{ MIN-INT S>D 1 FM/MOD -> 0 MIN-INT }T
   8.367-T{ MAX-INT S>D MAX-INT FM/MOD -> 0 1 }T
   8.368-T{ MIN-INT S>D MIN-INT FM/MOD -> 0 1 }T
   8.369-T{ 1S 1 4 FM/MOD -> 3 MAX-INT }T
   8.370-T{ 1 MIN-INT M* 1 FM/MOD -> 0 MIN-INT }T
   8.371-T{ 1 MIN-INT M* MIN-INT FM/MOD -> 0 1 }T
   8.372-T{ 2 MIN-INT M* 2 FM/MOD -> 0 MIN-INT }T
   8.373-T{ 2 MIN-INT M* MIN-INT FM/MOD -> 0 2 }T
   8.374-T{ 1 MAX-INT M* 1 FM/MOD -> 0 MAX-INT }T
   8.375-T{ 1 MAX-INT M* MAX-INT FM/MOD -> 0 1 }T
   8.376-T{ 2 MAX-INT M* 2 FM/MOD -> 0 MAX-INT }T
   8.377-T{ 2 MAX-INT M* MAX-INT FM/MOD -> 0 2 }T
   8.378-T{ MIN-INT MIN-INT M* MIN-INT FM/MOD -> 0 MIN-INT }T
   8.379-T{ MIN-INT MAX-INT M* MIN-INT FM/MOD -> 0 MAX-INT }T
   8.380-T{ MIN-INT MAX-INT M* MAX-INT FM/MOD -> 0 MIN-INT }T
   8.381-T{ MAX-INT MAX-INT M* MAX-INT FM/MOD -> 0 MAX-INT }T
   8.382-
   8.383-T{ 0 S>D 1 SM/REM -> 0 0 }T
   8.384-T{ 1 S>D 1 SM/REM -> 0 1 }T
   8.385-T{ 2 S>D 1 SM/REM -> 0 2 }T
   8.386-T{ -1 S>D 1 SM/REM -> 0 -1 }T
   8.387-T{ -2 S>D 1 SM/REM -> 0 -2 }T
   8.388-T{ 0 S>D -1 SM/REM -> 0 0 }T
   8.389-T{ 1 S>D -1 SM/REM -> 0 -1 }T
   8.390-T{ 2 S>D -1 SM/REM -> 0 -2 }T
   8.391-T{ -1 S>D -1 SM/REM -> 0 1 }T
   8.392-T{ -2 S>D -1 SM/REM -> 0 2 }T
   8.393-T{ 2 S>D 2 SM/REM -> 0 1 }T
   8.394-T{ -1 S>D -1 SM/REM -> 0 1 }T
   8.395-T{ -2 S>D -2 SM/REM -> 0 1 }T
   8.396-T{  7 S>D  3 SM/REM -> 1 2 }T
   8.397-T{  7 S>D -3 SM/REM -> 1 -2 }T
   8.398-T{ -7 S>D  3 SM/REM -> -1 -2 }T
   8.399-T{ -7 S>D -3 SM/REM -> -1 2 }T
   8.400-T{ MAX-INT S>D 1 SM/REM -> 0 MAX-INT }T
   8.401-T{ MIN-INT S>D 1 SM/REM -> 0 MIN-INT }T
   8.402-T{ MAX-INT S>D MAX-INT SM/REM -> 0 1 }T
   8.403-T{ MIN-INT S>D MIN-INT SM/REM -> 0 1 }T
   8.404-T{ 1S 1 4 SM/REM -> 3 MAX-INT }T
   8.405-T{ 2 MIN-INT M* 2 SM/REM -> 0 MIN-INT }T
   8.406-T{ 2 MIN-INT M* MIN-INT SM/REM -> 0 2 }T
   8.407-T{ 2 MAX-INT M* 2 SM/REM -> 0 MAX-INT }T
   8.408-T{ 2 MAX-INT M* MAX-INT SM/REM -> 0 2 }T
   8.409-T{ MIN-INT MIN-INT M* MIN-INT SM/REM -> 0 MIN-INT }T
   8.410-T{ MIN-INT MAX-INT M* MIN-INT SM/REM -> 0 MAX-INT }T
   8.411-T{ MIN-INT MAX-INT M* MAX-INT SM/REM -> 0 MIN-INT }T
   8.412-T{ MAX-INT MAX-INT M* MAX-INT SM/REM -> 0 MAX-INT }T
   8.413-
   8.414-T{ 0 0 1 UM/MOD -> 0 0 }T
   8.415-T{ 1 0 1 UM/MOD -> 0 1 }T
   8.416-T{ 1 0 2 UM/MOD -> 1 0 }T
   8.417-T{ 3 0 2 UM/MOD -> 1 1 }T
   8.418-T{ MAX-UINT 2 UM* 2 UM/MOD -> 0 MAX-UINT }T
   8.419-T{ MAX-UINT 2 UM* MAX-UINT UM/MOD -> 0 2 }T
   8.420-T{ MAX-UINT MAX-UINT UM* MAX-UINT UM/MOD -> 0 MAX-UINT }T
   8.421-
   8.422-: IFFLOORED
   8.423-   [ -3 2 / -2 = INVERT ] LITERAL IF POSTPONE \ THEN ;
   8.424-
   8.425-: IFSYM
   8.426-   [ -3 2 / -1 = INVERT ] LITERAL IF POSTPONE \ THEN ;
   8.427-
   8.428-\ THE SYSTEM MIGHT DO EITHER FLOORED OR SYMMETRIC DIVISION.
   8.429-\ SINCE WE HAVE ALREADY TESTED M*, FM/MOD, AND SM/REM WE CAN USE THEM IN TEST.
   8.430-
   8.431-IFFLOORED : T/MOD  >R S>D R> FM/MOD ;
   8.432-IFFLOORED : T/     T/MOD SWAP DROP ;
   8.433-IFFLOORED : TMOD   T/MOD DROP ;
   8.434-IFFLOORED : T*/MOD >R M* R> FM/MOD ;
   8.435-IFFLOORED : T*/    T*/MOD SWAP DROP ;
   8.436-IFSYM     : T/MOD  >R S>D R> SM/REM ;
   8.437-IFSYM     : T/     T/MOD SWAP DROP ;
   8.438-IFSYM     : TMOD   T/MOD DROP ;
   8.439-IFSYM     : T*/MOD >R M* R> SM/REM ;
   8.440-IFSYM     : T*/    T*/MOD SWAP DROP ;
   8.441-
   8.442-T{ 0 1 /MOD -> 0 1 T/MOD }T
   8.443-T{ 1 1 /MOD -> 1 1 T/MOD }T
   8.444-T{ 2 1 /MOD -> 2 1 T/MOD }T
   8.445-T{ -1 1 /MOD -> -1 1 T/MOD }T
   8.446-T{ -2 1 /MOD -> -2 1 T/MOD }T
   8.447-T{ 0 -1 /MOD -> 0 -1 T/MOD }T
   8.448-T{ 1 -1 /MOD -> 1 -1 T/MOD }T
   8.449-T{ 2 -1 /MOD -> 2 -1 T/MOD }T
   8.450-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
   8.451-T{ -2 -1 /MOD -> -2 -1 T/MOD }T
   8.452-T{ 2 2 /MOD -> 2 2 T/MOD }T
   8.453-T{ -1 -1 /MOD -> -1 -1 T/MOD }T
   8.454-T{ -2 -2 /MOD -> -2 -2 T/MOD }T
   8.455-T{ 7 3 /MOD -> 7 3 T/MOD }T
   8.456-T{ 7 -3 /MOD -> 7 -3 T/MOD }T
   8.457-T{ -7 3 /MOD -> -7 3 T/MOD }T
   8.458-T{ -7 -3 /MOD -> -7 -3 T/MOD }T
   8.459-T{ MAX-INT 1 /MOD -> MAX-INT 1 T/MOD }T
   8.460-T{ MIN-INT 1 /MOD -> MIN-INT 1 T/MOD }T
   8.461-T{ MAX-INT MAX-INT /MOD -> MAX-INT MAX-INT T/MOD }T
   8.462-T{ MIN-INT MIN-INT /MOD -> MIN-INT MIN-INT T/MOD }T
   8.463-
   8.464-T{ 0 1 / -> 0 1 T/ }T
   8.465-T{ 1 1 / -> 1 1 T/ }T
   8.466-T{ 2 1 / -> 2 1 T/ }T
   8.467-T{ -1 1 / -> -1 1 T/ }T
   8.468-T{ -2 1 / -> -2 1 T/ }T
   8.469-T{ 0 -1 / -> 0 -1 T/ }T
   8.470-T{ 1 -1 / -> 1 -1 T/ }T
   8.471-T{ 2 -1 / -> 2 -1 T/ }T
   8.472-T{ -1 -1 / -> -1 -1 T/ }T
   8.473-T{ -2 -1 / -> -2 -1 T/ }T
   8.474-T{ 2 2 / -> 2 2 T/ }T
   8.475-T{ -1 -1 / -> -1 -1 T/ }T
   8.476-T{ -2 -2 / -> -2 -2 T/ }T
   8.477-T{ 7 3 / -> 7 3 T/ }T
   8.478-T{ 7 -3 / -> 7 -3 T/ }T
   8.479-T{ -7 3 / -> -7 3 T/ }T
   8.480-T{ -7 -3 / -> -7 -3 T/ }T
   8.481-T{ MAX-INT 1 / -> MAX-INT 1 T/ }T
   8.482-T{ MIN-INT 1 / -> MIN-INT 1 T/ }T
   8.483-T{ MAX-INT MAX-INT / -> MAX-INT MAX-INT T/ }T
   8.484-T{ MIN-INT MIN-INT / -> MIN-INT MIN-INT T/ }T
   8.485-
   8.486-T{ 0 1 MOD -> 0 1 TMOD }T
   8.487-T{ 1 1 MOD -> 1 1 TMOD }T
   8.488-T{ 2 1 MOD -> 2 1 TMOD }T
   8.489-T{ -1 1 MOD -> -1 1 TMOD }T
   8.490-T{ -2 1 MOD -> -2 1 TMOD }T
   8.491-T{ 0 -1 MOD -> 0 -1 TMOD }T
   8.492-T{ 1 -1 MOD -> 1 -1 TMOD }T
   8.493-T{ 2 -1 MOD -> 2 -1 TMOD }T
   8.494-T{ -1 -1 MOD -> -1 -1 TMOD }T
   8.495-T{ -2 -1 MOD -> -2 -1 TMOD }T
   8.496-T{ 2 2 MOD -> 2 2 TMOD }T
   8.497-T{ -1 -1 MOD -> -1 -1 TMOD }T
   8.498-T{ -2 -2 MOD -> -2 -2 TMOD }T
   8.499-T{ 7 3 MOD -> 7 3 TMOD }T
   8.500-T{ 7 -3 MOD -> 7 -3 TMOD }T
   8.501-T{ -7 3 MOD -> -7 3 TMOD }T
   8.502-T{ -7 -3 MOD -> -7 -3 TMOD }T
   8.503-T{ MAX-INT 1 MOD -> MAX-INT 1 TMOD }T
   8.504-T{ MIN-INT 1 MOD -> MIN-INT 1 TMOD }T
   8.505-T{ MAX-INT MAX-INT MOD -> MAX-INT MAX-INT TMOD }T
   8.506-T{ MIN-INT MIN-INT MOD -> MIN-INT MIN-INT TMOD }T
   8.507-
   8.508-T{ 0 2 1 */ -> 0 2 1 T*/ }T
   8.509-T{ 1 2 1 */ -> 1 2 1 T*/ }T
   8.510-T{ 2 2 1 */ -> 2 2 1 T*/ }T
   8.511-T{ -1 2 1 */ -> -1 2 1 T*/ }T
   8.512-T{ -2 2 1 */ -> -2 2 1 T*/ }T
   8.513-T{ 0 2 -1 */ -> 0 2 -1 T*/ }T
   8.514-T{ 1 2 -1 */ -> 1 2 -1 T*/ }T
   8.515-T{ 2 2 -1 */ -> 2 2 -1 T*/ }T
   8.516-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
   8.517-T{ -2 2 -1 */ -> -2 2 -1 T*/ }T
   8.518-T{ 2 2 2 */ -> 2 2 2 T*/ }T
   8.519-T{ -1 2 -1 */ -> -1 2 -1 T*/ }T
   8.520-T{ -2 2 -2 */ -> -2 2 -2 T*/ }T
   8.521-T{ 7 2 3 */ -> 7 2 3 T*/ }T
   8.522-T{ 7 2 -3 */ -> 7 2 -3 T*/ }T
   8.523-T{ -7 2 3 */ -> -7 2 3 T*/ }T
   8.524-T{ -7 2 -3 */ -> -7 2 -3 T*/ }T
   8.525-T{ MAX-INT 2 MAX-INT */ -> MAX-INT 2 MAX-INT T*/ }T
   8.526-T{ MIN-INT 2 MIN-INT */ -> MIN-INT 2 MIN-INT T*/ }T
   8.527-
   8.528-T{ 0 2 1 */MOD -> 0 2 1 T*/MOD }T
   8.529-T{ 1 2 1 */MOD -> 1 2 1 T*/MOD }T
   8.530-T{ 2 2 1 */MOD -> 2 2 1 T*/MOD }T
   8.531-T{ -1 2 1 */MOD -> -1 2 1 T*/MOD }T
   8.532-T{ -2 2 1 */MOD -> -2 2 1 T*/MOD }T
   8.533-T{ 0 2 -1 */MOD -> 0 2 -1 T*/MOD }T
   8.534-T{ 1 2 -1 */MOD -> 1 2 -1 T*/MOD }T
   8.535-T{ 2 2 -1 */MOD -> 2 2 -1 T*/MOD }T
   8.536-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
   8.537-T{ -2 2 -1 */MOD -> -2 2 -1 T*/MOD }T
   8.538-T{ 2 2 2 */MOD -> 2 2 2 T*/MOD }T
   8.539-T{ -1 2 -1 */MOD -> -1 2 -1 T*/MOD }T
   8.540-T{ -2 2 -2 */MOD -> -2 2 -2 T*/MOD }T
   8.541-T{ 7 2 3 */MOD -> 7 2 3 T*/MOD }T
   8.542-T{ 7 2 -3 */MOD -> 7 2 -3 T*/MOD }T
   8.543-T{ -7 2 3 */MOD -> -7 2 3 T*/MOD }T
   8.544-T{ -7 2 -3 */MOD -> -7 2 -3 T*/MOD }T
   8.545-T{ MAX-INT 2 MAX-INT */MOD -> MAX-INT 2 MAX-INT T*/MOD }T
   8.546-T{ MIN-INT 2 MIN-INT */MOD -> MIN-INT 2 MIN-INT T*/MOD }T
   8.547-
   8.548-\ ------------------------------------------------------------------------
   8.549-TESTING HERE , @ ! CELL+ CELLS C, C@ C! CHARS 2@ 2! ALIGN ALIGNED +! ALLOT
   8.550-
   8.551-HERE 1 ALLOT
   8.552-HERE
   8.553-CONSTANT 2NDA
   8.554-CONSTANT 1STA
   8.555-T{ 1STA 2NDA U< -> <TRUE> }T      \ HERE MUST GROW WITH ALLOT
   8.556-T{ 1STA 1+ -> 2NDA }T         \ ... BY ONE ADDRESS UNIT
   8.557-( MISSING TEST: NEGATIVE ALLOT )
   8.558-
   8.559-HERE 1 ,
   8.560-HERE 2 ,
   8.561-CONSTANT 2ND
   8.562-CONSTANT 1ST
   8.563-T{ 1ST 2ND U< -> <TRUE> }T         \ HERE MUST GROW WITH ALLOT
   8.564-T{ 1ST CELL+ -> 2ND }T         \ ... BY ONE CELL
   8.565-T{ 1ST 1 CELLS + -> 2ND }T
   8.566-T{ 1ST @ 2ND @ -> 1 2 }T
   8.567-T{ 5 1ST ! -> }T
   8.568-T{ 1ST @ 2ND @ -> 5 2 }T
   8.569-T{ 6 2ND ! -> }T
   8.570-T{ 1ST @ 2ND @ -> 5 6 }T
   8.571-T{ 1ST 2@ -> 6 5 }T
   8.572-T{ 2 1 1ST 2! -> }T
   8.573-T{ 1ST 2@ -> 2 1 }T
   8.574-T{ 1S 1ST !  1ST @ -> 1S }T      \ CAN STORE CELL-WIDE VALUE
   8.575-
   8.576-HERE 1 C,
   8.577-HERE 2 C,
   8.578-CONSTANT 2NDC
   8.579-CONSTANT 1STC
   8.580-T{ 1STC 2NDC U< -> <TRUE> }T      \ HERE MUST GROW WITH ALLOT
   8.581-T{ 1STC CHAR+ -> 2NDC }T         \ ... BY ONE CHAR
   8.582-T{ 1STC 1 CHARS + -> 2NDC }T
   8.583-T{ 1STC C@ 2NDC C@ -> 1 2 }T
   8.584-T{ 3 1STC C! -> }T
   8.585-T{ 1STC C@ 2NDC C@ -> 3 2 }T
   8.586-T{ 4 2NDC C! -> }T
   8.587-T{ 1STC C@ 2NDC C@ -> 3 4 }T
   8.588-
   8.589-ALIGN 1 ALLOT HERE ALIGN HERE 3 CELLS ALLOT
   8.590-CONSTANT A-ADDR  CONSTANT UA-ADDR
   8.591-T{ UA-ADDR ALIGNED -> A-ADDR }T
   8.592-T{    1 A-ADDR C!  A-ADDR C@ ->    1 }T
   8.593-T{ 1234 A-ADDR  !  A-ADDR  @ -> 1234 }T
   8.594-T{ 123 456 A-ADDR 2!  A-ADDR 2@ -> 123 456 }T
   8.595-T{ 2 A-ADDR CHAR+ C!  A-ADDR CHAR+ C@ -> 2 }T
   8.596-T{ 3 A-ADDR CELL+ C!  A-ADDR CELL+ C@ -> 3 }T
   8.597-T{ 1234 A-ADDR CELL+ !  A-ADDR CELL+ @ -> 1234 }T
   8.598-T{ 123 456 A-ADDR CELL+ 2!  A-ADDR CELL+ 2@ -> 123 456 }T
   8.599-
   8.600-: BITS ( X -- U )
   8.601-   0 SWAP BEGIN DUP WHILE DUP MSB AND IF >R 1+ R> THEN 2* REPEAT DROP ;
   8.602-( CHARACTERS >= 1 AU, <= SIZE OF CELL, >= 8 BITS )
   8.603-T{ 1 CHARS 1 < -> <FALSE> }T
   8.604-T{ 1 CHARS 1 CELLS > -> <FALSE> }T
   8.605-( TBD: HOW TO FIND NUMBER OF BITS? )
   8.606-
   8.607-( CELLS >= 1 AU, INTEGRAL MULTIPLE OF CHAR SIZE, >= 16 BITS )
   8.608-T{ 1 CELLS 1 < -> <FALSE> }T
   8.609-T{ 1 CELLS 1 CHARS MOD -> 0 }T
   8.610-T{ 1S BITS 10 < -> <FALSE> }T
   8.611-
   8.612-T{ 0 1ST ! -> }T
   8.613-T{ 1 1ST +! -> }T
   8.614-T{ 1ST @ -> 1 }T
   8.615-T{ -1 1ST +! 1ST @ -> 0 }T
   8.616-
   8.617-\ ------------------------------------------------------------------------
   8.618-TESTING CHAR [CHAR] [ ] BL S"
   8.619-
   8.620-T{ BL -> 20 }T
   8.621-T{ CHAR X -> 58 }T
   8.622-T{ CHAR HELLO -> 48 }T
   8.623-T{ : GC1 [CHAR] X ; -> }T
   8.624-T{ : GC2 [CHAR] HELLO ; -> }T
   8.625-T{ GC1 -> 58 }T
   8.626-T{ GC2 -> 48 }T
   8.627-T{ : GC3 [ GC1 ] LITERAL ; -> }T
   8.628-T{ GC3 -> 58 }T
   8.629-T{ : GC4 S" XY" ; -> }T
   8.630-T{ GC4 SWAP DROP -> 2 }T
   8.631-T{ GC4 DROP DUP C@ SWAP CHAR+ C@ -> 58 59 }T
   8.632-
   8.633-\ ------------------------------------------------------------------------
   8.634-TESTING ' ['] FIND EXECUTE IMMEDIATE COUNT LITERAL POSTPONE STATE
   8.635-
   8.636-T{ : GT1 123 ; -> }T
   8.637-T{ ' GT1 EXECUTE -> 123 }T
   8.638-T{ : GT2 ['] GT1 ; IMMEDIATE -> }T
   8.639-T{ GT2 EXECUTE -> 123 }T
   8.640-HERE 3 C, CHAR G C, CHAR T C, CHAR 1 C, CONSTANT GT1STRING
   8.641-HERE 3 C, CHAR G C, CHAR T C, CHAR 2 C, CONSTANT GT2STRING
   8.642-T{ GT1STRING FIND -> ' GT1 -1 }T
   8.643-T{ GT2STRING FIND -> ' GT2 1 }T
   8.644-( HOW TO SEARCH FOR NON-EXISTENT WORD? )
   8.645-T{ : GT3 GT2 LITERAL ; -> }T
   8.646-T{ GT3 -> ' GT1 }T
   8.647-T{ GT1STRING COUNT -> GT1STRING CHAR+ 3 }T
   8.648-
   8.649-T{ : GT4 POSTPONE GT1 ; IMMEDIATE -> }T
   8.650-T{ : GT5 GT4 ; -> }T
   8.651-T{ GT5 -> 123 }T
   8.652-T{ : GT6 345 ; IMMEDIATE -> }T
   8.653-T{ : GT7 POSTPONE GT6 ; -> }T
   8.654-T{ GT7 -> 345 }T
   8.655-
   8.656-T{ : GT8 STATE @ ; IMMEDIATE -> }T
   8.657-T{ GT8 -> 0 }T
   8.658-T{ : GT9 GT8 LITERAL ; -> }T
   8.659-T{ GT9 0= -> <FALSE> }T
   8.660-
   8.661-\ ------------------------------------------------------------------------
   8.662-TESTING IF ELSE THEN BEGIN WHILE REPEAT UNTIL RECURSE
   8.663-
   8.664-T{ : GI1 IF 123 THEN ; -> }T
   8.665-T{ : GI2 IF 123 ELSE 234 THEN ; -> }T
   8.666-T{ 0 GI1 -> }T
   8.667-T{ 1 GI1 -> 123 }T
   8.668-T{ -1 GI1 -> 123 }T
   8.669-T{ 0 GI2 -> 234 }T
   8.670-T{ 1 GI2 -> 123 }T
   8.671-T{ -1 GI1 -> 123 }T
   8.672-
   8.673-T{ : GI3 BEGIN DUP 5 < WHILE DUP 1+ REPEAT ; -> }T
   8.674-T{ 0 GI3 -> 0 1 2 3 4 5 }T
   8.675-T{ 4 GI3 -> 4 5 }T
   8.676-T{ 5 GI3 -> 5 }T
   8.677-T{ 6 GI3 -> 6 }T
   8.678-
   8.679-T{ : GI4 BEGIN DUP 1+ DUP 5 > UNTIL ; -> }T
   8.680-T{ 3 GI4 -> 3 4 5 6 }T
   8.681-T{ 5 GI4 -> 5 6 }T
   8.682-T{ 6 GI4 -> 6 7 }T
   8.683-
   8.684-T{ : GI5 BEGIN DUP 2 >
   8.685-         WHILE DUP 5 < WHILE DUP 1+ REPEAT 123 ELSE 345 THEN ; -> }T
   8.686-T{ 1 GI5 -> 1 345 }T
   8.687-T{ 2 GI5 -> 2 345 }T
   8.688-T{ 3 GI5 -> 3 4 5 123 }T
   8.689-T{ 4 GI5 -> 4 5 123 }T
   8.690-T{ 5 GI5 -> 5 123 }T
   8.691-
   8.692-T{ : GI6 ( N -- 0,1,..N ) DUP IF DUP >R 1- RECURSE R> THEN ; -> }T
   8.693-T{ 0 GI6 -> 0 }T
   8.694-T{ 1 GI6 -> 0 1 }T
   8.695-T{ 2 GI6 -> 0 1 2 }T
   8.696-T{ 3 GI6 -> 0 1 2 3 }T
   8.697-T{ 4 GI6 -> 0 1 2 3 4 }T
   8.698-
   8.699-\ ------------------------------------------------------------------------
   8.700-TESTING DO LOOP +LOOP I J UNLOOP LEAVE EXIT
   8.701-
   8.702-T{ : GD1 DO I LOOP ; -> }T
   8.703-T{ 4 1 GD1 -> 1 2 3 }T
   8.704-T{ 2 -1 GD1 -> -1 0 1 }T
   8.705-T{ MID-UINT+1 MID-UINT GD1 -> MID-UINT }T
   8.706-
   8.707-T{ : GD2 DO I -1 +LOOP ; -> }T
   8.708-T{ 1 4 GD2 -> 4 3 2 1 }T
   8.709-T{ -1 2 GD2 -> 2 1 0 -1 }T
   8.710-T{ MID-UINT MID-UINT+1 GD2 -> MID-UINT+1 MID-UINT }T
   8.711-
   8.712-T{ : GD3 DO 1 0 DO J LOOP LOOP ; -> }T
   8.713-T{ 4 1 GD3 -> 1 2 3 }T
   8.714-T{ 2 -1 GD3 -> -1 0 1 }T
   8.715-T{ MID-UINT+1 MID-UINT GD3 -> MID-UINT }T
   8.716-
   8.717-T{ : GD4 DO 1 0 DO J LOOP -1 +LOOP ; -> }T
   8.718-T{ 1 4 GD4 -> 4 3 2 1 }T
   8.719-T{ -1 2 GD4 -> 2 1 0 -1 }T
   8.720-T{ MID-UINT MID-UINT+1 GD4 -> MID-UINT+1 MID-UINT }T
   8.721-
   8.722-T{ : GD5 123 SWAP 0 DO I 4 > IF DROP 234 LEAVE THEN LOOP ; -> }T
   8.723-T{ 1 GD5 -> 123 }T
   8.724-T{ 5 GD5 -> 123 }T
   8.725-T{ 6 GD5 -> 234 }T
   8.726-
   8.727-T{ : GD6  ( PAT: T{0 0},{0 0}{1 0}{1 1},{0 0}{1 0}{1 1}{2 0}{2 1}{2 2} )
   8.728-   0 SWAP 0 DO
   8.729-      I 1+ 0 DO I J + 3 = IF I UNLOOP I UNLOOP EXIT THEN 1+ LOOP
   8.730-    LOOP ; -> }T
   8.731-T{ 1 GD6 -> 1 }T
   8.732-T{ 2 GD6 -> 3 }T
   8.733-T{ 3 GD6 -> 4 1 2 }T
   8.734-
   8.735-\ ------------------------------------------------------------------------
   8.736-TESTING DEFINING WORDS: : ; CONSTANT VARIABLE CREATE DOES> >BODY
   8.737-
   8.738-T{ 123 CONSTANT X123 -> }T
   8.739-T{ X123 -> 123 }T
   8.740-T{ : EQU CONSTANT ; -> }T
   8.741-T{ X123 EQU Y123 -> }T
   8.742-T{ Y123 -> 123 }T
   8.743-
   8.744-T{ VARIABLE V1 -> }T
   8.745-T{ 123 V1 ! -> }T
   8.746-T{ V1 @ -> 123 }T
   8.747-
   8.748-T{ : NOP : POSTPONE ; ; -> }T
   8.749-T{ NOP NOP1 NOP NOP2 -> }T
   8.750-T{ NOP1 -> }T
   8.751-T{ NOP2 -> }T
   8.752-
   8.753-T{ : DOES1 DOES> @ 1 + ; -> }T
   8.754-T{ : DOES2 DOES> @ 2 + ; -> }T
   8.755-T{ CREATE CR1 -> }T
   8.756-T{ CR1 -> HERE }T
   8.757-T{ ' CR1 >BODY -> HERE }T
   8.758-T{ 1 , -> }T
   8.759-T{ CR1 @ -> 1 }T
   8.760-T{ DOES1 -> }T
   8.761-T{ CR1 -> 2 }T
   8.762-T{ DOES2 -> }T
   8.763-T{ CR1 -> 3 }T
   8.764-
   8.765-T{ : WEIRD: CREATE DOES> 1 + DOES> 2 + ; -> }T
   8.766-T{ WEIRD: W1 -> }T
   8.767-T{ ' W1 >BODY -> HERE }T
   8.768-T{ W1 -> HERE 1 + }T
   8.769-T{ W1 -> HERE 2 + }T
   8.770-
   8.771-\ ------------------------------------------------------------------------
   8.772-TESTING EVALUATE
   8.773-
   8.774-: GE1 S" 123" ; IMMEDIATE
   8.775-: GE2 S" 123 1+" ; IMMEDIATE
   8.776-: GE3 S" : GE4 345 ;" ;
   8.777-: GE5 EVALUATE ; IMMEDIATE
   8.778-
   8.779-T{ GE1 EVALUATE -> 123 }T         ( TEST EVALUATE IN INTERP. STATE )
   8.780-T{ GE2 EVALUATE -> 124 }T
   8.781-T{ GE3 EVALUATE -> }T
   8.782-T{ GE4 -> 345 }T
   8.783-
   8.784-T{ : GE6 GE1 GE5 ; -> }T         ( TEST EVALUATE IN COMPILE STATE )
   8.785-T{ GE6 -> 123 }T
   8.786-T{ : GE7 GE2 GE5 ; -> }T
   8.787-T{ GE7 -> 124 }T
   8.788-
   8.789-\ ------------------------------------------------------------------------
   8.790-TESTING SOURCE >IN WORD
   8.791-
   8.792-: GS1 S" SOURCE" 2DUP EVALUATE
   8.793-       >R SWAP >R = R> R> = ;
   8.794-T{ GS1 -> <TRUE> <TRUE> }T
   8.795-
   8.796-VARIABLE SCANS
   8.797-: RESCAN?  -1 SCANS +! SCANS @ IF 0 >IN ! THEN ;
   8.798-
   8.799-T{ 2 SCANS !
   8.800-345 RESCAN?
   8.801--> 345 345 }T
   8.802-
   8.803-: GS2  5 SCANS ! S" 123 RESCAN?" EVALUATE ;
   8.804-T{ GS2 -> 123 123 123 123 123 }T
   8.805-
   8.806-: GS3 WORD COUNT SWAP C@ ;
   8.807-T{ BL GS3 HELLO -> 5 CHAR H }T
   8.808-T{ CHAR " GS3 GOODBYE" -> 7 CHAR G }T
   8.809-T{ BL GS3
   8.810-DROP -> 0 }T            \ BLANK LINE RETURN ZERO-LENGTH STRING
   8.811-
   8.812-: GS4 SOURCE >IN ! DROP ;
   8.813-T{ GS4 123 456
   8.814--> }T
   8.815-
   8.816-\ ------------------------------------------------------------------------
   8.817-TESTING <# # #S #> HOLD SIGN BASE >NUMBER HEX DECIMAL
   8.818-
   8.819-: S=  \ ( ADDR1 C1 ADDR2 C2 -- T/F ) COMPARE TWO STRINGS.
   8.820-   >R SWAP R@ = IF         \ MAKE SURE STRINGS HAVE SAME LENGTH
   8.821-      R> ?DUP IF         \ IF NON-EMPTY STRINGS
   8.822-    0 DO
   8.823-       OVER C@ OVER C@ - IF 2DROP <FALSE> UNLOOP EXIT THEN
   8.824-       SWAP CHAR+ SWAP CHAR+
   8.825-         LOOP
   8.826-      THEN
   8.827-      2DROP <TRUE>         \ IF WE GET HERE, STRINGS MATCH
   8.828-   ELSE
   8.829-      R> DROP 2DROP <FALSE>      \ LENGTHS MISMATCH
   8.830-   THEN ;
   8.831-
   8.832-: GP1  <# 41 HOLD 42 HOLD 0 0 #> S" BA" S= ;
   8.833-T{ GP1 -> <TRUE> }T
   8.834-
   8.835-: GP2  <# -1 SIGN 0 SIGN -1 SIGN 0 0 #> S" --" S= ;
   8.836-T{ GP2 -> <TRUE> }T
   8.837-
   8.838-: GP3  <# 1 0 # # #> S" 01" S= ;
   8.839-T{ GP3 -> <TRUE> }T
   8.840-
   8.841-: GP4  <# 1 0 #S #> S" 1" S= ;
   8.842-T{ GP4 -> <TRUE> }T
   8.843-
   8.844-24 CONSTANT MAX-BASE         \ BASE 2 .. 36
   8.845-: COUNT-BITS
   8.846-   0 0 INVERT BEGIN DUP WHILE >R 1+ R> 2* REPEAT DROP ;
   8.847-COUNT-BITS 2* CONSTANT #BITS-UD      \ NUMBER OF BITS IN UD
   8.848-
   8.849-: GP5
   8.850-   BASE @ <TRUE>
   8.851-   MAX-BASE 1+ 2 DO         \ FOR EACH POSSIBLE BASE
   8.852-      I BASE !            \ TBD: ASSUMES BASE WORKS
   8.853-      I 0 <# #S #> S" 10" S= AND
   8.854-   LOOP
   8.855-   SWAP BASE ! ;
   8.856-T{ GP5 -> <TRUE> }T
   8.857-
   8.858-: GP6
   8.859-   BASE @ >R  2 BASE !
   8.860-   MAX-UINT MAX-UINT <# #S #>      \ MAXIMUM UD TO BINARY
   8.861-   R> BASE !            \ S: C-ADDR U
   8.862-   DUP #BITS-UD = SWAP
   8.863-   0 DO               \ S: C-ADDR FLAG
   8.864-      OVER C@ [CHAR] 1 = AND      \ ALL ONES
   8.865-      >R CHAR+ R>
   8.866-   LOOP SWAP DROP ;
   8.867-T{ GP6 -> <TRUE> }T
   8.868-
   8.869-: GP7
   8.870-   BASE @ >R    MAX-BASE BASE !
   8.871-   <TRUE>
   8.872-   A 0 DO
   8.873-      I 0 <# #S #>
   8.874-      1 = SWAP C@ I 30 + = AND AND
   8.875-   LOOP
   8.876-   MAX-BASE A DO
   8.877-      I 0 <# #S #>
   8.878-      1 = SWAP C@ 41 I A - + = AND AND
   8.879-   LOOP
   8.880-   R> BASE ! ;
   8.881-
   8.882-T{ GP7 -> <TRUE> }T
   8.883-
   8.884-\ >NUMBER TESTS
   8.885-CREATE GN-BUF 0 C,
   8.886-: GN-STRING   GN-BUF 1 ;
   8.887-: GN-CONSUMED   GN-BUF CHAR+ 0 ;
   8.888-: GN'      [CHAR] ' WORD CHAR+ C@ GN-BUF C!  GN-STRING ;
   8.889-
   8.890-T{ 0 0 GN' 0' >NUMBER -> 0 0 GN-CONSUMED }T
   8.891-T{ 0 0 GN' 1' >NUMBER -> 1 0 GN-CONSUMED }T
   8.892-T{ 1 0 GN' 1' >NUMBER -> BASE @ 1+ 0 GN-CONSUMED }T
   8.893-T{ 0 0 GN' -' >NUMBER -> 0 0 GN-STRING }T   \ SHOULD FAIL TO CONVERT THESE
   8.894-T{ 0 0 GN' +' >NUMBER -> 0 0 GN-STRING }T
   8.895-T{ 0 0 GN' .' >NUMBER -> 0 0 GN-STRING }T
   8.896-
   8.897-: >NUMBER-BASED
   8.898-   BASE @ >R BASE ! >NUMBER R> BASE ! ;
   8.899-
   8.900-T{ 0 0 GN' 2' 10 >NUMBER-BASED -> 2 0 GN-CONSUMED }T
   8.901-T{ 0 0 GN' 2'  2 >NUMBER-BASED -> 0 0 GN-STRING }T
   8.902-T{ 0 0 GN' F' 10 >NUMBER-BASED -> F 0 GN-CONSUMED }T
   8.903-T{ 0 0 GN' G' 10 >NUMBER-BASED -> 0 0 GN-STRING }T
   8.904-T{ 0 0 GN' G' MAX-BASE >NUMBER-BASED -> 10 0 GN-CONSUMED }T
   8.905-T{ 0 0 GN' Z' MAX-BASE >NUMBER-BASED -> 23 0 GN-CONSUMED }T
   8.906-
   8.907-: GN1   \ ( UD BASE -- UD' LEN ) UD SHOULD EQUAL UD' AND LEN SHOULD BE ZERO.
   8.908-   BASE @ >R BASE !
   8.909-   <# #S #>
   8.910-   0 0 2SWAP >NUMBER SWAP DROP      \ RETURN LENGTH ONLY
   8.911-   R> BASE ! ;
   8.912-T{ 0 0 2 GN1 -> 0 0 0 }T
   8.913-T{ MAX-UINT 0 2 GN1 -> MAX-UINT 0 0 }T
   8.914-T{ MAX-UINT DUP 2 GN1 -> MAX-UINT DUP 0 }T
   8.915-T{ 0 0 MAX-BASE GN1 -> 0 0 0 }T
   8.916-T{ MAX-UINT 0 MAX-BASE GN1 -> MAX-UINT 0 0 }T
   8.917-T{ MAX-UINT DUP MAX-BASE GN1 -> MAX-UINT DUP 0 }T
   8.918-
   8.919-: GN2   \ ( -- 16 10 )
   8.920-   BASE @ >R  HEX BASE @  DECIMAL BASE @  R> BASE ! ;
   8.921-T{ GN2 -> 10 A }T
   8.922-
   8.923-\ ------------------------------------------------------------------------
   8.924-TESTING FILL MOVE
   8.925-
   8.926-CREATE FBUF 00 C, 00 C, 00 C,
   8.927-CREATE SBUF 12 C, 34 C, 56 C,
   8.928-: SEEBUF FBUF C@  FBUF CHAR+ C@  FBUF CHAR+ CHAR+ C@ ;
   8.929-
   8.930-T{ FBUF 0 20 FILL -> }T
   8.931-T{ SEEBUF -> 00 00 00 }T
   8.932-
   8.933-T{ FBUF 1 20 FILL -> }T
   8.934-T{ SEEBUF -> 20 00 00 }T
   8.935-
   8.936-T{ FBUF 3 20 FILL -> }T
   8.937-T{ SEEBUF -> 20 20 20 }T
   8.938-
   8.939-T{ FBUF FBUF 3 CHARS MOVE -> }T      \ BIZARRE SPECIAL CASE
   8.940-T{ SEEBUF -> 20 20 20 }T
   8.941-
   8.942-T{ SBUF FBUF 0 CHARS MOVE -> }T
   8.943-T{ SEEBUF -> 20 20 20 }T
   8.944-
   8.945-T{ SBUF FBUF 1 CHARS MOVE -> }T
   8.946-T{ SEEBUF -> 12 20 20 }T
   8.947-
   8.948-T{ SBUF FBUF 3 CHARS MOVE -> }T
   8.949-T{ SEEBUF -> 12 34 56 }T
   8.950-
   8.951-T{ FBUF FBUF CHAR+ 2 CHARS MOVE -> }T
   8.952-T{ SEEBUF -> 12 12 34 }T
   8.953-
   8.954-T{ FBUF CHAR+ FBUF 2 CHARS MOVE -> }T
   8.955-T{ SEEBUF -> 12 34 34 }T
   8.956-
   8.957-\ ------------------------------------------------------------------------
   8.958-TESTING OUTPUT: . ." CR EMIT SPACE SPACES TYPE U.
   8.959-
   8.960-: OUTPUT-TEST
   8.961-   ." YOU SHOULD SEE THE STANDARD GRAPHIC CHARACTERS:" CR
   8.962-   41 BL DO I EMIT LOOP CR
   8.963-   61 41 DO I EMIT LOOP CR
   8.964-   7F 61 DO I EMIT LOOP CR
   8.965-   ." YOU SHOULD SEE 0-9 SEPARATED BY A SPACE:" CR
   8.966-   9 1+ 0 DO I . LOOP CR
   8.967-   ." YOU SHOULD SEE 0-9 (WITH NO SPACES):" CR
   8.968-   [CHAR] 9 1+ [CHAR] 0 DO I 0 SPACES EMIT LOOP CR
   8.969-   ." YOU SHOULD SEE A-G SEPARATED BY A SPACE:" CR
   8.970-   [CHAR] G 1+ [CHAR] A DO I EMIT SPACE LOOP CR
   8.971-   ." YOU SHOULD SEE 0-5 SEPARATED BY TWO SPACES:" CR
   8.972-   5 1+ 0 DO I [CHAR] 0 + EMIT 2 SPACES LOOP CR
   8.973-   ." YOU SHOULD SEE TWO SEPARATE LINES:" CR
   8.974-   S" LINE 1" TYPE CR S" LINE 2" TYPE CR
   8.975-   ." YOU SHOULD SEE THE NUMBER RANGES OF SIGNED AND UNSIGNED NUMBERS:" CR
   8.976-   ."   SIGNED: " MIN-INT . MAX-INT . CR
   8.977-   ." UNSIGNED: " 0 U. MAX-UINT U. CR
   8.978-;
   8.979-
   8.980-T{ OUTPUT-TEST -> }T
   8.981-
   8.982-
   8.983-\ ------------------------------------------------------------------------
   8.984-TESTING INPUT: ACCEPT
   8.985-
   8.986-CREATE ABUF 50 CHARS ALLOT
   8.987-
   8.988-: ACCEPT-TEST
   8.989-   CR ." PLEASE TYPE UP TO 80 CHARACTERS:" CR
   8.990-   ABUF 50 ACCEPT
   8.991-   CR ." RECEIVED: " [CHAR] " EMIT
   8.992-   ABUF SWAP TYPE [CHAR] " EMIT CR
   8.993-;
   8.994-
   8.995-T{ ACCEPT-TEST -> }T
   8.996-
   8.997-\ ------------------------------------------------------------------------
   8.998-TESTING DICTIONARY SEARCH RULES
   8.999-
  8.1000-T{ : GDX   123 ; : GDX   GDX 234 ; -> }T
  8.1001-
  8.1002-T{ GDX -> 123 234 }T
  8.1003-
  8.1004-CR .( End of Core word set tests) CR
  8.1005-
  8.1006-
     9.1--- a/fig/tests/tester.fr	Sat May 27 21:07:55 2023 -0400
     9.2+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
     9.3@@ -1,66 +0,0 @@
     9.4-\ From: John Hayes S1I
     9.5-\ Subject: tester.fr
     9.6-\ Date: Mon, 27 Nov 95 13:10:09 PST  
     9.7-
     9.8-\ (C) 1995 JOHNS HOPKINS UNIVERSITY / APPLIED PHYSICS LABORATORY
     9.9-\ MAY BE DISTRIBUTED FREELY AS LONG AS THIS COPYRIGHT NOTICE REMAINS.
    9.10-\ VERSION 1.2
    9.11-
    9.12-\ 24/11/2015 Replaced Core Ext word <> with = 0=
    9.13-\ 31/3/2015 Variable #ERRORS added and incremented for each error reported.
    9.14-\ 22/1/09 The words { and } have been changed to T{ and }T respectively to
    9.15-\ agree with the Forth 200X file ttester.fs. This avoids clashes with
    9.16-\ locals using { ... } and the FSL use of } 
    9.17-
    9.18-HEX
    9.19-
    9.20-\ SET THE FOLLOWING FLAG TO TRUE FOR MORE VERBOSE OUTPUT; THIS MAY
    9.21-\ ALLOW YOU TO TELL WHICH TEST CAUSED YOUR SYSTEM TO HANG.
    9.22-VARIABLE VERBOSE
    9.23-   FALSE VERBOSE !
    9.24-\   TRUE VERBOSE !
    9.25-
    9.26-: EMPTY-STACK   \ ( ... -- ) EMPTY STACK: HANDLES UNDERFLOWED STACK TOO.
    9.27-   DEPTH ?DUP IF DUP 0< IF NEGATE 0 DO 0 LOOP ELSE 0 DO DROP LOOP THEN THEN ;
    9.28-
    9.29-VARIABLE #ERRORS 0 #ERRORS !
    9.30-
    9.31-: ERROR      \ ( C-ADDR U -- ) DISPLAY AN ERROR MESSAGE FOLLOWED BY
    9.32-      \ THE LINE THAT HAD THE ERROR.
    9.33-   CR TYPE SOURCE TYPE       \ DISPLAY LINE CORRESPONDING TO ERROR
    9.34-   EMPTY-STACK               \ THROW AWAY EVERY THING ELSE
    9.35-   #ERRORS @ 1 + #ERRORS !
    9.36-\   QUIT  \ *** Uncomment this line to QUIT on an error
    9.37-;
    9.38-
    9.39-VARIABLE ACTUAL-DEPTH         \ STACK RECORD
    9.40-CREATE ACTUAL-RESULTS 20 CELLS ALLOT
    9.41-
    9.42-: T{      \ ( -- ) SYNTACTIC SUGAR.
    9.43-   ;
    9.44-
    9.45-: ->      \ ( ... -- ) RECORD DEPTH AND CONTENT OF STACK.
    9.46-   DEPTH DUP ACTUAL-DEPTH !      \ RECORD DEPTH
    9.47-   ?DUP IF            \ IF THERE IS SOMETHING ON STACK
    9.48-      0 DO ACTUAL-RESULTS I CELLS + ! LOOP \ SAVE THEM
    9.49-   THEN ;
    9.50-
    9.51-: }T      \ ( ... -- ) COMPARE STACK (EXPECTED) CONTENTS WITH SAVED
    9.52-      \ (ACTUAL) CONTENTS.
    9.53-   DEPTH ACTUAL-DEPTH @ = IF      \ IF DEPTHS MATCH
    9.54-      DEPTH ?DUP IF         \ IF THERE IS SOMETHING ON THE STACK
    9.55-         0  DO            \ FOR EACH STACK ITEM
    9.56-           ACTUAL-RESULTS I CELLS + @   \ COMPARE ACTUAL WITH EXPECTED
    9.57-           = 0= IF S" INCORRECT RESULT: " ERROR LEAVE THEN
    9.58-         LOOP
    9.59-      THEN
    9.60-   ELSE               \ DEPTH MISMATCH
    9.61-      S" WRONG NUMBER OF RESULTS: " ERROR
    9.62-   THEN ;
    9.63-
    9.64-: TESTING   \ ( -- ) TALKING COMMENT.
    9.65-  SOURCE VERBOSE @
    9.66-   IF DUP >R TYPE CR R> >IN !
    9.67-   ELSE >IN ! DROP [CHAR] * EMIT
    9.68-   THEN ;
    9.69-
    10.1--- a/install.lisp	Sat May 27 21:07:55 2023 -0400
    10.2+++ b/install.lisp	Mon May 29 21:46:21 2023 -0400
    10.3@@ -1,5 +1,10 @@
    10.4-(asdf:load-asd "demo.asd")
    10.5+#!/usr/local/bin/sbcl --script
    10.6+(in-package :cl-user)
    10.7+#-quicklisp
    10.8+(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp" (user-homedir-pathname))))
    10.9+  (when (probe-file quicklisp-init)
   10.10+    (load quicklisp-init)))
   10.11+(load "demo.asd")
   10.12 (ql:quickload :demo)
   10.13 ;; (asdf:make :demo)
   10.14-(save-lisp-and-die "demo" :toplevel #'demo:main)
   10.15-(quit)
   10.16+(sb-ext:save-lisp-and-die "out/demo" :toplevel #'demo:main :executable t)
    11.1--- a/lib.rs	Sat May 27 21:07:55 2023 -0400
    11.2+++ b/lib.rs	Mon May 29 21:46:21 2023 -0400
    11.3@@ -1,7 +1,6 @@
    11.4 //! demo/lib.rs --- generated by DEMO:RS-MACROEXPAND
    11.5 extern crate libc;
    11.6 extern crate obj;
    11.7-//pub use fig::*;
    11.8 use libc::{c_char, size_t};
    11.9 use obj::{CustomService, Objective, Service};
   11.10 use std::ffi::{CStr, CString};
    12.1--- a/makefile	Sat May 27 21:07:55 2023 -0400
    12.2+++ b/makefile	Mon May 29 21:46:21 2023 -0400
    12.3@@ -5,7 +5,7 @@
    12.4 CL:*.asd *.lisp
    12.5 clean:;rm -rf *.fasl;cargo clean
    12.6 fmt:$(RS);cargo fmt
    12.7-build:$(RS) $(CL);cargo build --$(M);$L install.lisp
    12.8+build:$(RS) $(CL);cargo build --$(M);$L --script install.lisp
    12.9 ffi:build;cp target/$(M)/libdemo.dylib ffi;cd ffi;$(P) ffi/build.py
   12.10 docs:$(RS);cargo doc
   12.11 test:$(RS) $(CL);cargo test;$L tests.lisp
    13.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    13.2+++ b/obj/src/cfg.rs	Mon May 29 21:46:21 2023 -0400
    13.3@@ -0,0 +1,51 @@
    13.4+/// common trait for all config modules. This trait provides functions
    13.5+/// for de/serializing to/from RON, updating fields, and formatting.
    13.6+use serde::{Serialize, Deserialize};
    13.7+use crate::Objective;
    13.8+use std::collections::HashMap as M;
    13.9+use std::path::PathBuf;
   13.10+use std::string::String as S;
   13.11+use std::error::Error as E;
   13.12+use std::boxed::Box as B;
   13.13+type R<X> = std::result::Result<X,B<dyn E>>;
   13.14+
   13.15+pub trait Configure: Objective {
   13.16+  fn update(&self) -> R<()> {
   13.17+    Ok(())
   13.18+  }
   13.19+}
   13.20+
   13.21+#[derive(Serialize, Deserialize, Debug, Default)]
   13.22+pub struct ShellConfig {
   13.23+  pub env: M<S,S>,
   13.24+  pub cmds: M<S,S>,
   13.25+  pub shell: ShellType,
   13.26+}
   13.27+
   13.28+impl Objective for ShellConfig {}
   13.29+
   13.30+#[derive(Serialize, Deserialize, Debug, Hash, Default)]
   13.31+pub enum ShellType {
   13.32+  #[default]
   13.33+  Bash,
   13.34+  Zsh,
   13.35+  Sh,
   13.36+}
   13.37+
   13.38+#[derive(Serialize, Deserialize, Debug, Default)]
   13.39+pub enum EditorType {
   13.40+  #[default]
   13.41+  Emacs,
   13.42+  Vi,
   13.43+  Nano,
   13.44+}
   13.45+
   13.46+#[derive(Serialize, Deserialize, Debug, Default)]
   13.47+pub struct EditorConfig {
   13.48+  pub editor: EditorType,
   13.49+  pub cmds: M<S,S>,
   13.50+  pub init_file: PathBuf,
   13.51+}
   13.52+
   13.53+#[cfg(test)]
   13.54+mod tests;
    14.1--- a/pkg.lisp	Sat May 27 21:07:55 2023 -0400
    14.2+++ b/pkg.lisp	Mon May 29 21:46:21 2023 -0400
    14.3@@ -5,40 +5,40 @@
    14.4 (defpackage #:demo
    14.5   (:use #:cl #:cffi)
    14.6   (:local-nicknames
    14.7-   (#:rdb #:cl-rocksdb)
    14.8+   ;;   (#:rdb #:cl-rocksdb)
    14.9    (#:v #:org.shirakumo.verbose)
   14.10    (#:bt #:bordeaux-threads)
   14.11    (#:cli #:clingon))
   14.12   ;; db.lisp
   14.13-  (:export
   14.14-   #:create-options
   14.15-   #:destroy-options
   14.16-   #:increase-parallelism
   14.17-   #:optimize-level-style-compaction
   14.18-   #:set-create-if-missing
   14.19-   #:create-writeoptions
   14.20-   #:destroy-writeoptions
   14.21-   #:create-readoptions
   14.22-   #:destroy-readoptions
   14.23-   #:open-db
   14.24-   #:close-db
   14.25-   #:cancel-all-background-work
   14.26-   #:put-kv
   14.27-   #:put-kv-str
   14.28-   #:get-kv
   14.29-   #:get-kv-str
   14.30-   #:create-iter
   14.31-   #:destroy-iter
   14.32-   #:move-iter-to-first
   14.33-   #:move-iter-forward
   14.34-   #:move-iter-backword
   14.35-   #:valid-iter-p
   14.36-   #:iter-key
   14.37-   #:iter-key-str
   14.38-   #:iter-value
   14.39-   #:iter-value-str
   14.40-   #:with-open-db
   14.41-   #:with-iter)
   14.42+  ;; (:export
   14.43+  ;;  #:create-options
   14.44+  ;;  #:destroy-options
   14.45+  ;;  #:increase-parallelism
   14.46+  ;;  #:optimize-level-style-compaction
   14.47+  ;;  #:set-create-if-missing
   14.48+  ;;  #:create-writeoptions
   14.49+  ;;  #:destroy-writeoptions
   14.50+  ;;  #:create-readoptions
   14.51+  ;;  #:destroy-readoptions
   14.52+  ;;  #:open-db
   14.53+  ;;  #:close-db
   14.54+  ;;  #:cancel-all-background-work
   14.55+  ;;  #:put-kv
   14.56+  ;;  #:put-kv-str
   14.57+  ;;  #:get-kv
   14.58+  ;;  #:get-kv-str
   14.59+  ;;  #:create-iter
   14.60+  ;;  #:destroy-iter
   14.61+  ;;  #:move-iter-to-first
   14.62+  ;;  #:move-iter-forward
   14.63+  ;;  #:move-iter-backword
   14.64+  ;;  #:valid-iter-p
   14.65+  ;;  #:iter-key
   14.66+  ;;  #:iter-key-str
   14.67+  ;;  #:iter-value
   14.68+  ;;  #:iter-value-str
   14.69+  ;;  #:with-open-db
   14.70+  ;;  #:with-iter)
   14.71   ;; demo.lisp
   14.72   (:export
   14.73    #:main
   14.74@@ -67,11 +67,12 @@
   14.75    #:rs-macroexpand-1
   14.76    #:rs-macroexpand)
   14.77   ;; ffi.lisp
   14.78-  (:export
   14.79-   #:quiche-lib-path
   14.80-   #:rocksdb-lib-path
   14.81-   #:demo-lib-path
   14.82-   #:find-rs-cdylib
   14.83-   #:install-demo-lib
   14.84-   #:install-quiche-lib
   14.85-   #:install-rocksdb-lib))
   14.86+  ;; (:export
   14.87+  ;;  #:quiche-lib-path
   14.88+  ;;  #:rocksdb-lib-path
   14.89+  ;;  #:demo-lib-path
   14.90+  ;;  #:find-rs-cdylib
   14.91+  ;;  #:install-demo-lib
   14.92+  ;;  #:install-quiche-lib
   14.93+  ;;  #:install-rocksdb-lib)
   14.94+  )
    15.1--- a/readme.org	Sat May 27 21:07:55 2023 -0400
    15.2+++ b/readme.org	Mon May 29 21:46:21 2023 -0400
    15.3@@ -20,13 +20,26 @@
    15.4 - L :: Lisp (sbcl, cmucl, ccl)
    15.5 - P :: Python (python3, python2)
    15.6 ** Run
    15.7-=./demo=
    15.8+#+begin_src shell
    15.9+  make build
   15.10+  ./out/demo
   15.11+#+end_src
   15.12 ** Config
   15.13 This demo features a novel configuration language inspired by
   15.14 FORTH. You are free to use ~.fig~ files, but also have the option to
   15.15 use a convention format (JSON,TOML,RON).
   15.16 ** Play
   15.17+The user interface is presented as a multi-modal GUI application which
   15.18+adapts to the backends below.
   15.19 *** Weather
   15.20+This backend retrieves weather data using the NWS API.
   15.21+*** Stocks
   15.22+The 'Stocks' backend features a stock ticker with real-time analysis
   15.23+capabilities.
   15.24+*** Bench
   15.25+This is a benchmark backend for testing the capabilities of our
   15.26+demo. It spins up some mock services and allows fine-grained control
   15.27+of input/throughput.
   15.28 * tasks
   15.29 ** TODO DSLs
   15.30 - consider tree-sitter parsing layout, use as a guide for developing a
   15.31@@ -36,17 +49,27 @@
   15.32 - with-rs/c
   15.33 - with-cargo
   15.34 - compile-rs/c
   15.35-
   15.36 *** TODO rs-macroexpand
   15.37 - rs-gen-file
   15.38 - rs-defmacro
   15.39 - rs-macros
   15.40 - rs-macroexpand
   15.41 - rs-macroexpand-1
   15.42-
   15.43 *** TODO c-macroexpand
   15.44 - c-gen-file h/c
   15.45 - c-defmacro
   15.46 - c-macros
   15.47 - c-macroexpand
   15.48 - c-macroexpand-1
   15.49+*** TODO slint-macroexpand
   15.50+- slint-gen-file
   15.51+- slint-defmacro
   15.52+- slint-macros
   15.53+- slint-macroexpand
   15.54+- slint-macroexpand-1
   15.55+*** TODO fig-macroexpand
   15.56+- fig-gen-file
   15.57+- fig-defmacro
   15.58+- fig-macros
   15.59+- fig-macroexpand
   15.60+- fig-macroexpand-1
    16.1--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
    16.2+++ b/system-index.txt	Mon May 29 21:46:21 2023 -0400
    16.3@@ -0,0 +1,1 @@
    16.4+demo.asd
    17.1--- a/ui/Cargo.toml	Sat May 27 21:07:55 2023 -0400
    17.2+++ b/ui/Cargo.toml	Mon May 29 21:46:21 2023 -0400
    17.3@@ -13,7 +13,6 @@
    17.4 slint-build = "1.0.2"
    17.5 [dependencies]
    17.6 obj = {version = "0.1.0",path = "../obj"}
    17.7-fig = {version = "0.1.0",path = "../fig"}
    17.8 env_logger = "0.10.0"
    17.9 log = "0.4.17"
   17.10 slint = "1.0.2"
    18.1--- a/ui/ui.slint	Sat May 27 21:07:55 2023 -0400
    18.2+++ b/ui/ui.slint	Mon May 29 21:46:21 2023 -0400
    18.3@@ -9,10 +9,12 @@
    18.4   HorizontalLayout {
    18.5     side-bar := SideBar {
    18.6       title: "Demo";
    18.7-      model: ["Controls", "ListView", "About"];
    18.8+      model: ["Controls", "ListView", "TableView", "TextEdit", "About"];
    18.9     }
   18.10     if(side-bar.current-item == 0) : ControlsPage {}
   18.11     if(side-bar.current-item == 1) : ListViewPage {}
   18.12-    if(side-bar.current-item == 2) : AboutPage {}
   18.13+    if(side-bar.current-item == 2) : TableViewPage {}
   18.14+    if(side-bar.current-item == 3) : TextEditPage {}
   18.15+    if(side-bar.current-item == 4) : AboutPage {}
   18.16   }
   18.17 }
   18.18\ No newline at end of file