#!./bicicleta_run_script
# A series of progressively more concise and readable versions of the
# factorial function, implemented the stupid way.
# {env: fac = {fac: x = 3,
#     '()' = fac.x.'<'{lt: arg1=2}.'()'.if_true{i: then=1, 
#          else=fac.x.'*'{mu: arg1=env.fac{f:
#             x=fac.x.'-'{m: arg1=1}.'()'}.'()'}.'()'}.'()'}}.fac{f: x = 4}.'()'
# (215 chars, counted without 8 comment chars present in later versions)
# This version also requires the ability to omit self-names:
# {env: fac = {fac: x = 3,
#     '()' = fac.x.'<'{arg1=2}.'()'.if_true{then=1, 
#          else=fac.x.'*'{arg1=env.fac{
#              x=fac.x.'-'{arg1=1}.'()'}.'()'}.'()'}.'()'}}.fac{x = 4}.'()'
# (196 chars, 17 chars shorter)
# This version also requires the .'()' sugar:
# {env: fac = {fac: x = 3, '()' = fac.x.'<'(arg1=2).if_true(then=1, 
#          else=fac.x.'*'(arg1=env.fac(x=fac.x.'-'(arg1=1))))}}.fac(x = 4)
# (144 chars, 52 chars shorter)
# This version also requires positional arguments:
# {env: fac = {fac: arg1 = 3, '()' = fac.arg1.'<'(2).if_true(then=1, 
#          else=fac.arg1.'*'(env.fac(fac.arg1.'-'(1))))}}.fac(4)
# (135 chars, 9 chars shorter)
# This version also requires infix syntax (and requires parens to work):
# {env: fac = {fac: arg1 = 3, '()' = (fac.arg1 < 2).if_true(then=1, 
#          else=fac.arg1 * env.fac(fac.arg1 - 1))}}.fac(4)
# (128 chars, 7 chars shorter)
# This version also requires separating definitions with newlines and
# tolerating them in other places:
{env: fac = {fac:
    arg1 = 3
    '()' = (fac.arg1 < 2).if_true(
        then = 1
        else = fac.arg1 * env.fac(fac.arg1 - 1)
     )
}}.fac(10)
# (162 chars, 34 chars longer)