You can certainly capture/"close over" the surrounding environment with any
Scala anonymous function.  So you can say quite correctly state that any
method accepting a function will accept a closure.

As to whether or not you must actually exercise this capability before
you're allowed to call it a closure - I guess that's a matter of semantics.

Going on the definition that you must "use it or lose it", then your
example is a closure, but probably not in the way you're thinking:

   - {y+= 1; println} is evaluated.  It adds one to y and returns a
   String=>Unit function
   - This function is then executed within the for(x <- 1 to 10)comprehension

At first glance, nothing is obviously captured from the surrounding
environment.  But... println is about as impure as you can get, working by
pure side effect; it has behaviour that depends very much on the
surrounding system.


Don't believe me?  Then try this:

def foo(): Unit = {
  var y = 0
  1 to 10 map {y+= 1; println}
  println(y)
}

foo()
System.setOut(someOtherPrintStream)
foo()




On 27 July 2012 14:30, Josh Berry <[email protected]> wrote:

> On Fri, Jul 27, 2012 at 8:32 AM, Ricky Clarkson
> <[email protected]> wrote:
> > 1 to 10 map { println("Yo"); println }
> >
> > Yo gets printed once, println happens 10 times.  Just because you're
> > providing a function doesn't mean you're in a closure.  If it was a
> closure
> > (and certain other magic happened to make it well-typed) you'd see Yo 10
> > times with a blank line between each.
>
> I'm lost.  A closure simply means it captures the local environment,
> right?  So:
>
> var y = 0
> 1 to 10 map {y+= 1; println}
> println(y)
>
> Now, I confess I am surprised that it appears this closure is called
> once to get a function from Int => Any.  I'm assuming it has always
> been this way in Scala?
>
> Of course, this does as expected, and looks similar.
>
> for (x <- 1 to 10) {y+=1; println("hello")}
>
> Is this is not a closure, as well?
>
>

-- 
You received this message because you are subscribed to the Google Groups "Java 
Posse" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/javaposse?hl=en.

Reply via email to