tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

lambda.tri (1880B)


      1 !import prelude *
      2 !export *
      3 -- Like-for-like behavior baseline: ordinary tricu lambdas, compact phase
      4 -- state, input numbers, output values, and a dynamic map worker.
      5 
      6 count2 = 2
      7 count4 = 4
      8 countdownTail count = pred_ count
      9 
     10 -- Consumed input precedes state; every branch that recurses is suspended.
     11 lambdaFizzBuzz_ self xs state =
     12   lazyList
     13     (_ : t)
     14     (n rest :
     15       matchPair (a b :
     16         lazyBool
     17           (_ : lazyBool
     18             (_ : pair "FizzBuzz" (self rest (pair count2 count4)))
     19             (_ : pair "Fizz" (self rest (pair count2 (countdownTail b))))
     20             (isZero_? b))
     21           (_ : lazyBool
     22             (_ : pair "Buzz" (self rest (pair (countdownTail a) count4)))
     23             (_ : pair n (self rest (pair (countdownTail a) (countdownTail b))))
     24             (isZero_? b))
     25           (isZero_? a))
     26       state)
     27     xs
     28 lambdaFizzBuzz xs = y lambdaFizzBuzz_ xs (pair count2 count4)
     29 
     30 -- This worker is supplied at invocation, rather than closed over by map.
     31 lambdaMap_ self xs worker =
     32   lazyList (_ : t) (x rest : pair (worker x) (self rest worker)) xs
     33 lambdaMap worker xs = y lambdaMap_ xs worker
     34 lambdaIdentity x = x
     35 lambdaLiteral _ = "Fizz"
     36 lambdaExcited _ = "Fizz!"
     37 
     38 input = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15]
     39 expected = [1 2 "Fizz" 4 "Buzz" "Fizz" 7 8 "Fizz" "Buzz" 11 "Fizz" 13 14 "FizzBuzz"]
     40 
     41 fizzbuzzMatches = equal? (lambdaFizzBuzz input) expected
     42 emptyMatches = equal? (lambdaFizzBuzz t) t
     43 mapIdentityMatches = equal? (lambdaMap lambdaIdentity [7 8 9]) [7 8 9]
     44 mapLiteralMatches = equal? (lambdaMap lambdaLiteral [7 8 9]) ["Fizz" "Fizz" "Fizz"]
     45 mapExcitedMatches = equal? (lambdaMap lambdaExcited [7 8 9]) ["Fizz!" "Fizz!" "Fizz!"]
     46 allChecks = and? fizzbuzzMatches (and? emptyMatches (and? mapIdentityMatches (and? mapLiteralMatches mapExcitedMatches)))
     47 main = lazyBool (_ : "lambda-baseline-ok") (_ : "lambda-baseline-failed") allChecks