ifte as definition; "fork" combinator.

This commit is contained in:
Simon Forman 2018-07-11 07:10:54 -07:00
parent d95b92314e
commit 0980d1b7c9
1 changed files with 33 additions and 29 deletions

View File

@ -71,7 +71,7 @@ ALIASES = (
('pred', ['--']), ('pred', ['--']),
('rolldown', ['roll<']), ('rolldown', ['roll<']),
('rollup', ['roll>']), ('rollup', ['roll>']),
('id', ['']), ('id', [u'']),
) )
@ -108,7 +108,8 @@ pam == [i] map
run == [] swap infra run == [] swap infra
sqr == dup mul sqr == dup mul
size == 0 swap [pop ++] step size == 0 swap [pop ++] step
cleave == [i] app2 [popd] dip fork == [i] app2
cleave == fork [popd] dip
average == [sum 1.0 *] [size] cleave / average == [sum 1.0 *] [size] cleave /
gcd == 1 [tuck modulus dup 0 >] loop pop gcd == 1 [tuck modulus dup 0 >] loop pop
least_fraction == dup [gcd] infra [div] concat map least_fraction == dup [gcd] infra [div] concat map
@ -124,8 +125,9 @@ primrec == [i] genrec
step_zero == 0 roll> step step_zero == 0 roll> step
codireco == cons dip rest cons codireco == cons dip rest cons
make_generator == [codireco] ccons make_generator == [codireco] ccons
ifte == [nullary not] dipd branch
''' '''
# ifte == [nullary not] dipd branch #
# ifte == [nullary] dipd swap branch # ifte == [nullary] dipd swap branch
# genrec == [[genrec] cons cons cons cons] nullary swons concat ifte # genrec == [[genrec] cons cons cons cons] nullary swons concat ifte
@ -477,6 +479,8 @@ def clear(stack):
'''Clear everything from the stack. '''Clear everything from the stack.
:: ::
clear == stack [pop stack] loop
... clear ... clear
--------------- ---------------
@ -958,32 +962,32 @@ def branch(stack, expression, dictionary):
return stack, concat(then if flag else else_, expression), dictionary return stack, concat(then if flag else else_, expression), dictionary
@inscribe ##@inscribe
@FunctionWrapper ##@FunctionWrapper
def ifte(stack, expression, dictionary): ##def ifte(stack, expression, dictionary):
''' ## '''
If-Then-Else Combinator ## If-Then-Else Combinator
:: ## ::
##
... [if] [then] [else] ifte ## ... [if] [then] [else] ifte
--------------------------------------------------- ## ---------------------------------------------------
... [[else] [then]] [...] [if] infra select i ## ... [[else] [then]] [...] [if] infra select i
##
##
##
##
... [if] [then] [else] ifte ## ... [if] [then] [else] ifte
------------------------------------------------------- ## -------------------------------------------------------
... [else] [then] [...] [if] infra first choice i ## ... [else] [then] [...] [if] infra first choice i
##
##
Has the effect of grabbing a copy of the stack on which to run the ## Has the effect of grabbing a copy of the stack on which to run the
if-part using infra. ## if-part using infra.
''' ## '''
(else_, (then, (if_, stack))) = stack ## (else_, (then, (if_, stack))) = stack
expression = (S_infra, (S_first, (S_choice, (S_i, expression)))) ## expression = (S_infra, (S_first, (S_choice, (S_i, expression))))
stack = (if_, (stack, (then, (else_, stack)))) ## stack = (if_, (stack, (then, (else_, stack))))
return stack, expression, dictionary ## return stack, expression, dictionary
@inscribe @inscribe