Move 2dup to an rforth implementation. Implement greater or equal and less or equal in rforth

This commit is contained in:
rmgr 2022-04-06 11:17:56 +09:30
parent 620bcfc951
commit c648adedd5
2 changed files with 26 additions and 18 deletions

View File

@ -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)

View File

@ -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 ;