摸索JVM上的LISP[Java编程]
本文“摸索JVM上的LISP[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
当前Java范畴最冲动人心的事情莫过于可答应别的编程语言运行于Java虚拟机上.环绕JRuby、Groovy、Scala还有 Rhino(JavaScript引擎)的谈论已经甚嚣尘上.可为什么要墨守陈规呢?假如你真的想跳出主流,投身于一种与Java截然差别的的语言,Lisp就不失为一种很好的挑选.目前已有几种可运行于JVM上的Lisp程序计划语言的开源实现,预备好开始我们的摸索之旅吧!
Lisp有什么值得研究呢?首先,作为已有50年历史的语言,它促成很多被我们本日视为理所当然的见解.if-then-else构造、早期的面向对象和带垃圾回收的自动内存管理的尝试都根源于此.目前Java程序员的热门话题——词汇闭包(Lexical Closure),最初的摸索也是七十年代在Lisp中展开的.除此以外,Lisp还具有别的很多语言至今都未采取的特点,这些超卓的思惟必将在将来惹起复兴潮流.
本文的目标读者是有意理解Lisp的Java开辟人员.我们将在接下来的内容中谈论当前可以用在JVM上的差别Lisp方言(dialect),令你快速理解Lisp程序计划工作机理和其独特之处,文章的最后会演示若何将Lisp代码与Java系统举行整合.
目前存在很多可用于差别平台的Lisp系统,有免费的也有商业的.关于想要开始摸索Lisp的Java用户,不脱离JVM是首选,这样的话起步很简单,还可以很便利的利用全部自己熟习的Java库和相关工具.
Common Lisp和Scheme
Lisp有两种主要方言(dialect):Common Lisp和Scheme.固然计划理念大体类似,但是它们的差别仍旧充足惹起孰优孰劣的激烈争辩.
Common Lisp是1991年完成的ANSI尺度.统一了几种早期Lisp的理念,是可用于多种利用开辟的大型环境,其最为闻名的利用是人工智能.而Scheme 产生于学术界,特地举行了精简化计划,经考证是一种很好的语言,既可用于计算机科学讲授,又可以作为嵌入式脚本语言.你还大概会碰到别的一些对比闻名的 Lisp:小型的特定于利用的DSLs,如Emacs Lisp或AutoCAD的AutoLISP.
上面提到的两种主要方言(dialect)在JVM上都有呼应的实现,相较而言Schemes的实现要成熟一些.Armed Bear Common Lisp(www.armedbear.org/abcl.html)非常完好的实现了Common Lisp尺度,但它存在一个问题,假如你没有安装别的Common List系统,就不能构建分发版本,这对新手大概是个艰难.
在Scheme方面,两个主要的产品是Kawa(www.gnu.org/software/kawa)和SISC(www.sisc-scheme.org——the Second Interpreter of Scheme Code).在这篇文章的例子当中,我们会用到Kawa,它实际上是个框架,能创造可编译成Java字节码的新语言.Scheme只是它的实现之一.趁便说一句,Kawa的成立者Per Bothner目前就任于Sun,主要从事JavaFX项目的编译器方面的工作.
别的一个值得一提的竟争对手是Clojure(clojure.sourceforge.net).这是一种新的语言,其Lisp方言(dialect)介于Scheme和Common Lisp之间.它是直接为JVM量身打造的,因此在上面提到的全部Lisp当中,有着最为清楚Java整合筹划.它还具有别的一些冲动人心的特点,比方内建的支持并发和事件内存.Clojure目前仍旧处于摸索测试阶段,因此在它底子上构建程序还有些为时髦早,但它绝对是一个值得关注的项目.
读取—求值—打印—循环
我们先来安装Kawa.它的分发版是一个单独的Jar文件,可以直接通过链接ftp://ftp.gnu.org/pub/gnu/kawa/kawa-1.9.1.jar下载.得到该Jar包后,就把它加进你的类途径上,这样你便可以通过运行以下号令启动REPL了:
java kawa.repl
#|kawa:1|#
该号令启动了Kawa,并显示一个提醒符.这此中毕竟有何奥妙呢?REPL(READ-EVAL-PRINT-LOOP)意思是读取—求值—打印—循环,这是与运行中的Lisp系统举行交互的方法——它“读取”你的输入,举行“求值”运算后,“打印”计算后果,如此反复“循环”.开辟Lisp程序的方法,与我们开辟Java程序时所遵守的“写代码、编译、运行”的周期差别.Lisp程序员需求鼓励他们的Lisp系统,保持它的运行状况,这样就令编译和运行时的边界模糊起来.在REPL中,函数和变量在履行历程中都是可以改正的,代码也是动态注释和编译的.
先来做点简单的事情:把两个数字加到一同.
#|kawa:1|# (+ 1 2)
3
这是Lisp表达式的典型构造大概说“格局”.语法都是一致的:表达式总被放在一对圆括号内,因为用的是前缀标记,所以“+”号要放在两个参量前.再来一个复杂点的构造,把几个格局嵌套在一同,成立一个树状构造:
#|kawa:2|# (* (+ 1 2) (- 3 4))
-3
Scheme的内建函数以同种机理工作:
#|kawa:3|# (if (> (string-length "Hello world") 5)
(display "Longer than 5 characters"))
Longer than 5 characters
上面程序中,用一个if语句来查抄某一特定字符串的长度能否超越5个字符,假如像例子中的那样查抄后果为真,就会履行紧随后来的表达式,该语句将会打印一条提醒信息.注意这里的缩进只是为了增添可读性,假如你乐意的话,可以在一行内写下全部的语句.
Lisp代码用的这种括号密集(parenthesis-heavy)的气势也称为“S表达式(s-expressions)”.它可兼作定义构造化数据的通用办法,就像XML一样.Lisp有很多内建的函数,你可以很便利的利用S表达式格局操作数据,这种便利转而促成Lisp的别的一个强盛上风:既然语法是如此简单,那么编写产生、改正代码的程序也要比别的语言简单得多.当我们演示宏(macros)的例子时,会理解到更多近似情形.
以上是“摸索JVM上的LISP[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |