快速业务通道

探索JVM上的LISP - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20
mdash;循环,这是与运行中的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(2)

时间:2011-01-27 infoq 译:张凯峰

函数

Scheme通常被看做是函数式程序设计语言大家庭中的一员。与面向对象领域不同,Scheme抽象的主要手段是函数和它操纵的数据,而不是类和对象。在这里,你所做的每一件事,实际上都是调用一些带有参数、能够返回运行结果的函数。你可以通过define关键字来创建函数:

#|kawa:4|# (define (add a b) (+ a b))

以上代码定义了一个add函数,它接收a和b两个参数。函数体简单地执行加法(+)计算后自动返回执行结果。注意这里没有静态的类型声明,所有的类型检查都在运行时进行,这同其它动态语言中的方式并无二致。

定义了上面函数后,你可以很简单的在REPL中调用它:

#|kawa:5|# (add 1 2)  3

在Scheme的世界里,函数是一等公民,它可以像Java中的对象一样被传递,这开启了一些非常有趣的可能性。下面我们将创建一个函数,它接收一个参数,并使它的值增加一倍:

#|kawa:6|# (define (double a) (* a 2))

然后通过调用list函数定义一个包含三个数字的列表:

#|kawa:7|# (define numbers (list 1 2 3))

下面是最令人兴奋的部分:

#|kawa:8|# (map double numbers)  (2 4 6)

此处调用了带有两个参数的map函数:一个参数是个函数,另外一个参数是个列表(list)。map函数将遍历列表中的每个元素,将其作为参数调用所提供的函数,最后将所得结果组成一个新列表(list),正如我们在REPL中所看到的。这是可以实现Java中for循环功能的更加函数化的方法。

LAMBDAS

还有一个比较方便的地方在于可以利用lambda关键字定义匿名函数,这与Java匿名内部类工作机制类似。重新写上面的例程,跳过中间定义double函数那一段,map语句可写成如下形式:

#|kawa:9|# (map (lambda (a) (* 2 a)) numbers)   (2 4 6)

定义

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号