Continuation behavior

39 views
Skip to first unread message

Meredith Gregory

unread,
Dec 29, 2011, 4:29:15 PM12/29/11
to scala-user, Tiark Rompf
Dear Continually Scala,

Here's a little snippet of code that captures continuations
  • as an in-memory representation, and
  • as a serialized representation
The two different captures give different behaviors because they capture different environments. Here's a trace to illustrate:

Welcome to Scala version 2.9.0.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_29).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :load /Users/lgm/work/src/projex/stellar/mdp4tw/SpecialK.SDEC/scripts/k.scala
cala
Loading /Users/lgm/work/src/projex/stellar/mdp4tw/SpecialK.SDEC/scripts/k.scala...
import scala.collection.mutable.HashMap
import scala.util.continuations._
import com.thoughtworks.xstream.XStream
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver
import biz.source_code.base64Coder.Base64Coder
import java.io.ObjectInputStream
import java.io.ByteArrayInputStream
import java.io.ObjectOutputStream
import java.io.ByteArrayOutputStream
defined module ObjectToString
defined module OK

scala> val ksmap1 = new HashMap[String,String]( )  
val ksmap1 = new HashMap[String,String]( )  
ksmap1: scala.collection.mutable.HashMap[String,String] = Map()

scala> val kmap1 = new HashMap[String,(String => Unit)]( )  
val kmap1 = new HashMap[String,(String => Unit)]( )  
kmap1: scala.collection.mutable.HashMap[String,(String) => Unit] = Map()

scala> OK.coral( false )( kmap1, ksmap1, "Erp" )
OK.coral( false )( kmap1, ksmap1, "Erp" )
continuation as string: rO0ABXNyAEdzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHQkJGFub25mdW4kbWFwJDIkJGFub25mdW4kYXBwbHkkMQAAAAAAAAAAAgADTAAGJG91dGVydAA4THNjYWxhL3V0aWwvY29udGludWF0aW9ucy9Db250cm9sQ29udGV4dCQkYW5vbmZ1biRtYXAkMjtMAANrJDF0ABFMc2NhbGEvRnVuY3Rpb24xO0wABXRociQxcQB+AAJ4cHNyADZzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHQkJGFub25mdW4kbWFwJDIAAAAAAAAAAAIAAkwABiRvdXRlcnQAKUxzY2FsYS91dGlsL2NvbnRpbnVhdGlvbnMvQ29udHJvbENvbnRleHQ7TAADZiQxcQB+AAJ4cHNyACdzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHTbw+rG97imMwIAAkwAA2Z1bnQAEUxzY2FsYS9GdW5jdGlvbjI7TAABeHQAEkxqYXZhL2xhbmcvT2JqZWN0O3hwc3IAMnNjYWxhLnV0aWwuY29udGludWF0aW9ucy5wYWNrYWdlJCRhbm9uZnVuJHNoaWZ0UiQxAAAAAAAAAAACAAFMAAVmdW4kMXEAfgACeHBzcgBCJGxpbmUxMS4kcmVhZCQkaXckJGl3JCRpdyQkaXckT0skJGFub25mdW4kY29yYWwkMSQkYW5vbmZ1biRhcHBseSQxAAAAAAAAAAACAAFMAAYkb3V0ZXJ0ADNMJGxpbmUxMS8kcmVhZCQkaXckJGl3JCRpdyQkaXckT0skJGFub25mdW4kY29yYWwkMTt4cHNyADEkbGluZTExLiRyZWFkJCRpdyQkaXckJGl3JCRpdyRPSyQkYW5vbmZ1biRjb3JhbCQxAAAAAAAAAAACAARaAAx1c2VYU3RyZWFtJDFMAAVrZXkkMXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wABmttYXAkMXQAIkxzY2FsYS9jb2xsZWN0aW9uL211dGFibGUvSGFzaE1hcDtMAAdrc21hcCQxcQB+ABJ4cAB0AANFcnBzcgAgc2NhbGEuY29sbGVjdGlvbi5tdXRhYmxlLkhhc2hNYXAAAAAAAAAAAQMAAHhwdwkAAALuAAAAAAB4c3EAfgAVdwkAAALuAAAAAAB4cHNyAEIkbGluZTExLiRyZWFkJCRpdyQkaXckJGl3JCRpdyRPSyQkYW5vbmZ1biRjb3JhbCQxJCRhbm9uZnVuJGFwcGx5JDIAAAAAAAAAAAIAAUwABiRvdXRlcnEAfgAOeHBxAH4AE3NyADFzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMucGFja2FnZSQkYW5vbmZ1biRyZXNldCQxAAAAAAAAAAACAAB4cHNyADpzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHQkJGFub25mdW4kZm9yZWFjaCQxAAAAAAAAAAACAAB4cA==
resuming...
searching kmap : Map(Erp -> <function1>)
fns is <function1>

scala> kmap1( "Erp" )( "Erp" )
kmap1( "Erp" )( "Erp" )
resuming...
searching kmap : Map(Erp -> <function1>)
fns is <function1>

scala> val rK1 = ObjectToString.fromString( ksmap1( "Erp" ) ).asInstanceOf[( String => Unit )]
ing => Unit )]
rK1: (String) => Unit = <function1>

scala> rK1( "Erp" )
rK1( "Erp" )
resuming...
searching kmap : Map()

scala> 

What is the intended semantics? Should they capture the same environments? Should the two executions be the same?

Best wishes in the New Year,

--greg

P.S. As a side note, i used to be able to serialize/deserialize delimited continuations using XStream. This fails now with

scala> val rK1 = new XStream( new JettisonMappedXmlDriver() ).fromXML( ks1 )
val rK1 = new XStream( new JettisonMappedXmlDriver() ).fromXML( ks1 )
com.thoughtworks.xstream.converters.ConversionException: Element fun of type scala.util.continuations.package$$anonfun$shiftR$1 is not defined as field in type scala.util.continuations.ControlContext$$anonfun$map$2
---- Debugging information ----
class               : scala.util.continuations.ControlContext$$anonfun$map$2$$anonfun$apply$1
required-type       : scala.util.continuations.ControlContext$$anonfun$map$2
path                : /scala.util.continuations.ControlContext$$anonfun$map$2$$anonfun$apply$1/$outer[2]/fun
line number         : -1
-------------------------------
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.writeValueToImplicitCollection(AbstractReflectionConverter.java:283)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:236)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:246)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:218)
at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:162)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:82)
at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:63)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:76)
at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:60)
at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:137)
at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:33)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)
at com.thoughtworks.xstream.XStream.fromXML(XStream.java:845)
at .<init>(<console>:36)
at .<clinit>(<console>)
at .<init>(<console>:11)
at .<clinit>(<console>)
at $export(<console>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at scala.tools.nsc.interpreter.IMain$ReadEvalPrint.call(IMain.scala:592)
at scala.tools.nsc.interpreter.IMain$Request$$anonfun$10.apply(IMain.scala:828)
at scala.tools.nsc.interpreter.Line$$anonfun$1.apply$mcV$sp(Line.scala:43)
at scala.tools.nsc.io.package$$anon$2.run(package.scala:31)
at java.lang.Thread.run(Thread.java:680)

scala> 

--
L.G. Meredith
Managing Partner
Biosimilarity LLC
7329 39th Ave SW

James Douglas

unread,
Dec 30, 2011, 1:49:26 PM12/30/11
to scala-user
> ksmap += ( ( key, ks ) )
> kmap += ( ( key, k ) )

It looks like when you add ks to ksmap it represents a closure around
k, so the subsequent addition to kmap is not included. If you add a
line to the continuation to print out the object reference id for
kmap, you'll see it is different for the two environments:

println( "resuming..." )
println( "searching kmap : " + kmap )
println( "kmap id : " + System.identityHashCode(kmap)) // add
this line

scala> val ksmap1 = new HashMap[String,String]( )
ksmap1: scala.collection.mutable.HashMap[String,String] = Map()

scala> val kmap1 = new HashMap[String,(String => Unit)]( )
kmap1: scala.collection.mutable.HashMap[String,String => Unit] = Map()

scala> OK.coral( false )( kmap1, ksmap1, "Erp" )
continuation as string:
rO0ABXNyAEdzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHQkJGFub25mdW4kbWFwJDIkJGFub25mdW4kYXBwbHkkMQAAAAAAAAAAAgADTAAGJG91dGVydAA4THNjYWxhL3V0aWwvY29udGludWF0aW9ucy9Db250cm9sQ29udGV4dCQkYW5vbmZ1biRtYXAkMjtMAANrJDF0ABFMc2NhbGEvRnVuY3Rpb24xO0wABXRociQxcQB
+AAJ4cHNyADZzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHQkJGFub25mdW4kbWFwJDIAAAAAAAAAAAIAAkwABiRvdXRlcnQAKUxzY2FsYS91dGlsL2NvbnRpbnVhdGlvbnMvQ29udHJvbENvbnRleHQ7TAADZiQxcQB
+AAJ4cHNyACdzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHTbw
+rG97imMwIAAkwAA2Z1bnQAEUxzY2FsYS9GdW5jdGlvbjI7TAABeHQAEkxqYXZhL2xhbmcvT2JqZWN0O3hwc3IAMnNjYWxhLnV0aWwuY29udGludWF0aW9ucy5wYWNrYWdlJCRhbm9uZnVuJHNoaWZ0UiQxAAAAAAAAAAACAAFMAAVmdW4kMXEAfgACeHBzcgCbJGxpbmUxNzMuJHJlYWQkJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyRPSyQkYW5vbmZ1biRjb3JhbCQxJCRhbm9uZnVuJGFwcGx5JDEAAAAAAAAAAAIAAUwABiRvdXRlcnQAjEwkbGluZTE3My8kcmVhZCQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JE9LJCRhbm9uZnVuJGNvcmFsJDE7eHBzcgCKJGxpbmUxNzMuJHJlYWQkJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyRPSyQkYW5vbmZ1biRjb3JhbCQxAAAAAAAAAAACAARaAAx1c2VYU3RyZWFtJDFMAAVrZXkkMXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wABmttYXAkMXQAIkxzY2FsYS9jb2xsZWN0aW9uL211dGFibGUvSGFzaE1hcDtMAAdrc21hcCQxcQB
+ABJ4cAB0AANFcnBzcgAgc2NhbGEuY29sbGVjdGlvbi5tdXRhYmxlLkhhc2hNYXAAAAAAAAAAAQMAAHhwdwkAAALuAAAAAAB4c3EAfgAVdwkAAALuAAAAAAB4cHNyAJskbGluZTE3My4kcmVhZCQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JE9LJCRhbm9uZnVuJGNvcmFsJDEkJGFub25mdW4kYXBwbHkkMgAAAAAAAAAAAgABTAAGJG91dGVycQB
+AA54cHEAfgATc3IAMXNjYWxhLnV0aWwuY29udGludWF0aW9ucy5wYWNrYWdlJCRhbm9uZnVuJHJlc2V0JDEAAAAAAAAAAAIAAHhwc3IAOnNjYWxhLnV0aWwuY29udGludWF0aW9ucy5Db250cm9sQ29udGV4dCQkYW5vbmZ1biRmb3JlYWNoJDEAAAAAAAAAAAIAAHhw
resuming...
searching kmap : Map(Erp -> <function1>)
kmap id : 24530783
fns is <function1>

scala> kmap1( "Erp" )( "Erp" )
resuming...
searching kmap : Map(Erp -> <function1>)
kmap id : 24530783
fns is <function1>

scala> val rK1 = ObjectToString.fromString( ksmap1( "Erp" )
| ).asInstanceOf[( String => Unit )]
rK1: String => Unit = <function1>

scala> rK1( "Erp" )
resuming...
searching kmap : Map()
kmap id : 4430367



On Dec 29, 4:29 pm, Meredith Gregory <lgreg.mered...@gmail.com> wrote:
> Dear Continually Scala,
>
> Here's a little snippet of code <http://paste.pocoo.org/show/527498/> that
> captures continuations
>
>    - as an in-memory representation, and
>    - as a serialized representation
> /scala.util.continuations.ControlContext$$anonfun$map$2$$anonfun$apply$1/$o uter[2]/fun
> com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshal ler.java:60)
> at
> com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java: 137)
> at
> com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(Abs tractTreeMarshallingStrategy.java:33)
> at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:923)
> at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:909)
> at com.thoughtworks.xstream.XStream.fromXML(XStream.java:853)
> at com.thoughtworks.xstream.XStream.fromXML(XStream.java:845)
> at .<init>(<console>:36)
> at .<clinit>(<console>)
> at .<init>(<console>:11)
> at .<clinit>(<console>)
> at $export(<console>)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:3 9)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImp l.java:25)

James Douglas

unread,
Dec 30, 2011, 1:54:51 PM12/30/11
to scala-user
Please pardon the mangled text. I put the same source and REPL output
here: https://gist.github.com/1541001
> ...
>
> read more »

Meredith Gregory

unread,
Dec 30, 2011, 5:00:00 PM12/30/11
to James Douglas, scala-user
Dear James,

Thanks for your note! Indeed, if we reorder the code as in the link here, we see the following trace. i was confused about the interaction of the closure capture and the mutability. i was assuming the closure would capture the map and not a copy, so that the subsequent mutation would show up in the reconstituted closure.

Best wishes,

--greg

scala> :load /Users/lgm/work/src/projex/stellar/mdp4tw/SpecialK.SDEC/scripts/k.scala
cala
Loading /Users/lgm/work/src/projex/stellar/mdp4tw/SpecialK.SDEC/scripts/k.scala...
import scala.collection.mutable.HashMap
import scala.util.continuations._
import com.thoughtworks.xstream.XStream
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver
import biz.source_code.base64Coder.Base64Coder
import java.io.ObjectInputStream
import java.io.ByteArrayInputStream
import java.io.ObjectOutputStream
import java.io.ByteArrayOutputStream
defined module ObjectToString
defined module OK

scala> OK.coral( false )( kmap1, ksmap1, "Erp" )
OK.coral( false )( kmap1, ksmap1, "Erp" )
continuation as string: rO0ABXNyAEdzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHQkJGFub25mdW4kbWFwJDIkJGFub25mdW4kYXBwbHkkMQAAAAAAAAAAAgADTAAGJG91dGVydAA4THNjYWxhL3V0aWwvY29udGludWF0aW9ucy9Db250cm9sQ29udGV4dCQkYW5vbmZ1biRtYXAkMjtMAANrJDF0ABFMc2NhbGEvRnVuY3Rpb24xO0wABXRociQxcQB+AAJ4cHNyADZzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHQkJGFub25mdW4kbWFwJDIAAAAAAAAAAAIAAkwABiRvdXRlcnQAKUxzY2FsYS91dGlsL2NvbnRpbnVhdGlvbnMvQ29udHJvbENvbnRleHQ7TAADZiQxcQB+AAJ4cHNyACdzY2FsYS51dGlsLmNvbnRpbnVhdGlvbnMuQ29udHJvbENvbnRleHTbw+rG97imMwIAAkwAA2Z1bnQAEUxzY2FsYS9GdW5jdGlvbjI7TAABeHQAEkxqYXZhL2xhbmcvT2JqZWN0O3hwc3IAMnNjYWxhLnV0aWwuY29udGludWF0aW9ucy5wYWNrYWdlJCRhbm9uZnVuJHNoaWZ0UiQxAAAAAAAAAAACAAFMAAVmdW4kMXEAfgACeHBzcgBKJGxpbmUyOC4kcmVhZCQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyRPSyQkYW5vbmZ1biRjb3JhbCQxJCRhbm9uZnVuJGFwcGx5JDEAAAAAAAAAAAIAAUwABiRvdXRlcnQAO0wkbGluZTI4LyRyZWFkJCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JE9LJCRhbm9uZnVuJGNvcmFsJDE7eHBzcgA5JGxpbmUyOC4kcmVhZCQkaXckJGl3JCRpdyQkaXckJGl3JCRpdyRPSyQkYW5vbmZ1biRjb3JhbCQxAAAAAAAAAAACAARaAAx1c2VYU3RyZWFtJDFMAAVrZXkkMXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wABmttYXAkMXQAIkxzY2FsYS9jb2xsZWN0aW9uL211dGFibGUvSGFzaE1hcDtMAAdrc21hcCQxcQB+ABJ4cAB0AANFcnBzcgAgc2NhbGEuY29sbGVjdGlvbi5tdXRhYmxlLkhhc2hNYXAAAAAAAAAAAQMAAHhwdwkAAALuAAAAAQBxAH4AFHEAfgADeHNxAH4AFXcJAAAC7gAAAAEAcQB+ABR0BhhyTzBBQlhOeUFFZHpZMkZzWVM1MWRHbHNMbU52Ym5ScGJuVmhkR2x2Ym5NdVEyOXVkSEp2YkVOdmJuUmxlSFFrSkdGdWIyNW1kVzRrYldGd0pESWtKR0Z1YjI1bWRXNGtZWEJ3Ykhra01RQUFBQUFBQUFBQUFnQURUQUFHSkc5MWRHVnlkQUE0VEhOallXeGhMM1YwYVd3dlkyOXVkR2x1ZFdGMGFXOXVjeTlEYjI1MGNtOXNRMjl1ZEdWNGRDUWtZVzV2Ym1aMWJpUnRZWEFrTWp0TUFBTnJKREYwQUJGTWMyTmhiR0V2Um5WdVkzUnBiMjR4TzB3QUJYUm9jaVF4Y1FCK0FBSjRjSE55QURaelkyRnNZUzUxZEdsc0xtTnZiblJwYm5WaGRHbHZibk11UTI5dWRISnZiRU52Ym5SbGVIUWtKR0Z1YjI1bWRXNGtiV0Z3SkRJQUFBQUFBQUFBQUFJQUFrd0FCaVJ2ZFhSbGNuUUFLVXh6WTJGc1lTOTFkR2xzTDJOdmJuUnBiblZoZEdsdmJuTXZRMjl1ZEhKdmJFTnZiblJsZUhRN1RBQURaaVF4Y1FCK0FBSjRjSE55QUNkelkyRnNZUzUxZEdsc0xtTnZiblJwYm5WaGRHbHZibk11UTI5dWRISnZiRU52Ym5SbGVIVGJ3K3JHOTdpbU13SUFBa3dBQTJaMWJuUUFFVXh6WTJGc1lTOUdkVzVqZEdsdmJqSTdUQUFCZUhRQUVreHFZWFpoTDJ4aGJtY3ZUMkpxWldOME8zaHdjM0lBTW5OallXeGhMblYwYVd3dVkyOXVkR2x1ZFdGMGFXOXVjeTV3WVdOcllXZGxKQ1JoYm05dVpuVnVKSE5vYVdaMFVpUXhBQUFBQUFBQUFBQUNBQUZNQUFWbWRXNGtNWEVBZmdBQ2VIQnpjZ0JDSkd4cGJtVXhNUzRrY21WaFpDUWthWGNrSkdsM0pDUnBkeVFrYVhja1Qwc2tKR0Z1YjI1bWRXNGtZMjl5WVd3a01TUWtZVzV2Ym1aMWJpUmhjSEJzZVNReEFBQUFBQUFBQUFBQ0FBRk1BQVlrYjNWMFpYSjBBRE5NSkd4cGJtVXhNUzhrY21WaFpDUWthWGNrSkdsM0pDUnBkeVFrYVhja1Qwc2tKR0Z1YjI1bWRXNGtZMjl5WVd3a01UdDRjSE55QURFa2JHbHVaVEV4TGlSeVpXRmtKQ1JwZHlRa2FYY2tKR2wzSkNScGR5UlBTeVFrWVc1dmJtWjFiaVJqYjNKaGJDUXhBQUFBQUFBQUFBQUNBQVJhQUF4MWMyVllVM1J5WldGdEpERk1BQVZyWlhra01YUUFFa3hxWVhaaEwyeGhibWN2VTNSeWFXNW5PMHdBQm10dFlYQWtNWFFBSWt4elkyRnNZUzlqYjJ4c1pXTjBhVzl1TDIxMWRHRmliR1V2U0dGemFFMWhjRHRNQUFkcmMyMWhjQ1F4Y1FCK0FCSjRjQUIwQUFORmNuQnpjZ0FnYzJOaGJHRXVZMjlzYkdWamRHbHZiaTV0ZFhSaFlteGxMa2hoYzJoTllYQUFBQUFBQUFBQUFRTUFBSGh3ZHdrQUFBTHVBQUFBQUFCNGMzRUFmZ0FWZHdrQUFBTHVBQUFBQUFCNGNITnlBRUlrYkdsdVpURXhMaVJ5WldGa0pDUnBkeVFrYVhja0pHbDNKQ1JwZHlSUFN5UWtZVzV2Ym1aMWJpUmpiM0poYkNReEpDUmhibTl1Wm5WdUpHRndjR3g1SkRJQUFBQUFBQUFBQUFJQUFVd0FCaVJ2ZFhSbGNuRUFmZ0FPZUhCeEFINEFFM055QURGelkyRnNZUzUxZEdsc0xtTnZiblJwYm5WaGRHbHZibk11Y0dGamEyRm5aU1FrWVc1dmJtWjFiaVJ5WlhObGRDUXhBQUFBQUFBQUFBQUNBQUI0Y0hOeUFEcHpZMkZzWVM1MWRHbHNMbU52Ym5ScGJuVmhkR2x2Ym5NdVEyOXVkSEp2YkVOdmJuUmxlSFFrSkdGdWIyNW1kVzRrWm05eVpXRmphQ1F4QUFBQUFBQUFBQUFDQUFCNGNBPT14cHNyAEokbGluZTI4LiRyZWFkJCRpdyQkaXckJGl3JCRpdyQkaXckJGl3JE9LJCRhbm9uZnVuJGNvcmFsJDEkJGFub25mdW4kYXBwbHkkMgAAAAAAAAAAAgABTAAGJG91dGVycQB+AA54cHEAfgATc3IAMXNjYWxhLnV0aWwuY29udGludWF0aW9ucy5wYWNrYWdlJCRhbm9uZnVuJHJlc2V0JDEAAAAAAAAAAAIAAHhwc3IAOnNjYWxhLnV0aWwuY29udGludWF0aW9ucy5Db250cm9sQ29udGV4dCQkYW5vbmZ1biRmb3JlYWNoJDEAAAAAAAAAAAIAAHhw
resuming...
searching kmap : Map(Erp -> <function1>)
fns is <function1>

scala> kmap1( "Erp" )( "Erp" )
kmap1( "Erp" )( "Erp" )
resuming...
searching kmap : Map(Erp -> <function1>)
fns is <function1>

scala> val rK1 = ObjectToString.fromString( ksmap1( "Erp" ) ).asInstanceOf[( String => Unit )]
ing => Unit )]
rK1: (String) => Unit = <function1>

scala> rK1( "Erp" )
rK1( "Erp" )
resuming...
searching kmap : Map(Erp -> <function1>)
fns is <function1>

scala> 
Reply all
Reply to author
Forward
0 new messages