OSDN Git Service

Bringing over some of the "upgrades". 2
authorSimon Forman <sforman@hushmail.com>
Sun, 11 Sep 2022 21:07:55 +0000 (14:07 -0700)
committerSimon Forman <sforman@hushmail.com>
Sun, 11 Sep 2022 21:07:55 +0000 (14:07 -0700)
implementations/Python/joy/library.py
implementations/Python/simplejoy.py

index 6dd67d1..c39c164 100644 (file)
@@ -61,50 +61,6 @@ S_times = Symbol('times')
 
 
 
-
-@inscribe
-@FunctionWrapper
-def primrec(stack, expression, dictionary):
-    '''
-    From the "Overview of the language JOY":
-
-    > The primrec combinator expects two quoted programs in addition to a
-    data parameter. For an integer data parameter it works like this: If
-    the data parameter is zero, then the first quotation has to produce
-    the value to be returned. If the data parameter is positive then the
-    second has to combine the data parameter with the result of applying
-    the function to its predecessor.::
-
-        5  [1]  [*]  primrec
-
-    > Then primrec tests whether the top element on the stack (initially
-    the 5) is equal to zero. If it is, it pops it off and executes one of
-    the quotations, the [1] which leaves 1 on the stack as the result.
-    Otherwise it pushes a decremented copy of the top element and
-    recurses. On the way back from the recursion it uses the other
-    quotation, [*], to multiply what is now a factorial on top of the
-    stack by the second element on the stack.::
-
-        n [Base] [Recur] primrec
-
-           0 [Base] [Recur] primrec
-        ------------------------------
-              Base
-
-             n [Base] [Recur] primrec
-        ------------------------------------------ n > 0
-           n (n-1) [Base] [Recur] primrec Recur
-
-    '''
-    recur, (base, (n, stack)) = stack
-    if n <= 0:
-        expression = concat(base, expression)
-    else:
-        expression = S_primrec, concat(recur, expression)
-        stack = recur, (base, (n - 1, (n, stack)))
-    return stack, expression, dictionary
-
-
 #def cleave(S, expression, dictionary):
 #  '''
 #  The cleave combinator expects two quotations, and below that an item X.
index ebba95a..5453bba 100755 (executable)
@@ -1999,6 +1999,38 @@ def primrec(stack, expr, dictionary):
     return stack, expr, dictionary
 
 
+S_choice = Symbol('choice')
+S_i = Symbol('i')
+
+
+@inscribe
+def ifte(stack, expr, dictionary):
+    '''
+    If-Then-Else Combinator
+    ::
+
+                  ... [if] [then] [else] ifte
+       ---------------------------------------------------
+          ... [[else] [then]] [...] [if] infra select i
+
+
+
+
+                ... [if] [then] [else] ifte
+       -------------------------------------------------------
+          ... [else] [then] [...] [if] infra first choice i
+
+
+    Has the effect of grabbing a copy of the stack on which to run the
+    if-part using infra.
+    '''
+    else_, then, if_, stack = get_n_items(3, stack)
+    e = (S_infra, (S_first, (S_choice, (S_i, ()))))
+    expr = push_quote(e, expr)
+    stack = (if_, (stack, (then, (else_, stack))))
+    return stack, expr, dictionary
+
+
 if __name__ == '__main__':
     import sys
 
@@ -2009,5 +2041,5 @@ if __name__ == '__main__':
 ##        stack = J(dictionary=dictionary)
 ##    except SystemExit:
 ##        pass
-    stack, _ = run("5  [1]  [*]  primrec", (), dictionary)
+    stack, _ = run("5 10 [>][++][*]ifte", (), dictionary)
     print(stack_to_string(stack), '•')