24 KiB
24 KiB
In [1]:
from notebook_preamble import D, DefinitionWrapper, J, V, defineIn [2]:
def hylomorphism(c, F, P, G):
'''Return a hylomorphism function H.'''
def H(a):
if P(a):
result = c
else:
b, aa = G(a)
result = F(b, H(aa)) # b is stored in the stack frame during recursive call to H().
return result
return HIn [3]:
define('hylomorphism == [unit [pop] swoncat] dipd [dip] swoncat genrec')In [4]:
define('triangular_number == [1 <=] 0 [-- dup] [+] hylomorphism')In [5]:
J('5 triangular_number')10
In [6]:
J('[0 1 2 3 4 5 6] [triangular_number] map')[0 0 1 3 6 10 15]
In [7]:
define('range == [0 <=] [] [-- dup] [swons] hylomorphism')In [8]:
J('5 range')[4 3 2 1 0]
In [9]:
define('range_reverse == [] swap [0 <=] [pop] [-- dup [swons] dip] primrec')In [10]:
J('5 range_reverse')[0 1 2 3 4]
In [11]:
define('ranger == [0 <=] [pop []] [[--] dupdip] [dip swons] genrec')In [12]:
J('5 ranger')[5 4 3 2 1]
In [13]:
define('ranger_reverse == [] swap [0 <=] [pop] [[swons] dupdip --] primrec')In [14]:
J('5 ranger_reverse')[1 2 3 4 5]
In [15]:
define('swuncons == uncons swap') # Awkward name.In [16]:
define('sum == [not] 0 [swuncons] [+] hylomorphism')In [17]:
J('[5 4 3 2 1] sum')15
In [18]:
J('[step] help')Run a quoted program on each item in a sequence.
::
... [] [Q] . step
-----------------------
... .
... [a] [Q] . step
------------------------
... a . Q
... [a b c] [Q] . step
----------------------------------------
... a . Q [b c] [Q] step
The step combinator executes the quotation on each member of the list
on top of the stack.
In [19]:
define('sum == 0 swap [+] step')In [20]:
J('[5 4 3 2 1] sum')15
In [21]:
define('factorial == 1 swap [1 <=] [pop] [[*] dupdip --] primrec')In [22]:
J('5 factorial')120
In [23]:
define('tails == [] swap [not] [pop] [rest dup [swons] dip] primrec')In [24]:
J('[1 2 3] tails')[[] [3] [2 3]]