仓酷云

标题: 了解下JAVA的面向Java开辟职员的Scala指南 - 构建盘算器,第3部分 [打印本页]

作者: 再见西城    时间: 2015-1-18 11:18
标题: 了解下JAVA的面向Java开辟职员的Scala指南 - 构建盘算器,第3部分
其实你不用Struts,spring这些工具,直接用jsp,servlet能够很方便地写出来,而且,可以根据个人的水平、爱好,有很多方案。而struts,spring这些工具的出来。
接待勇于探究的读者回到我们的系列文章中!本月持续探究Scala的言语和库撑持,我们将改革一下盘算器DSL并终极“完成它”。DSL自己有点复杂—一个复杂的盘算器,今朝为止只撑持4个基础数学运算符。但要记着,我们的方针是创立一些可扩大的、天真的对象,而且今后能够轻松加强它们以撑持新的功效。
持续前次的会商……
申明一下,今朝我们的DSL有点庞杂。我们有一个笼统语法树(AbstractSyntaxTree),它由大批case类构成……
清单1.后端(AST)
packagecom.tedneward.calcdsl
{
 //...
 private[calcdsl]abstractclassExpr
 private[calcdsl] caseclassVariable(name:String)extendsExpr
 private[calcdsl] caseclassNumber(value:Double)extendsExpr
 private[calcdsl] caseclassUnaryOp(operator:String,arg:Expr)extendsExpr
 private[calcdsl] caseclassBinaryOp(operator:String,left:Expr,right:Expr)
 extendsExpr
}
……对此我们能够供应相似注释器的举动,它能最年夜限制地简化数学表达式……
清单2.后端(注释器)
packagecom.tedneward.calcdsl
{
 //...
 objectCalc
 {
  defsimplify(e:Expr):Expr={
   //firstsimplifythesubexpressions
   valsimpSubs=ematch{
    //Askeachsidetosimplify
    caseBinaryOp(op,left,right)=>BinaryOp(op,simplify(left),simplify(right))
    //Asktheoperandtosimplify
    caseUnaryOp(op,operand)=>UnaryOp(op,simplify(operand))
    //Anythingelsedoesnthavecomplexity(nooperandstosimplify)
    case_=>e
   }
   //nowsimplifyatthetop,assumingthecomponentsarealreadysimplified
   defsimplifyTop(x:Expr)=xmatch{
    //Doublenegationreturnstheoriginalvalue
    caseUnaryOp("-",UnaryOp("-",x))=>x

    //Positivereturnstheoriginalvalue
    caseUnaryOp("+",x)=>x

    //Multiplyingxby1returnstheoriginalvalue
    caseBinaryOp("*",x,Number(1))=>x

    //Multiplying1byxreturnstheoriginalvalue
    caseBinaryOp("*",Number(1),x)=>x

    //Multiplyingxby0returnszero
    caseBinaryOp("*",x,Number(0))=>Number(0)

    //Multiplying0byxreturnszero
    caseBinaryOp("*",Number(0),x)=>Number(0)

    //Dividingxby1returnstheoriginalvalue
    caseBinaryOp("/",x,Number(1))=>x

    //Dividingxbyxreturns1
    caseBinaryOp("/",x1,x2)ifx1==x2=>Number(1)

    //Addingxto0returnstheoriginalvalue
    caseBinaryOp("+",x,Number(0))=>x

    //Adding0toxreturnstheoriginalvalue
    caseBinaryOp("+",Number(0),x)=>x

    //Anythingelsecannot(yet)besimplified
    casee=>e
   }
   simplifyTop(simpSubs)
  }

  defevaluate(e:Expr):Double=
  {
   simplify(e)match{
    caseNumber(x)=>x
    caseUnaryOp("-",x)=>-(evaluate(x))
    caseBinaryOp("+",x1,x2)=>(evaluate(x1)+evaluate(x2))
    caseBinaryOp("-",x1,x2)=>(evaluate(x1)-evaluate(x2))
    caseBinaryOp("*",x1,x2)=>(evaluate(x1)*evaluate(x2))
    caseBinaryOp("/",x1,x2)=>(evaluate(x1)/evaluate(x2))
   }
  }
 }
}
<p>
IDE是好。java中的IDE更是百花齐放,你用jbuilder能说jbuilder赶不上vs吗?用eclipse,net网页编程beans也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。
作者: 变相怪杰    时间: 2015-1-19 16:11
是一种为 Internet发展的计算机语言
作者: 分手快乐    时间: 2015-1-22 11:40
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
作者: 谁可相欹    时间: 2015-1-24 15:31
还好,SUN提供了Javabean可以把你的JSP中的 Java代码封装起来,便于调用也便于重用。
作者: 精灵巫婆    时间: 2015-2-1 19:51
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 金色的骷髅    时间: 2015-2-7 14:39
Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
作者: 柔情似水    时间: 2015-2-22 08:17
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 冷月葬花魂    时间: 2015-2-22 20:19
Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。
作者: 若相依    时间: 2015-3-6 16:45
科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。
作者: 愤怒的大鸟    时间: 2015-3-13 04:11
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 因胸联盟    时间: 2015-3-20 12:34
是一种使网页(Web Page)产生生动活泼画面的语言




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2