From: Simon Forman Date: Sun, 11 Sep 2022 21:07:55 +0000 (-0700) Subject: Bringing over some of the "upgrades". 2 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=a2cabe21897d441484646a03ae44c17196e312f0;p=joypy%2FThun.git Bringing over some of the "upgrades". 2 --- diff --git a/implementations/Python/joy/library.py b/implementations/Python/joy/library.py index 6dd67d1..c39c164 100644 --- a/implementations/Python/joy/library.py +++ b/implementations/Python/joy/library.py @@ -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. diff --git a/implementations/Python/simplejoy.py b/implementations/Python/simplejoy.py index ebba95a..5453bba 100755 --- a/implementations/Python/simplejoy.py +++ b/implementations/Python/simplejoy.py @@ -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), '•')