• DoctypeDeclaration{http://etl.sf.net/etl/doctype/0.2.1}:
    • systemId: "calculator-lambda-0_2_1.g.etl"
  • IncludeStatement{http://etl.sf.net/samples/calculator}:
    • systemId: "prelude-logic.c.etl"
  • VarStatement{http://etl.sf.net/samples/calculator/vars}:
    • documentation:
      • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
        • text: /// The construct lazy value from the lambda abstraction
      • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
        • text: ///
      • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
        • text: /// @param f the function
      • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
        • text: /// @return the function that remembers the result invocation of
      • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
        • text: /// the function without arguments
    • type: let
    • name:
      • Name{http://etl.sf.net/samples/calculator/vars}:
        • quoted: q'&'
    • value:
      • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
        • statements:
          • BlockParameters{http://etl.sf.net/samples/calculator/lambda}:
            • parameters:
              • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                • type: var
                • name:
                  • Name{http://etl.sf.net/samples/calculator/vars}:
                    • literal: f
          • AssertStatement{http://etl.sf.net/samples/calculator/logic}:
            • condition:
              • NotEqual{http://etl.sf.net/samples/calculator/logic}:
                • first:
                  • Name{http://etl.sf.net/samples/calculator/vars}:
                    • literal: f
                • second:
                  • Name{http://etl.sf.net/samples/calculator/vars}:
                    • literal: null
          • VarStatement{http://etl.sf.net/samples/calculator/vars}:
            • type: var
            • name:
              • Name{http://etl.sf.net/samples/calculator/vars}:
                • literal: value
          • ExpressionStatement{http://etl.sf.net/samples/calculator}:
            • value:
              • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                • statements:
                  • BlockParameters{http://etl.sf.net/samples/calculator/lambda}:
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • IfExpression{http://etl.sf.net/samples/calculator/logic}:
                          • condition:
                            • NotEqual{http://etl.sf.net/samples/calculator/logic}:
                              • first:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: f
                              • second:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: null
                          • thenPart:
                            • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                              • statements:
                                • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                                  • value:
                                    • Assignment{http://etl.sf.net/samples/calculator/vars}:
                                      • first:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: value
                                      • second:
                                        • Apply{http://etl.sf.net/samples/calculator/lambda}:
                                          • function:
                                            • Name{http://etl.sf.net/samples/calculator/vars}:
                                              • literal: f
                                • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                                  • value:
                                    • Assignment{http://etl.sf.net/samples/calculator/vars}:
                                      • first:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: f
                                      • second:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: null
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: value
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// The implementation of NotEqualDeref operator
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • quoted: q'!*='
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: y
              • value:
                • NotEqual{http://etl.sf.net/samples/calculator/logic}:
                  • first:
                    • Dereference{http://etl.sf.net/samples/calculator/lambda}:
                      • value:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: x
                  • second:
                    • Dereference{http://etl.sf.net/samples/calculator/lambda}:
                      • value:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: y
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// The implementation of EqualDeref operator
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • quoted: q'=*='
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: y
              • value:
                • Equal{http://etl.sf.net/samples/calculator/logic}:
                  • first:
                    • Dereference{http://etl.sf.net/samples/calculator/lambda}:
                      • value:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: x
                  • second:
                    • Dereference{http://etl.sf.net/samples/calculator/lambda}:
                      • value:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: y
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// The maximum value (works for comparable objects)
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: max
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: y
              • value:
                • IfExpression{http://etl.sf.net/samples/calculator/logic}:
                  • condition:
                    • LessThen{http://etl.sf.net/samples/calculator/logic}:
                      • first:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: x
                      • second:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: y
                  • thenPart:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: y
                  • elsePart:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// The minimum value (works for comparable objects)
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: min
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: y
              • value:
                • IfExpression{http://etl.sf.net/samples/calculator/logic}:
                  • condition:
                    • LessThen{http://etl.sf.net/samples/calculator/logic}:
                      • first:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: x
                      • second:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: y
                  • thenPart:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
                  • elsePart:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: y
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// Ensure that the number in the range of integer values.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param x the number to check
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @return itself (to allows variable arguments)
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: assertIntRange
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
              • value:
                • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                  • statements:
                    • AssertStatement{http://etl.sf.net/samples/calculator/logic}:
                      • condition:
                        • ConditionalAnd{http://etl.sf.net/samples/calculator/logic}:
                          • first:
                            • LessOrEqual{http://etl.sf.net/samples/calculator/logic}:
                              • first:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: MIN_INTEGER
                              • second:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: x
                          • second:
                            • LessOrEqual{http://etl.sf.net/samples/calculator/logic}:
                              • first:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: x
                              • second:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: MAX_INTEGER
                      • message:
                        • Plus{http://etl.sf.net/samples/calculator/arith}:
                          • first:
                            • StringLiteral{http://etl.sf.net/samples/calculator}:
                              • value: "The value is "
                          • second:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: assertIntRange
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// Ensure that the number is the integer (there is no fractional pat).
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param x the number to check
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @return itself (to allows variable arguments)
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: assertInt
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
              • value:
                • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                  • statements:
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Apply{http://etl.sf.net/samples/calculator/lambda}:
                          • function:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: assertIntRange
                          • arguments:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                    • AssertStatement{http://etl.sf.net/samples/calculator/logic}:
                      • condition:
                        • Equal{http://etl.sf.net/samples/calculator/logic}:
                          • first:
                            • Remainder{http://etl.sf.net/samples/calculator/arith}:
                              • first:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: x
                              • second:
                                • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                  • value: 1
                          • second:
                            • NumberLiteral{http://etl.sf.net/samples/calculator}:
                              • value: 0
                      • message:
                        • Plus{http://etl.sf.net/samples/calculator/arith}:
                          • first:
                            • StringLiteral{http://etl.sf.net/samples/calculator}:
                              • value: "The value is "
                          • second:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: assertInt
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// Ensure that the number is the non-negative integer.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param x the number to check
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @return itself (to allows variable arguments)
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: assertNonNegativeInt
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
              • value:
                • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                  • statements:
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Apply{http://etl.sf.net/samples/calculator/lambda}:
                          • function:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: assertInt
                          • arguments:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                    • AssertStatement{http://etl.sf.net/samples/calculator/logic}:
                      • condition:
                        • MoreOrEqual{http://etl.sf.net/samples/calculator/logic}:
                          • first:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                          • second:
                            • NumberLiteral{http://etl.sf.net/samples/calculator}:
                              • value: 0
                      • message:
                        • Plus{http://etl.sf.net/samples/calculator/arith}:
                          • first:
                            • StringLiteral{http://etl.sf.net/samples/calculator}:
                              • value: "The value is "
                          • second:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: assertNonNegativeInt
    • VarStatement{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// The factorial value
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: ///
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param n the non-negative integer value
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @return the factorial result
      • type: let
      • name:
        • Name{http://etl.sf.net/samples/calculator/vars}:
          • literal: factorial
      • value:
        • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
          • statements:
            • BlockParameters{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: n
            • ExpressionStatement{http://etl.sf.net/samples/calculator}:
              • value:
                • Apply{http://etl.sf.net/samples/calculator/lambda}:
                  • function:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: assertNonNegativeInt
                  • arguments:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: n
            • LetRec{http://etl.sf.net/samples/calculator/vars}:
              • definitions:
                • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: fac
                  • value:
                    • Lambda{http://etl.sf.net/samples/calculator/lambda}:
                      • parameters:
                        • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                          • name:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                      • value:
                        • Match{http://etl.sf.net/samples/calculator/logic}:
                          • value:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                          • selectors:
                            • CasePart{http://etl.sf.net/samples/calculator/logic}:
                              • selector:
                                • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                  • value: 0
                              • value:
                                • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                  • value: 1
                            • ElsePart{http://etl.sf.net/samples/calculator/logic}:
                              • value:
                                • Multiply{http://etl.sf.net/samples/calculator/arith}:
                                  • first:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: x
                                  • second:
                                    • Apply{http://etl.sf.net/samples/calculator/lambda}:
                                      • function:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: fac
                                      • arguments:
                                        • Minus{http://etl.sf.net/samples/calculator/arith}:
                                          • first:
                                            • Name{http://etl.sf.net/samples/calculator/vars}:
                                              • literal: x
                                          • second:
                                            • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                              • value: 1
            • ExpressionStatement{http://etl.sf.net/samples/calculator}:
              • value:
                • Apply{http://etl.sf.net/samples/calculator/lambda}:
                  • function:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: fac
                  • arguments:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: n
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • documentation:
            • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
              • text: /// Odd number check
            • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
              • text: ///
            • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
              • text: /// @param x a non-negative integer number
            • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
              • text: /// @return true for odd numbers, false for even ones
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: is_odd
          • value:
            • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
              • statements:
                • BlockParameters{http://etl.sf.net/samples/calculator/lambda}:
                  • parameters:
                    • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                      • name:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: x
                • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                  • value:
                    • Apply{http://etl.sf.net/samples/calculator/lambda}:
                      • function:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: assertNonNegativeInt
                      • arguments:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: x
                • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                  • value:
                    • ConditionalAnd{http://etl.sf.net/samples/calculator/logic}:
                      • first:
                        • NotEqual{http://etl.sf.net/samples/calculator/logic}:
                          • first:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                          • second:
                            • NumberLiteral{http://etl.sf.net/samples/calculator}:
                              • value: 0
                      • second:
                        • LogicalNot{http://etl.sf.net/samples/calculator/logic}:
                          • value:
                            • Apply{http://etl.sf.net/samples/calculator/lambda}:
                              • function:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: is_even
                              • arguments:
                                • Minus{http://etl.sf.net/samples/calculator/arith}:
                                  • first:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: x
                                  • second:
                                    • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                      • value: 1
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • documentation:
            • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
              • text: /// Even number check
            • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
              • text: ///
            • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
              • text: /// @param x a non-negative integer number
            • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
              • text: /// @return false for odd numbers, true for even ones
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: is_even
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: x
              • value:
                • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                  • statements:
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Apply{http://etl.sf.net/samples/calculator/lambda}:
                          • function:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: assertNonNegativeInt
                          • arguments:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: x
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • ConditionalOr{http://etl.sf.net/samples/calculator/logic}:
                          • first:
                            • Equal{http://etl.sf.net/samples/calculator/logic}:
                              • first:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: x
                              • second:
                                • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                  • value: 0
                          • second:
                            • Apply{http://etl.sf.net/samples/calculator/lambda}:
                              • function:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: is_odd
                              • arguments:
                                • Minus{http://etl.sf.net/samples/calculator/arith}:
                                  • first:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: x
                                  • second:
                                    • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                      • value: 1
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// Repeats execution of the one argument function from low to high
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// adding +1 on each step until the resulting value will be higher then
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// high. The example below will print numbers 1.5, 2.5, 3.5, and 4.5.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// {@example
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// 1.5 #upto 5 {?i;
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// print i;
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// }; }
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: ///
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// If the high value is greater then the low value, the cycle is never executed.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: ///
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param low the start value for the loop (must be in integer range)
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param high the limit value for the loop (must be in integer range)
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param f the closure to use for the loop.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// If it returns false, the cycle is aborted,
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// all other values are ignored.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @return null value
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: upto
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • type: var
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: low
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: high
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: f
              • value:
                • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                  • statements:
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Apply{http://etl.sf.net/samples/calculator/lambda}:
                          • function:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: assertIntRange
                          • arguments:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: low
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: high
                    • WhileStatement{http://etl.sf.net/samples/calculator/logic}:
                      • condition:
                        • ConditionalAnd{http://etl.sf.net/samples/calculator/logic}:
                          • first:
                            • LessThen{http://etl.sf.net/samples/calculator/logic}:
                              • first:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: low
                              • second:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: high
                          • second:
                            • NotEqual{http://etl.sf.net/samples/calculator/logic}:
                              • first:
                                • Apply{http://etl.sf.net/samples/calculator/lambda}:
                                  • function:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: f
                                  • arguments:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: low
                              • second:
                                • BooleanLiteral{http://etl.sf.net/samples/calculator}:
                                  • value: false
                      • body:
                        • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                          • statements:
                            • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                              • value:
                                • Assignment{http://etl.sf.net/samples/calculator/vars}:
                                  • first:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: low
                                  • second:
                                    • Plus{http://etl.sf.net/samples/calculator/arith}:
                                      • first:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: low
                                      • second:
                                        • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                          • value: 1
    • LetRec{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// Repeats execution of the one argument function from start to limit
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// adding step on each step until the resulting value will be higher or lower then
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// limit (the direction depends on step's sign).
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// {@example
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// for(5,1,-0.125) {?i;
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// print i;
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// }; }
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: ///
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// If the high value is greater then the low value, the cycle is never executed.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: ///
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param start the start value for the loop (start/step must be in integer range)
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param limit the limit value for the loop (limit/step must be in integer range)
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param step the loop step (must ot be 0)
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param f the closure to use for the loop.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// If it returns false, the cycle is aborted,
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// all other values are ignored.
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @return null value
      • definitions:
        • LetRecPart{http://etl.sf.net/samples/calculator/vars}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: for
          • value:
            • Lambda{http://etl.sf.net/samples/calculator/lambda}:
              • parameters:
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • type: var
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: start
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: limit
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: step
                • Parameter{http://etl.sf.net/samples/calculator/lambda}:
                  • name:
                    • Name{http://etl.sf.net/samples/calculator/vars}:
                      • literal: f
              • value:
                • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                  • statements:
                    • AssertStatement{http://etl.sf.net/samples/calculator/logic}:
                      • condition:
                        • NotEqual{http://etl.sf.net/samples/calculator/logic}:
                          • first:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: step
                          • second:
                            • NumberLiteral{http://etl.sf.net/samples/calculator}:
                              • value: 0
                    • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                      • value:
                        • Apply{http://etl.sf.net/samples/calculator/lambda}:
                          • function:
                            • Name{http://etl.sf.net/samples/calculator/vars}:
                              • literal: assertIntRange
                          • arguments:
                            • Divide{http://etl.sf.net/samples/calculator/arith}:
                              • first:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: start
                              • second:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: step
                            • Divide{http://etl.sf.net/samples/calculator/arith}:
                              • first:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: start
                              • second:
                                • Name{http://etl.sf.net/samples/calculator/vars}:
                                  • literal: step
                    • WhileStatement{http://etl.sf.net/samples/calculator/logic}:
                      • condition:
                        • ConditionalAnd{http://etl.sf.net/samples/calculator/logic}:
                          • first:
                            • Identity{http://etl.sf.net/samples/calculator}:
                              • value:
                                • IfExpression{http://etl.sf.net/samples/calculator/logic}:
                                  • condition:
                                    • MoreThen{http://etl.sf.net/samples/calculator/logic}:
                                      • first:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: step
                                      • second:
                                        • NumberLiteral{http://etl.sf.net/samples/calculator}:
                                          • value: 0
                                  • thenPart:
                                    • LessThen{http://etl.sf.net/samples/calculator/logic}:
                                      • first:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: start
                                      • second:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: limit
                                  • elsePart:
                                    • MoreThen{http://etl.sf.net/samples/calculator/logic}:
                                      • first:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: start
                                      • second:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: limit
                          • second:
                            • NotEqual{http://etl.sf.net/samples/calculator/logic}:
                              • first:
                                • Apply{http://etl.sf.net/samples/calculator/lambda}:
                                  • function:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: f
                                  • arguments:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: start
                              • second:
                                • BooleanLiteral{http://etl.sf.net/samples/calculator}:
                                  • value: false
                      • body:
                        • LambdaSequence{http://etl.sf.net/samples/calculator/lambda}:
                          • statements:
                            • ExpressionStatement{http://etl.sf.net/samples/calculator}:
                              • value:
                                • Assignment{http://etl.sf.net/samples/calculator/vars}:
                                  • first:
                                    • Name{http://etl.sf.net/samples/calculator/vars}:
                                      • literal: start
                                  • second:
                                    • Plus{http://etl.sf.net/samples/calculator/arith}:
                                      • first:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: start
                                      • second:
                                        • Name{http://etl.sf.net/samples/calculator/vars}:
                                          • literal: step
    • VarStatement{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// Convert Java number to integer
      • annotations:
        • Annotation{http://etl.sf.net/samples/calculator/meta}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: JavaMethod
          • arguments:
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "java.lang.Number"
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "intValue"
      • type: let
      • name:
        • Name{http://etl.sf.net/samples/calculator/vars}:
          • literal: toInt
    • VarStatement{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// Convert a value to string
      • annotations:
        • Annotation{http://etl.sf.net/samples/calculator/meta}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: JavaMethod
          • arguments:
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "java.lang.Object"
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "toString"
      • type: let
      • name:
        • Name{http://etl.sf.net/samples/calculator/vars}:
          • literal: str
    • VarStatement{http://etl.sf.net/samples/calculator/vars}:
      • annotations:
        • Annotation{http://etl.sf.net/samples/calculator/meta}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: JavaMethod
          • arguments:
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "java.lang.Math"
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "abs"
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "double"
      • type: let
      • name:
        • Name{http://etl.sf.net/samples/calculator/vars}:
          • literal: abs
    • VarStatement{http://etl.sf.net/samples/calculator/vars}:
      • annotations:
        • Annotation{http://etl.sf.net/samples/calculator/meta}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: JavaMethod
          • arguments:
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "java.lang.Math"
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "sin"
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "double"
      • type: let
      • name:
        • Name{http://etl.sf.net/samples/calculator/vars}:
          • literal: sin
    • VarStatement{http://etl.sf.net/samples/calculator/vars}:
      • annotations:
        • Annotation{http://etl.sf.net/samples/calculator/meta}:
          • name:
            • Name{http://etl.sf.net/samples/calculator/vars}:
              • literal: JavaMethod
          • arguments:
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "java.lang.Math"
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "cos"
            • StringLiteral{http://etl.sf.net/samples/calculator}:
              • value: "double"
      • type: let
      • name:
        • Name{http://etl.sf.net/samples/calculator/vars}:
          • literal: cos
    • VarStatement{http://etl.sf.net/samples/calculator/vars}:
      • documentation:
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// Sign of the number
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: ///
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @param x the floating point number to check
        • DocumentationLine{http://etl.sf.net/samples/calculator/meta}:
          • text: /// @return -1, 0, or 1 depending on th sing of the number
      • type: let
      • name:
        • Name{http://etl.sf.net/samples/calculator/vars}:
          • literal: sign
      • value:
        • Lambda{http://etl.sf.net/samples/calculator/lambda}:
          • parameters:
            • Parameter{http://etl.sf.net/samples/calculator/lambda}:
              • name:
                • Name{http://etl.sf.net/samples/calculator/vars}:
                  • literal: x
          • value:
            • Select{http://etl.sf.net/samples/calculator/logic}:
              • selectors:
                • CasePart{http://etl.sf.net/samples/calculator/logic}:
                  • selector:
                    • LessThen{http://etl.sf.net/samples/calculator/logic}:
                      • first:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: x
                      • second:
                        • NumberLiteral{http://etl.sf.net/samples/calculator}:
                          • value: 0
                  • value:
                    • UnaryMinus{http://etl.sf.net/samples/calculator/arith}:
                      • value:
                        • NumberLiteral{http://etl.sf.net/samples/calculator}:
                          • value: 1
                • CasePart{http://etl.sf.net/samples/calculator/logic}:
                  • selector:
                    • MoreThen{http://etl.sf.net/samples/calculator/logic}:
                      • first:
                        • Name{http://etl.sf.net/samples/calculator/vars}:
                          • literal: x
                      • second:
                        • NumberLiteral{http://etl.sf.net/samples/calculator}:
                          • value: 0
                  • value:
                    • NumberLiteral{http://etl.sf.net/samples/calculator}:
                      • value: 1
                • ElsePart{http://etl.sf.net/samples/calculator/logic}:
                  • value:
                    • NumberLiteral{http://etl.sf.net/samples/calculator}:
                      • value: 0
         1: doctype "calculator-lambda-0_2_1.g.etl";
         2: include "prelude-logic.c.etl";
         3: 
         4: /// The construct lazy value from the lambda abstraction
         5: ///
         6: /// @param f the function
         7: /// @return the function that remembers the result invocation of 
         8: ///         the function without arguments 
         9: let q'&' = {? var f;
        10:     assert f != null;
        11:     var value;
        12:     {?;
        13:         if(f != null) {
        14:             value = f();
        15:             f = null;
        16:         };
        17:         value;
        18:     };
        19: };
        20: /// The implementation of NotEqualDeref operator
        21: to q'!*='(x, y) =>  * x != * y;
        22: /// The implementation of EqualDeref operator
        23: to q'=*='(x, y) =>  * x == * y;
        24: 
        25: /// The maximum value (works for comparable objects)
        26: to max(x, y) => x < y ? y : x;
        27: /// The minimum value (works for comparable objects)
        28: to min(x, y) => x < y ? x : y;
        29: 
        30: /// Ensure that the number in the range of integer values.
        31: /// @param x the number to check
        32: /// @return itself (to allows variable arguments) 
        33: to assertIntRange(x) => {
        34:     assert MIN_INTEGER <= x && x <= MAX_INTEGER : "The value is "+x;
        35:     assertIntRange;
        36: };
        37: 
        38: /// Ensure that the number is the integer (there is no fractional pat).
        39: /// @param x the number to check 
        40: /// @return itself (to allows variable arguments) 
        41: to assertInt(x) => {
        42:     assertIntRange(x);
        43:     assert x % 1 == 0 : "The value is "+x;
        44:     assertInt;
        45: };
        46: 
        47: /// Ensure that the number is the non-negative integer.
        48: /// @param x the number to check 
        49: /// @return itself (to allows variable arguments) 
        50: to assertNonNegativeInt(x) => {
        51:     assertInt(x);
        52:     assert x >= 0 : "The value is "+x;
        53:     assertNonNegativeInt;
        54: };
        55: 
        56: /// The factorial value
        57: ///
        58: /// @param n the non-negative integer value
        59: /// @return the factorial result
        60: let factorial = {?n;
        61:     assertNonNegativeInt(n);
        62:     to fac(x) => x match { 0 => 1; else x * fac(x-1); };
        63:     fac(n);
        64: };
        65: 
        66: letrec {
        67:     /// Odd number check
        68:     /// 
        69:     /// @param x a non-negative integer number
        70:     /// @return true for odd numbers, false for even ones
        71:     is_odd = {?x; assertNonNegativeInt(x); x != 0 && !is_even(x-1);};
        72:     /// Even number check
        73:     /// 
        74:     /// @param x a non-negative integer number
        75:     /// @return false for odd numbers, true for even ones
        76:     to is_even(x) => {assertNonNegativeInt(x); x == 0 || is_odd(x-1);};
        77: };
        78: 
        79: /// Repeats execution of the one argument function from low to high
        80: /// adding +1 on each step until the resulting value will be higher then
        81: /// high. The example below will print numbers 1.5, 2.5, 3.5, and 4.5.
        82: /// {@example
        83: ///   1.5 #upto 5 {?i;
        84: ///      print i;
        85: ///   }; }
        86: /// 
        87: /// If the high value is greater then the low value, the cycle is never executed.
        88: ///
        89: /// @param low the start value for the loop (must be in integer range)
        90: /// @param high the limit value for the loop (must be in integer range)
        91: /// @param f the closure to use for the loop. 
        92: ///          If it returns false, the cycle is aborted, 
        93: ///          all other values are ignored.
        94: /// @return null value
        95: to upto(var low, high, f) => {
        96:     assertIntRange(low, high);
        97:     while(low<high && f(low) != false) {
        98:         low = low + 1;
        99:     };
       100: };
       101: 
       102: /// Repeats execution of the one argument function from start to limit
       103: /// adding step on each step until the resulting value will be higher or lower then
       104: /// limit (the direction depends on step's sign). 
       105: /// {@example
       106: ///   for(5,1,-0.125) {?i;
       107: ///      print i;
       108: ///   }; }
       109: /// 
       110: /// If the high value is greater then the low value, the cycle is never executed.
       111: ///
       112: /// @param start the start value for the loop (start/step must be in integer range)
       113: /// @param limit the limit value for the loop (limit/step must be in integer range)
       114: /// @param step the loop step (must ot be 0)
       115: /// @param f the closure to use for the loop. 
       116: ///          If it returns false, the cycle is aborted, 
       117: ///          all other values are ignored.
       118: /// @return null value
       119: to for(var start, limit, step, f) => {
       120:     assert step != 0;
       121:     assertIntRange(start/step, start/step);
       122:     while((step > 0 ? start<limit : start>limit) && f(start) != false) {
       123:         start = start + step;
       124:     };
       125: };
       126: 
       127: /// Convert Java number to integer
       128: @JavaMethod("java.lang.Number", "intValue")
       129: let toInt;
       130: 
       131: /// Convert a value to string
       132: @JavaMethod("java.lang.Object", "toString")
       133: let str;
       134: 
       135: @JavaMethod("java.lang.Math", "abs", "double")
       136: let abs;
       137: 
       138: @JavaMethod("java.lang.Math", "sin", "double")
       139: let sin;
       140: 
       141: @JavaMethod("java.lang.Math", "cos", "double")
       142: let cos;
       143: 
       144: /// Sign of the number
       145: ///
       146: /// @param x the floating point number to check
       147: /// @return -1, 0, or 1 depending on th sing of the number
       148: let sign = \x => select { x < 0 => -1; x > 0 => 1; else 0; };