如果把裸体看作计算机的本质的话,程序语言就是衣服。
如果把汇编比喻成最原始的树叶衣服的话(这种衣服想遮那,挡那),那么C语言就是最原始的编织物的衣服了。也就是说,C语言已经出现成块的布了,用这些布我们可以拼凑出各种形制来。
那么java,我觉得最象一个漂亮的裙装(短裙性感的那种),而scala则象现在混搭的穿衣风格。
抱歉,纯函数式(比如scheme)的我曾经用过一些,只是觉得可读性太差,写起来实在是不习惯。这些东西在我看来更像穆斯林的服装,全身都裹着,虽然统一,但却郁闷。
这两天,我在研究scala,主要是读《program in scala》,再写一些测试的代码。
并且把我原来用java写的一个程序改成了scala。
我确实很喜欢这种混搭的风格,而且,scala内在的,从概念上,很统一。
其实,它的思想还是oo的,只不过它把函数也作为一种对象独立出来罢了。
不过,scala的编译器做的比较技术,也就是说,它的语法弄得比较灵活,但却并不显得复杂。
比方说,你可以println("hello"),也可以println "hello",也可以println {"hello"}。
虽然如此,它并没有违背它的核心理念,也就是“every thing is object,every operate is method”。这是语法分析和语义分析的区别,也就是说,把所有的形式翻译成,对象和方法的结构(语义),再以这种理念来树立语言的核心精神。这使得scala变得统一,它只加入了几个控制语句,其他的都交给对象和函数系统。它并没有象scheme一样执着,而是适当的加入了那么几个控制语句,这是我欣赏的地方——不要拘泥于什么东西。当然这几个语句不是对象,不过,不用担心,编译器会把他们变成对象的——我是这么理解的。
scala编译器的一个非常方便的功能是类型的推导,这减少了敲代码的量,并且使代码容易理解,感觉非常的自然。你认为编译器应该能明白的,它就能明白,就是这样。
这是我写的一个小例子,这是个hello world加强版:
这仅仅是九牛一毛。
scala的好多特性我都没用到,不过,这是基本的,我觉得至少要知道这些。
还有好多地方我还不知道该怎么用,功能确实比较繁杂。
scala的话,ide的支持不行(我发现象eclipse的java环境那么好的东西,实在是凤毛麟角),所以ant是必不可少的。再搞个编辑器就行了,scala支持好多编辑器。
顺便提供我的build.xml,供参考:
如果把汇编比喻成最原始的树叶衣服的话(这种衣服想遮那,挡那),那么C语言就是最原始的编织物的衣服了。也就是说,C语言已经出现成块的布了,用这些布我们可以拼凑出各种形制来。
那么java,我觉得最象一个漂亮的裙装(短裙性感的那种),而scala则象现在混搭的穿衣风格。
抱歉,纯函数式(比如scheme)的我曾经用过一些,只是觉得可读性太差,写起来实在是不习惯。这些东西在我看来更像穆斯林的服装,全身都裹着,虽然统一,但却郁闷。
这两天,我在研究scala,主要是读《program in scala》,再写一些测试的代码。
并且把我原来用java写的一个程序改成了scala。
我确实很喜欢这种混搭的风格,而且,scala内在的,从概念上,很统一。
其实,它的思想还是oo的,只不过它把函数也作为一种对象独立出来罢了。
不过,scala的编译器做的比较技术,也就是说,它的语法弄得比较灵活,但却并不显得复杂。
比方说,你可以println("hello"),也可以println "hello",也可以println {"hello"}。
虽然如此,它并没有违背它的核心理念,也就是“every thing is object,every operate is method”。这是语法分析和语义分析的区别,也就是说,把所有的形式翻译成,对象和方法的结构(语义),再以这种理念来树立语言的核心精神。这使得scala变得统一,它只加入了几个控制语句,其他的都交给对象和函数系统。它并没有象scheme一样执着,而是适当的加入了那么几个控制语句,这是我欣赏的地方——不要拘泥于什么东西。当然这几个语句不是对象,不过,不用担心,编译器会把他们变成对象的——我是这么理解的。
scala编译器的一个非常方便的功能是类型的推导,这减少了敲代码的量,并且使代码容易理解,感觉非常的自然。你认为编译器应该能明白的,它就能明白,就是这样。
这是我写的一个小例子,这是个hello world加强版:
import scala.collection.mutable.Set
class Dog[T](var color: String){
val childs=Set[T]()
def apply()="""hello dog every day is holeday,dkkskdkfs
dskdkskdksk"""
def add(x: Int,y: Int):Int={
x+y
}
def hello(dog: String){
println("hello dog! "+dog)
}
def pf(p: PartialFunction[Any,Unit]){
//注意,“部分函数”这个东西
p.apply(color)
}
def an(body: => Unit){
body
}
def lookat(){
println("i am in Dog, and i am lookat")
}
}
object Main extends Application{
val mydog=new Dog[Int]("green"){
override def lookat(){
println("i am lookat")
}
}//this is a Refinement
println(mydog.color)
mydog.color="red"//not need java's getter and setter
println {mydog()}//对象的函数式用法,调用apply方法
println(mydog.add(1,2))
mydog hello "ddkks"
mydog hello { "sssss" }
mydog hello ("mmmmms") //单参数的多种调用方法
mydog pf {case "green" => println("ooooooo喵ooooooo")}//case block会被编译成一个PartialFunction,这种形式在Actor里很常见
mydog an { println("ok,ok,ok") }//这是个Call-by-name
mydog.childs+3
mydog.childs+4//集合Set的使用
mydog.childs.foreach(println)
mydog.lookat
mydog.asInstanceOf[Dog[Int]].lookat//asInstanceOf[SomeType]和java的强制转型是一样的
}
这仅仅是九牛一毛。
scala的好多特性我都没用到,不过,这是基本的,我觉得至少要知道这些。
还有好多地方我还不知道该怎么用,功能确实比较繁杂。
scala的话,ide的支持不行(我发现象eclipse的java环境那么好的东西,实在是凤毛麟角),所以ant是必不可少的。再搞个编辑器就行了,scala支持好多编辑器。
顺便提供我的build.xml,供参考:
<project name="scala play" default="run" basedir=".">
<property name="sources.dir" value="src" />
<property name="build.dir" value="build/classes"/>
<property name="lib.dir" value="lib"/>
<property environment="env"/>
<property name="scala.home" value="${env.SCALA_HOME}" />
<target name="init">
<property name="scala-library.jar" value="${scala.home}/lib/scala-library.jar"/>
<mkdir dir="${build.dir}"/>
<mkdir dir="${sources.dir}"/>
<mkdir dir="${lib.dir}"/>
<path id="build.classpath">
<pathelement location="${scala-library.jar}"/>
<pathelement location="${build.dir}"/>
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
</path>
<taskdef resource="scala/tools/ant/antlib.xml">
<classpath>
<pathelement location="${scala.home}/lib/scala-compiler.jar" />
<pathelement location="${scala-library.jar}" />
</classpath>
</taskdef>
</target>
<target name="build" depends="init">
<scalac srcdir="${sources.dir}"
destdir="${build.dir}"
classpathref="build.classpath"
deprecation="yes"
encoding="gbk">
</scalac>
</target>
<target name="test" depends="build">
<java classname="Main"
fork="true"
classpathref="build.classpath">
</java>
</target>
<target name="clean">
<delete dir="${build.dir}"/>
</target>
</project>