赞助商链接

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

java lisp,摸索JVM上的LISP[Java编程]相关推荐

  1. 探索JVM上的LISP

    当前Java领域最激动人心的事情莫过于可允许其它编程语言运行于Java虚拟机上.围绕JRuby.Groovy.Scala还有 Rhino(JavaScript引擎)的讨论已经甚嚣尘上.可为什么要墨守陈 ...

  2. jvm7 jvm8_在JVM上探索LISP

    jvm7 jvm8 目前,Java世界上最激动人心的事情之一就是正在努力使其他编程语言在虚拟机上运行. 关于JRuby,Groovy,Scala和JavaScript引擎Rhino的讨论很多. 但是为 ...

  3. Java笔记-Java日常笔记-Java核心语言-史上最全Java笔记-Java烂笔头-实时更新(~v~)

    阿一的日常Java笔记,实时更新,有什么问题可以留言交流一下,大家一起共同进步!!! 1.Java基础 1.1.基本语法 1.1.1.关键字 ​ 定义:被java赋予特殊含义的字符串(单词): ​ 关 ...

  4. java云服务器怎么上传文件大小,java云服务器怎么上传文件大小

    java云服务器怎么上传文件大小 内容精选 换一换 SAP S/4HANA实例节点数据磁盘需要进行格式化,并挂载到相应的目录后,才能被正常使用.登录待安装SAP S/4HANA的云服务器"s ...

  5. linux 定时java程序,Linux操作系统上定时运行Java程序的方法

    运行crontab -e编辑一个job. 例如 0 30 * * * /home/your_login/bin/java_PRogram | | | | | | | | | | | | | | -da ...

  6. 通过Java反射获取对象上的注解,java反射注解妙用-获取所有接口说明

    原标题:java反射注解妙用-获取所有接口说明 转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10293490.html 前言 最近在做项目权限,使用shir ...

  7. java与tomcat,Centos上安装配置java和tomcat

    java java版本 1:配置环境变量 centos中配置环境变量稍有不同,要了解centos中如何配置环境变量首先需要理解一下几个简要的概念 * /etc/profile  和  /etc/pro ...

  8. java muti实现图片上传_MutiFileUpload.java 多文件上传

    package app.other.commons.file; import java.io.UnsupportedEncodingException; ..... / ^v^ **  * @vers ...

  9. java 捕获 nullpointerexception,Android上无法捕获java.lang.NullPointerException

    错误: java.lang.NullPointerException at com.lala.Home.hideLoadinganimation(Home.java:969) at com.lala. ...

最新文章

  1. mysql连接池失效_连接池隔天失效之异常处理
  2. 通过RS232发送和接收短信(二)
  3. Java 使用 URLConnection 模拟 Http Get和Post 提交
  4. Python【每日一问】21
  5. 如何安装指定版本的 SAP Spartacus
  6. VMware打开虚拟机黑屏
  7. android 拨打电话与发送短信
  8. java后端通过Filter过滤器解决跨域问题
  9. git拉取github上的分支和本地分支提交到github
  10. 二年级孩子适合学C语言吗,小孩子适合学习编程吗?孩童时期对变成的接受程度有多少呢?...
  11. LaTeX 技巧 802:国内期刊 CCT 模板编译经验
  12. matlab绘正态/卡方/t/F分布概率密度图
  13. 由Yardi赞助的报告披露亚太房地产科技投资详情
  14. Python网页爬虫工具有哪些?
  15. Anaconda prompt 提示系统找不到指定路径
  16. C++ STL源码分析——一个万用的 hash function
  17. 短视频应用应该如何打造技术架构?
  18. 关键词优化-网站关键词优化软件-关键词优化工具
  19. 关于Spring-Data-Mongodb中的project()的用法,和previousOperation()的用法
  20. RecyclerView 的 adapter.notifyItemChanged(position) 导致该条目布局放生改变

热门文章

  1. 操作系统LAB1实验报告
  2. 前端学习日志-4-js
  3. 18对个人财富的窥视——对一款手机木马的解读及分析
  4. STM32F4+DP83848以太网通信指南系列(一):知识储备
  5. 避免localStorage被更改 让localStorage禁止修改值
  6. 在已有公众号发布微信小程序
  7. 决策树(一)——构建决策树
  8. 128陷阱解析(Java中的128陷阱)
  9. ChessBoard棋盘覆盖问题
  10. 判断是否保持函数依赖