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