From 6caa05788b7dd7f59d863e9774b7f61d534cd1fc Mon Sep 17 00:00:00 2001 From: elioat Date: Sun, 9 Jun 2024 17:21:31 -0400 Subject: * --- lua/chupacabra/chupacabra.lua | 5 +++++ lua/chupacabra/refcard.md | 1 + lua/chupacabra/test_chupacabra.lua | 3 ++- 3 files changed, 8 insertions(+), 1 deletion(-) 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 -- cgit 1.4.1-2-gfad0