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

摸索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编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • 摸索JVM上的LISP
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

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