about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--lua/chupacabra/chupacabra.lua5
-rw-r--r--lua/chupacabra/refcard.md1
-rw-r--r--lua/chupacabra/test_chupacabra.lua3
3 files changed, 8 insertions, 1 deletions
diff --git a/lua/chupacabra/chupacabra.lua b/lua/chupacabra/chupacabra.lua
index aedd71e..e64afc3 100644
--- a/lua/chupacabra/chupacabra.lua
+++ b/lua/chupacabra/chupacabra.lua
@@ -55,6 +55,11 @@ function chupacabra.evaluate(tokens, context)
             table.remove(stack)
         elseif token == ":" then 
             table.insert(stack, stack[#stack])
+        elseif token == "?" then
+            local a = table.remove(stack)
+            local b = table.remove(stack)
+            table.insert(stack, a)
+            table.insert(stack, b)
         elseif token == "@" then
             local index = table.remove(stack)
             local array = table.remove(stack)
diff --git a/lua/chupacabra/refcard.md b/lua/chupacabra/refcard.md
index daaa7ae..a2b473c 100644
--- a/lua/chupacabra/refcard.md
+++ b/lua/chupacabra/refcard.md
@@ -10,6 +10,7 @@ Chupacabra is a stack-based programming language/calculator implemented in lua.
 - **Arrays**: You can push arrays onto the stack. For example, `[1 2 3 4]` pushes the array {1, 2, 3, 4} onto the stack.
 - **`.`**: The `.` operator pops the top element from the stack and discards it.
 - **`:`**: The `:` operator duplicates the top element of the stack
+- **`?`**: The `?` operator swaps the top two elements of the stack
 
 ## Array-first keywords
 - **`@`**: the `@` keyword allows you to grab a specific value from an array by index, e.g. `[10 20 30] 2 @` would return the value `20`.
diff --git a/lua/chupacabra/test_chupacabra.lua b/lua/chupacabra/test_chupacabra.lua
index 61ff9ef..0a58cc4 100644
--- a/lua/chupacabra/test_chupacabra.lua
+++ b/lua/chupacabra/test_chupacabra.lua
@@ -47,4 +47,5 @@ tc("1 2 3 4 5 ..", {1, 2, 3, 4, 5}) -- construct an array
 tc("[1 2 3 4 5] [6 7 8 9 10] [10 11 12 13] @..", {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 11, 12, 13}) -- combine arrays
 tc("[10 20 30] 1 @", 10)  -- access array element at a given index (1-based)
 tc("[10 20 30] 2 @ 20 +", 40)  -- this leaves nothing on the stack, since @ consumes the array and doesn't replace it on to the stack
-tc("1 2 3 : +", 6) -- : duplicates the top element on the stack
\ No newline at end of file
+tc("1 2 3 : +", 6) -- : duplicates the top element on the stack
+tc("100 10 20 ?", 10) -- ? swaps the top two elements on the stack
\ No newline at end of file