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