content: -- HIGHEST CHURCH NUMERAL REPRESENTABLE IN APPLESCRIPT ?
  
  -- (This should be a good proxy for recursion depth)
  
  on run
      script unrepresentable
          on |λ|(x)
              try
                  churchFromInt(x)
                  return false
              on error
                  return true
              end try
              x > 10
          end |λ|
      end script
  
      "The highest Church-encoded integer representable in Applescript is " & ¬
          (|until|(unrepresentable, my succ, 0) - 1)
  end run
  
  -- CHURCH NUMERALS ------------------------------------------------------
  
  -- chZero :: (a -> a) -> a -> a
  on chZero(f)
      script
          on |λ|(x)
              x
          end |λ|
      end script
  end chZero
  
  -- chSucc :: ((a -> a) -> a -> a) -> (a -> a) -> a -> a
  on chSucc(n)
      script
          on |λ|(f)
              script
                  property mf : mReturn(f)'s |λ|
                  on |λ|(x)
                      mf(mReturn(n)'s |λ|(mf)'s |λ|(x))
                  end |λ|
              end script
          end |λ|
      end script
  end chSucc
  
  -- churchFromInt :: Int -> (a -> a) -> a -> a
  on churchFromInt(x)
      script go
          on |λ|(i)
              if 0 < i then
                  chSucc(|λ|(i - 1))
              else
                  chZero
              end if
          end |λ|
      end script
      go's |λ|(x)
  end churchFromInt
  
  -- intFromChurch :: ((Int -> Int) -> Int -> Int) -> Int
  on intFromChurch(cn)
      mReturn(cn)'s |λ|(my succ)'s |λ|(0)
  end intFromChurch
  
  
  -- GENERIC FUNCTIONS ----------------------------------------
  
  -- until :: (a -> Bool) -> (a -> a) -> a -> a
  on |until|(p, f, x)
      set v to x
      set mp to mReturn(p)
      set mf to mReturn(f)
      repeat until mp's |λ|(v)
          set v to mf's |λ|(v)
      end repeat
  end |until|
  
  -- Lift 2nd class handler function into 1st class script wrapper
  -- mReturn :: First-class m => (a -> b) -> m (a -> b)
  on mReturn(f)
      if class of f is script then
          f
      else
          script
              property |λ| : f
          end script
      end if
  end mReturn
  
  -- succ :: Enum a => a -> a
  on succ(x)
      1 + x
  end succ
  