summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.rs44
1 files changed, 42 insertions, 2 deletions
diff --git a/src/main.rs b/src/main.rs
index 96e7abb..76a5753 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -7,9 +7,46 @@ use rust_decimal_macros::dec;
 
 use num_traits::pow::Pow;
 
-
 mod tests;
 
+
+const HELP_TEXT: &str =
+    "LITERALS\n\
+     0-9     integers\n\
+     _       toggle sign (or, as a command, negate the top item on the stack)\n\
+     [...]   string\n\
+     (...)   named command (see below)\n\
+     \n\
+     ARITHMETIC OPERATIONS\n\
+     +       add the top two items on the stack\n\
+     -       subtract the top item on the stack from the second item\n\
+     *       multiply the top two items on the stack\n\
+     /       divide the second item on the stack by the top item\n\
+     %       take the modulus of the second item by the base of the top item\n\
+     ^       raise the second item to the power of the top item\n\
+     v       take the square root of the top item on the stack\n\
+     \n\
+     STACK OPERATIONS\n\
+     d       duplicate the top item on the stack\n\
+     c       clear the stack\n\
+     ,       drop the top item from the stack\n\
+     !       something semi-implemented\n\
+     \n\
+     REGISTER OPERATIONS\n\
+     l       load from register (register name as next character)\n\
+     s       store to register (register name as next character)\n\
+     \n\
+     CONTROL FLOW\n\
+     x       evaluate string\n\
+     \n\
+     META\n\
+     p       print the top item of the stack, leaving it in place\n\
+     n       print the top item of the stack, popping it\n\
+     q       quit (you can also ^D)\n\
+     ?       help (this message)\n\
+     \n\
+     Good luck!\n\n";
+
 #[derive(Debug,PartialEq,Eq,Clone)]
 enum Value {
         Str(String),
@@ -194,8 +231,11 @@ fn command_char(c: char, state: &mut RPState) -> Result<(), Exit> {
         state.eat_count = 0;
         Ok(())
     }
-    else if let 'p' | 'n' | 'q' | 'l' | 's' | 'v' | 'x' | 'd' | ',' | 'c' | '!' = c {
+    else if let 'p' | 'n' | 'q' | 'l' | 's' | 'v' | 'x' | 'd' | ',' | 'c' | '!' | '?' = c {
         match c {
+            '?' => {
+                print!("{}", HELP_TEXT);
+            },
             '!' => {
                 if state.stack.is_empty() { 
                     return Err(err_msg("Data underflow!".into()));