|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
其实你不用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也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。 |
|