Nice! And you're right. I'm trying to program in Scala as if it were
C# with a weird implementation of LINQ. And C# it is not.

But the thread was not really about this. The thread was about a bug
in the compiler, which still stands. And you can pry my return
statements out of my cold, dead hands. :-)

On Nov 16, 9:42 pm, David Pollak <[email protected]>
wrote:
> If you see the "return" statement in your program, you are likely doing
> something wrong.  It means that it's time to refactor your code so there's a
> single return point from your method.  Using null is a red flag (use Option
> or Box) and using vars (rather than vals) is a yellow flag.
>
> So, let's go through your code:
>
>    def findTagWithName(tags: List[Tag], name: String) : Tag = {
>        val t = tags.find(x => x.name == name)
>         return t.getOrElse(null)
>    }
>
> becomes:
>
>    def findTagWithName(tags: List[Tag], name: String): Box[Tag] =
>         tags.find(x => x.name == name)
>
>    def getCookieValue(name: String, default: String) : String = {
>        for(cookie <- S.findCookie(name); v <- cookie.value) {
>            return v
>        }
>        return default
>    }
>
> becomes:
>
>    def getCookieValue(name: String, default: String): String =
>        (for(cookie <- S.findCookie(name); v <- cookie.value)
>            yield v) openOr default
>
>    def getParamValue(name: String, default: String) : String = {
>        for(v <- S.param(name)) {
>            return v
>        }
>        return default
>    }
>
> becomes:
>
>    def getParamValue(name: String, default: String): String =
>       S.param(name) openOr default
> - Show quoted text -
>
>    def getSelectedTag(tags: List[Tag], cookieName: String, urlParam: String)
> : Tag = {
>        var t : Tag = null
>        try {
>            if(tags.length == 0) {
>                return null
>            }
>
>            // See if tag name is present in the URL
>            val tagName = getParamValue(urlParam, "")
>            // If yes, check if a tag with this name is present in tags
>            t = findTagWithName(tags, tagName)
>            // If it is, write out the right cookie and return
>            if(t != null) {
>                return t
>            }
>
>            // if no, check the corresponding cookie
>            val cv = getCookieValue(cookieName, "")
>            if(cv != null) {
>                // and check if the tag with a name stored in cookie is
> present in tags
>                t = findTagWithName(tags, cv)
>                if(t != null) {
>                    return t
>                }
>            }
>
>            // otherwise just select the last tag from the list and write out
> the cookie
>            t = tags.last
>            return t
>        } finally {
>            if(t != null) {
>                var c = HTTPCookie(cookieName, t.name).setMaxAge(365 * 24 *
> 60 * 60)
>                S.addCookie(c)
>            }
>        }
>    }
>
> becomes:
>
>    def getSelectedTag(tags: List[Tag], cookieName: String, urlParam:
> String): Box[Tag] = {
>             // See if tag name is present in the URL
>        def tagForParam =
>         for {
>           param <- S.param(urlParam)
>           tag <- tags.find(_.name == param)
>         } yield tag
>
>       // check the corresponding cookie
>       def tagForCookie =
>         for {
>           cookie <- S.findCookie(cookieName)
>           value <- cookie.value
>           tag <- tags.find(_.name == value)
>         } yield tag
>
>      val tag = tagForParam or tagForCookie or tags.lastOption
>
>      tag.foreach( t =>
>         S.addCookie(HTTPCookie(cookieName, t.name).setMaxAge(365 * 24 * 60 *
> 60)))
>
>      tag
>   }
>
> Note how the revised code is cleaner and easier to read.  The logic is
> grouped together and the expression of what tag to select is very clear.
>
> I hope this helps.
>
> Thanks,
>
> David
>
>
>
> On Mon, Nov 16, 2009 at 8:45 PM, DMB <[email protected]> wrote:
> > I wonder if anyone else finds this stack trace familiar. As often is
> > the case with non-mainstream languages, Google turns up nothing of
> > value. The code fragment goes below. If I comment out the code inside
> > the finally statement, everything compiles fine. If I keep it, I get
> > the stack trace below. I have tried to create a minimal repro, but did
> > not have any success. I understand this is not a Lift issue, but this
> > group has a sizable chunk of Scala enthusiasts, so hopefully someone
> > has encountered something like this
>
> > block #9 :
> >  CONSTANT (Constant(null))
> >  LOAD_LOCAL variable t
> >  DUP
> >  STORE_LOCAL variable eqEqTemp$2
> >  CZJUMP (REFERENCE(java.lang.Object))EQ ? 13 : 15
> > Successors:  3 15 13 3
> > trying to emit: DROP REFERENCE(scala.Null)
> > java.lang.reflect.InvocationTargetException
> >        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 org.scala_tools.maven.executions.MainHelper.runMain
> > (MainHelper.java:151)
> >        at org.scala_tools.maven.executions.MainWithArgsInFile.main
> > (MainWithArgsInFile.java:26)
> > Caused by: java.lang.AssertionError: assertion failed: BasicBlock
> > closed
> >        at scala.Predef$.assert(Predef.scala:92)
> >        at scala.tools.nsc.backend.icode.BasicBlocks$BasicBlock.emit
> > (BasicBlocks.scala:327)
> >        at scala.tools.nsc.backend.icode.BasicBlocks$BasicBlock.emit
> > (BasicBlocks.scala:317)
> >        at scala.tools.nsc.backend.icode.GenICode$ICodePhase.adapt
> > (GenICode.scala:1006)
> >        at scala.tools.nsc.backend.icode.GenICode$ICodePhase.scala
> > $tools$nsc$backend$icode$GenICode$ICodePhase$$genLoad(GenICode.scala:
> > 496)
> >        at scala.tools.nsc.backend.icode.GenICode$ICodePhase.scala
> > $tools$nsc$backend$icode$GenICode$ICodePhase$$genLoad(GenICode.scala:
> > 447)
> >        at scala.tools.nsc.backend.icode.GenICode$ICodePhase.scala
> > $tools$nsc$backend$icode$GenICode$ICodePhase$$genStat(GenICode.scala:
> > 183)
> >        at scala.tools.nsc.backend.icode.GenICode$ICodePhase$$anonfun
> > $genStat$1.apply(GenICode.scala:146)
> >        at scala.tools.nsc.backend.icode.GenICode$ICodePhase$$anonfun
> > $genStat$1.apply(GenICode.scala:145)
> > etc, etc...
>
> > The code fragment:
>
> >    def findTagWithName(tags: List[Tag], name: String) : Tag = {
> >        val t = tags.find(x => x.name == name)
> >        return t.getOrElse(null)
> >    }
>
> >    def getCookieValue(name: String, default: String) : String = {
> >        for(cookie <- S.findCookie(name); v <- cookie.value) {
> >            return v
> >        }
> >        return default
> >    }
>
> >    def getParamValue(name: String, default: String) : String = {
> >        for(v <- S.param(name)) {
> >            return v
> >        }
> >        return default
> >    }
>
> >    def getSelectedTag(tags: List[Tag], cookieName: String, urlParam:
> > String) : Tag = {
> >        var t : Tag = null
> >        try {
> >            if(tags.length == 0) {
> >                return null
> >            }
>
> >            // See if tag name is present in the URL
> >            val tagName = getParamValue(urlParam, "")
> >            // If yes, check if a tag with this name is present in
> > tags
> >            t = findTagWithName(tags, tagName)
> >            // If it is, write out the right cookie and return
> >            if(t != null) {
> >                return t
> >            }
>
> >            // if no, check the corresponding cookie
> >            val cv = getCookieValue(cookieName, "")
> >            if(cv != null) {
> >                // and check if the tag with a name stored in cookie
> > is present in tags
> >                t = findTagWithName(tags, cv)
> >                if(t != null) {
> >                    return t
> >                }
> >            }
>
> >            // otherwise just select the last tag from the list and
> > write out the cookie
> >            t = tags.last
> >            return t
> >        } finally {
> >            if(t != null) {
> >                var c = HTTPCookie(cookieName, t.name).setMaxAge(365 *
> > 24 * 60 * 60)
> >                S.addCookie(c)
> >            }
> >        }
> >    }
>
> > --
>
> > You received this message because you are subscribed to the Google Groups
> > "Lift" group.
> > To post to this group, send email to [email protected].
> > To unsubscribe from this group, send email to
> > [email protected]<liftweb%[email protected]>
> > .
> > For more options, visit this group at
> >http://groups.google.com/group/liftweb?hl=.
>
> --
> Lift, the simply functional web frameworkhttp://liftweb.net
> Beginning Scalahttp://www.apress.com/book/view/1430219890
> Follow me:http://twitter.com/dpp
> Surf the harmonics

--

You received this message because you are subscribed to the Google Groups 
"Lift" 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/liftweb?hl=.


Reply via email to