From c648adedd52ad270b2f07b4f5aee7db622d05b3b Mon Sep 17 00:00:00 2001 From: rmgr Date: Wed, 6 Apr 2022 11:17:56 +0930 Subject: [PATCH] Move 2dup to an rforth implementation. Implement greater or equal and less or equal in rforth --- rforth.py | 40 ++++++++++++++++++++++------------------ standard-library.f | 4 ++++ 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/rforth.py b/rforth.py index a8528ff..4715475 100755 --- a/rforth.py +++ b/rforth.py @@ -1,3 +1,4 @@ +#!/usr/bin/python3 import argparse stack = [] compiling = False @@ -47,12 +48,14 @@ def parse_input(input_string, say_ok=True): input_string = _if(input_string) elif string == "dup": dup() - elif string == "2dup": - twodup() elif string == "swap": swap() elif string == "rot": rot() + elif string == "and": + _and() + elif string == "or": + _or() else: if string == ";": stop_compiling() @@ -66,8 +69,8 @@ def rot(): a = stack.pop(0) b = stack.pop(0) c = stack.pop(0) - stack.insert(0,a) stack.insert(0,b) + stack.insert(0,a) stack.insert(0,c) def swap(): @@ -95,14 +98,6 @@ def _if(input_string): return input_string[else_index : len(input_string)] return input_string -def scan_for_else_or_then(input_string): - for index in reversed(range(0, len(input_string))): - if input_string[index] == "then": - return input_string[index : len(input_string) - 1] - elif input_string[index] == "else": - return input_string[index : len(input_string) - 1] - return index - def scan_for_else(input_string, then_index): for index in reversed(range(0, then_index)): if input_string[index] == "else": @@ -113,15 +108,8 @@ def scan_for_then(input_string): for index in reversed(range(0, len(input_string))): if input_string[index] == "then": return index -# return input_string[index : len(input_string) - 1] return -1 -def twodup(): - a = stack.pop(0) - stack.insert(0,a) - stack.insert(0,a) - stack.insert(0,a) - def dup(): a = stack.pop(0) stack.insert(0,a) @@ -195,6 +183,22 @@ def add(): b = stack.pop(0) stack.insert(0, a+b) +def _and(): + a = stack.pop(0) + b = stack.pop(0) + if a == -1 and b == -1: + stack.insert(0, -1) + else: + stack.insert(0,0) + +def _or(): + a = stack.pop(0) + b = stack.pop(0) + if a == -1 or b == -1: + stack.insert(0, -1) + else: + stack.insert(0,0) + def show_stack(): print(stack) diff --git a/standard-library.f b/standard-library.f index 502ae58..9769c6f 100644 --- a/standard-library.f +++ b/standard-library.f @@ -1,2 +1,6 @@ : loop 1 swap - 2dup . 0 = if else loop then ; : loop2 2 swap - 2dup . 0 = if else loop2 then ; +: >= 2dup > rot rot = or ; +: 2dup swap dup rot dup rot rot ; +: <= 2dup < rot rot = or ; +