# 1. The Stack ## 1.1 Types An element in the stack is an unsigned number, 32 bit or larger. ## 1.2 Numbers When the cursor reaches a number, it pushes that digit onto the stack. For example, 123 will end up with a stack of `[3, 2, 1]`. (left most is top most) The \` can be used to enter into numeric mode. For example, \`123\` would give you a stack `[123]`. ## 1.3 Strings Use " to enable string mode. For example, "hello" ends up with `['o', 'l', 'l', 'e', 'h'] = [111, 108, 108, 101, 104]`. (left most is top most) # 2 Standard Operators and Library `a` is used to refer to the topmost element popped and `b` to the second topmost element popped. ## 2.1 Arithmetic Operators | Symbol | Name | Description | | ------ | ---- |------------------------------ | | + | Add | b + a | | - | Sub | b - a | | * | Mul | b * a | | / | Div | b / a | | % | Mod | b % a | ## 2.2 Logical Operators | Symbol | Name | Description | | ------ | ---- |------------------------------ | | ! | Not | If a == 0, push 1 else push 0 | | ` | Grtr | If b > a, push 1 else push 0 | ## 2.3 Flow Control | Symbol | Name | Description | | ------ | ---- |------------------------------ | | ^ | DirU | Direction Flow | | > | DirR | Direction Flow | | v | DirD | Direction Flow | | < | DirL | Direction Flow | | ? | RndD | Random direction | | _ | H-If | If a==0, go right else left | | | | V-If | If a==0, go down else up | | # | brdg | Jump over next statement | | @ | exit | Exit Program | | [ | bs | Skip til next | | ] | be | End skip | ## 2.4 Stack Operators | Symbol | Name | Description | | ------ | ---- |------------------------------ | | 0 - 9 | Int | Input an integer digit | | " | Str | Toggle string mode | | : | Dup | Push a twice | | \ | Swap | Swap a and b | | $ | Del | Pop and discard $ | ## 2.5 Input and Output | Symbol | Name | Description | | ------ | ---- |------------------------------ | | . | oint | Output a as int | | , | ochr | Output a as char | | & | iint | Input a as int | | ~ | ichr | Input a as char | | g | get | a=y, b=x, get (x, y) | | p | put | a=y, b=x, c=v. set (x, y) = v | ## 2.6 Core Functions S, T, U are reverse strings. The first letter in the string is at the top of the stack. For example, to pass "hello" as a parameter would be: `0"olleh" = ['h', 'e', 'l', 'l', 'o', 0] = [104, 101, 108, 108, 111, 0]` | Symbol | Name | Description | | ------ | ---- |--------------------------------------- | | M | req | Load module S. Pop 1 on success else 0 | | P | load | Load subprogram S::R and call it a. | | R | rtn | Return to caller | | L | lock | Hide the stack before a certain cell - use to stop bugs overwriting previous program's stack elements. | Calling P will load the subprogram's canvas into memory. Any changes to the Canvas in one subprogram call will be kept and seen by the next. See submodule_getput.rf which calls sp_getput.rf ### Examples ``` v Program to find the length of a string > v v M"str"0 < Load module "str" v _ 0"rorre"#,:_ @ If failed output error > v v P"lstr"0"length"0 < Load str::length, call it l. > 0"sdlmsdlmsd" l . @ Run l on "sdlmsdlmsd". ``` `str::length` means the subprogram length in the module str. If the module is a rf module, then there will be some str/length.rf or stf/length.bf somewhere. If it's a native module, then there will be some C++ code or some binding somewhere. # 3 Modules and Subprograms Modules are collections of rufunge files. Each rufunge file is a subprogram.