-- PAIR definition pair := [x y | [z | z x y]]; car := [pair | pair [x y | x]]; cdr := [pair | pair [x y | y]]; x := pair 100 200; say (car x); say (cdr x); -- LIST definition null := pair true true; is_empty := car; head := [list | car (cdr list)]; tail := [list | cdr (cdr list)]; cons := [head tail | pair false (pair head tail)]; for_each := [list iterator | if (is_empty list) [ nil ] [ iterator (head list); for_each (tail list) iterator ]]; map := [list iterator | if (is_empty list) [ null ] [| cons (iterator (head list)) (map (tail list) iterator) ]]; foldr := [list init folder | if (is_empty list) [ init ] [ foldr (tail list) (folder (head list) init) folder ]]; range := [start stop | if (start >= stop) [cons start null] [cons start (range (start+1) stop)]]; xs := range 1 5; say (foldr xs 1 [x y|x*y]);