当前位置:七道奇文章资讯编程技术Java编程
日期:2011-03-22 16:13:00  来源:本站整理

面向Java开辟人员的Scala指南 - 构建计算器,第2部份[Java编程]

赞助商链接



  本文“面向Java开辟人员的Scala指南 - 构建计算器,第2部份[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

特定范畴语言(Domain-specific languages,DSL)已经成为一个热门话题;很多函数性语言之所以受欢送,主如果因为它们可以用于构建 DSL.有鉴于此,在 面向 Java 开辟人员的 Scala 指南 系列的最后一篇文章中,Ted Neward 持续谈论一个简单的计算器 DSL,以展示函数性语言在构建“外部”DSL 的强盛功效,并在此历程中办理将文本输入转换成用于注释的 AST 的问题.为了解析文本输入,并将它转换成上一篇文章中注释器利用的树构造,Ted 引入了 解析器组合子(parser combinator),这是一个专门为这项任务计划的尺度 Scala 库.(在 上一篇文章 中,我们构建了一个计算器解析器和 AST).

回想一下我们的豪杰所处的窘境:在试图成立一个 DSL(这里只不过是一种非常简单的计算器语言)时,他成立了包含可用于该语言的各种选项的树构造:

二进制加/减/乘/除运算符

一元反运算符

数值

它背后的履行引擎知道若何履行那些操作,它乃至有一个显式的优化步骤,以削减得到后果所需的计算.

最后的 代码 是这样的:

清单 1. 计算器 DSL:AST 和注释器

package com.tedneward.calcdsl
{
  private[calcdsl] abstract class Expr
  private[calcdsl] case class Variable(name : String) extends Expr
  private[calcdsl] case class Number(value : Double) extends Expr
  private[calcdsl] case class UnaryOp(operator : String, arg : Expr) extends Expr
  private[calcdsl] case class BinaryOp(operator : String, left : Expr, right : Expr)
  extends Expr
  object Calc
  {
   /**
   * Function to simplify (a la mathematic terms) expressions
   */
   def simplify(e : Expr) : Expr =
   {
    e match {
     // Double negation returns the original value
     case UnaryOp("-", UnaryOp("-", x)) => simplify(x)

     // Positive returns the original value
     case UnaryOp("+", x) => simplify(x)

     // Multiplying x by 1 returns the original value
     case BinaryOp("*", x, Number(1)) => simplify(x)

     // Multiplying 1 by x returns the original value
     case BinaryOp("*", Number(1), x) => simplify(x)

     // Multiplying x by 0 returns zero
     case BinaryOp("*", x, Number(0)) => Number(0)

     // Multiplying 0 by x returns zero
     case BinaryOp("*", Number(0), x) => Number(0)

     // Dividing x by 1 returns the original value
     case BinaryOp("/", x, Number(1)) => simplify(x)

     // Dividing x by x returns 1
     case BinaryOp("/", x1, x2) if x1 == x2 => Number(1)

     // Adding x to 0 returns the original value
     case BinaryOp("+", x, Number(0)) => simplify(x)

     // Adding 0 to x returns the original value
     case BinaryOp("+", Number(0), x) => simplify(x)

     // Anything else cannot (yet) be simplified
     case _ => e
    }
   }

   def evaluate(e : Expr) : Double =
   {
    simplify(e) match {
     case Number(x) => x
     case UnaryOp("-", x) => -(evaluate(x))
     case BinaryOp("+", x1, x2) => (evaluate(x1) + evaluate(x2))
     case BinaryOp("-", x1, x2) => (evaluate(x1) - evaluate(x2))
     case BinaryOp("*", x1, x2) => (evaluate(x1) * evaluate(x2))
     case BinaryOp("/", x1, x2) => (evaluate(x1) / evaluate(x2))
    }
   }
  }
}


  以上是“面向Java开辟人员的Scala指南 - 构建计算器,第2部份[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • Jt —— 面向Java情势的框架
  • 面向Java开辟人员的Scala指南 - 用Scitter更新Twitter
  • 面向Java开辟人员的Scala指南 - 类操作
  • 面向Java开辟人员的Scala指南 - 面向对象的函数编程
  • 面向Java开辟人员的Scala指南 - 实现承当
  • 面向Java开辟人员的Scala指南 - Scala和servlet
  • 面向Java开辟人员的Scala指南 - Scala掌握构造内部揭密
  • 面向Java开辟人员的Scala指南 - 包和访谒修饰符
  • <b>面向Java开辟人员的Scala指南 - 构建计算器,第1部份</b>
  • 面向Java开辟人员的Scala指南 - 构建计算器,第2部份
  • 面向Java开辟人员的Scala指南 - 构建计算器,第3部份
  • 面向Java开辟人员的Scala指南 - 关于特点和行为
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .