/*-------------------------------------------------------
 * functions.go
 *-------------------------------------------------------
 * Demonstrates that Go functions are lambdas
 * Jim Fawcett, CSE775 - Distributed Objects, Spring 2016
 *--------------------------------------------------------
 */
package main

import (
  "fmt"
)

/*---< creates and returns lambda >----------------------*/
/*
 *  returns lambda to be executed later
 *
 */
func createLambda1(left int) (func(int) int) {
  return func(right int) int {
    return (left + right)
  }
}
/*---< creates and returns lambda with capture >---------*/
/*
 *  returns lambda and the value of its capture
 *
 */
func createLambda2() (func(int) int, int) {
  var left = 7  // captured value
  return func(right int) int {
    return (left + right)
  }, left
}

func main() {
  x, y := 3, 5
  sum := createLambda1(x)(y)
  fmt.Printf("\n  sum of %v and %v is %v", x, y, sum)

  g, left := createLambda2()
  fmt.Printf("\n  sum of %v and 5 is %v\n", left, g(5))
}