progs/lecture5.scala
changeset 247 50a3b874008a
parent 242 e6b34f617915
child 326 e5453add7df6
equal deleted inserted replaced
246:178438912e5f 247:50a3b874008a
   178 // Or, A topic of endless "fun"(?)
   178 // Or, A topic of endless "fun"(?)
   179 
   179 
   180 
   180 
   181 // input type: String
   181 // input type: String
   182 // output type: Int
   182 // output type: Int
   183 Integer.parseInt("123456")
   183 Integer.parseInt("123u456")
   184 
   184 
   185 /* Note, in the previous lectures I did not show the type consraint
   185 /* Note, in the previous lectures I did not show the type consraint
   186  * I <% Seq[_] , which means that the input type I can be
   186  * I <% Seq[_] , which means that the input type I can be
   187  * treated, or seen, as a sequence. */
   187  * treated, or seen, as a sequence. */
   188 
   188 
   239 }
   239 }
   240 
   240 
   241 val NumParser = RegexParser("[0-9]+".r)
   241 val NumParser = RegexParser("[0-9]+".r)
   242 def StringParser(s: String) = RegexParser(Regex.quote(s).r)
   242 def StringParser(s: String) = RegexParser(Regex.quote(s).r)
   243 
   243 
   244 println(NumParser.parse_all("12345"))
   244 NumParser.parse_all("12u345")
   245 println(NumParser.parse_all("12u45"))
   245 println(NumParser.parse_all("12u45"))
   246 
   246 
   247 
   247 
   248 // convenience
   248 // convenience
   249 implicit def string2parser(s: String) = StringParser(s)
   249 implicit def string2parser(s: String) = StringParser(s)
   264   def ~ (r: String) = 
   264   def ~ (r: String) = 
   265     new SeqParser[String, String, String](s, r)
   265     new SeqParser[String, String, String](s, r)
   266 }
   266 }
   267 
   267 
   268 
   268 
   269 val NumParserInt = NumParser ==> (s => s.toInt)
   269 val NumParserInt = NumParser ==> (s => 2 * s.toInt)
   270 
   270 
   271 NumParser.parse_all("12345")
   271 NumParser.parse_all("12345")
   272 NumParserInt.parse_all("12345")
   272 NumParserInt.parse_all("12345")
   273 NumParserInt.parse_all("12u45")
   273 NumParserInt.parse_all("12u45")
   274 
   274 
   286 lazy val T: Parser[String, Int] = 
   286 lazy val T: Parser[String, Int] = 
   287   (F ~ "*" ~ T) ==> { case ((x, y), z) => x * z } | F
   287   (F ~ "*" ~ T) ==> { case ((x, y), z) => x * z } | F
   288 lazy val F: Parser[String, Int] = 
   288 lazy val F: Parser[String, Int] = 
   289   ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } | NumParserInt
   289   ("(" ~ E ~ ")") ==> { case ((x, y), z) => y } | NumParserInt
   290 
   290 
   291 println(E.parse_all("1+3+4"))
   291 
   292 println(E.parse_all("4*2+3"))
   292 println(E.parse_all("4*2+3"))
   293 println(E.parse_all("4*(2+3)"))
   293 println(E.parse_all("4*(2+3)"))
   294 println(E.parse_all("(4)*((2+3))"))
   294 println(E.parse_all("(4)*((2+3))"))
   295 println(E.parse_all("4/2+3"))
   295 println(E.parse_all("4/2+3"))
   296 println(E.parse_all("(1+2)+3"))
   296 println(E.parse_all("(1+2)+3"))
   329 //
   329 //
   330 // http://scalapuzzlers.com
   330 // http://scalapuzzlers.com
   331 //
   331 //
   332 // http://www.latkin.org/blog/2017/05/02/when-the-scala-compiler-doesnt-help/
   332 // http://www.latkin.org/blog/2017/05/02/when-the-scala-compiler-doesnt-help/
   333 
   333 
   334 List(1, 2, 3) contains "your mom"
   334 List(1, 2, 3).contains("your mom")
   335 
   335 
   336 // I like best about Scala that it lets me often write
   336 // I like best about Scala that it lets me often write
   337 // concise, readable code. And it hooks up with the 
   337 // concise, readable code. And it hooks up with the 
   338 // Isabelle theorem prover.
   338 // Isabelle theorem prover.
   339 
   339