探索JVM上的LISP - 编程入门网
"Never print this"))呢?当求值需要被延迟时,只有宏(macro)才能完成这个功能。
其次,我们在宏里用了变量i,如果在command表达式中碰巧有一个变量取相同的名字,这会不会产生冲突呢?这点不必担心,Scheme的宏以“卫生”著称。编译器会自动检测并熟知如何处理这样的命名冲突,对程序员是完全透明的。 了解到这些情况后,试想一下在Java中添加你自己的循环结构,这近乎不可能。也可以说,不是非常可能,毕竟编译器是开源的,所以你可以自由下载并恰当使用,但这真的是一个不太现实的选择。在其它动态语言中,闭包可以给你多些自由,对语言按照自己的习惯做些改动,但是仍然存在这种情况:他们的结构并没有足够灵活和强大到可以让你自由调整语法的程度。 这种能力就是为什么每当元编程语言或特定领域语言被提及时,Lisp总是以胜利者姿态出现的原因。Lisp程序员长期以来一直是彻头彻尾的“自底向上编程(bottom-up programming)”的冠军,因为当语言本身已经被调节为适合你的问题领域时,障碍会少许多。 在Java中调用Scheme代码 将别的语言运行在JVM之上的一个主要好处是,不管代码用何种语言写成,都可与现存的应用进行整合。因此很容易想象,可以用Scheme来模型化一些复杂的具有易变趋势的业务逻辑,然后将它嵌入一个比较稳定的Java框架中。规则引擎Jess(www.jessrules.com)是一个很好的范例,它运行于JVM之上,但是用自己的类Lisp语言来声明规则。 但是让不同的程序设计语言以一种界限清晰的方式协同工作还是一个棘手的问题,尤其是像Java和Lisp这样存在天壤之别的语言。如何做这种整合并没有标准,所有活跃在JVM上的方言都以不同的方式处理着问题。Kawa对于Java整合的支持相对较好,所以在下面的例子中,我们将继续用它来研究怎样用 Scheme代码来定义一个Swing GUI。 探索JVM上的LISP(4)时间:2011-01-27 infoq 译:张凯峰在Java程序中运行Kawa代码是很简单的:
在这个例子中,首先会在类路径上寻找包含Scheme程序的叫做swing-app.scm的文件,然后创建解释程序kawa.standard.Scheme的实例,调用它来解释文件中内容。 Kawa还不支持在Java 1.6中引入的JSR-223规定的脚本APIs(javax.scripting.ScriptEngine等),如果你需要能做这种事情的Lisp,最好的选择应该是SISC。 在Scheme中调用Java库 在我们开始写大型Lisp程序之前,是时候找个比较合适的编辑器了,否则光是验证括号匹配的工作就够让人发疯了。最受欢迎的选择之一肯定是Emacs,毕竟它可用自己的Lisp方言进行编程,不过对于Java开发者继续使用Eclipse可能更舒服些。如果你是这种情况就需要在工作开始之前先安装一个免费的SchemeScript插件。你可以在这个网站找到它。这里还有一个称为Cusp的插件,可以用于Common Lisp的开发。 现在,我们可以来看一下swing-app.scm的具体内容,以及用Kawa定义一个简单的GUI都需要做什么样的工作。这个例子将会打开一个带有按钮(button)的frame,按钮点击一次后它就会 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |