探索JVM上的LISP - 编程入门网
mdash;循环,这是与运行中的Lisp系统进行交互的方式——它“读取”你的输入,进行“求值”运算后,“打印”计算结果,如此反复“循环”。开发Lisp程序的方式,与我们开发Java程序时所遵循的“写代码、编译、运行”的周期不同。Lisp程序员需要激励他们的Lisp系统,保持它的运行状态,这样就令编译和运行时的界限模糊起来。在REPL中,函数和变量在执行过程中都是可以修改的,代码也是动态解释和编译的。
先来做点简单的事情:把两个数字加到一起。
这是Lisp表达式的典型结构或者说“格式”。语法都是一致的:表达式总被放在一对圆括号内,因为用的是前缀符号,所以“+”号要放在两个参量前。再来一个复杂点的结构,把几个格式嵌套在一起,建立一个树状结构:
Scheme的内建函数以同种机理工作:
上面程序中,用一个if语句来检查某一特定字符串的长度是否超过5个字符,如果像例子中的那样检查结果为真,就会执行紧随其后的表达式,该语句将会打印一条提示信息。注意这里的缩进只是为了增加可读性,如果你愿意的话,可以在一行内写下所有的语句。 Lisp代码用的这种括号密集(parenthesis-heavy)的风格也称为“S表达式(s-expressions)”。它可兼作定义结构化数据的通用方法,就像XML一样。Lisp有很多内建的函数,你可以很方便的应用S表达式格式操纵数据,这种便利转而促成Lisp的另外一个强大优势:既然语法是如此简单,那么编写产生、修改代码的程序也要比其它语言简单得多。当我们演示宏(macros)的例子时,会了解到更多类似情况。 探索JVM上的LISP(2)时间:2011-01-27 infoq 译:张凯峰函数 Scheme通常被看做是函数式程序设计语言大家庭中的一员。与面向对象领域不同,Scheme抽象的主要手段是函数和它操纵的数据,而不是类和对象。在这里,你所做的每一件事,实际上都是调用一些带有参数、能够返回运行结果的函数。你可以通过define关键字来创建函数:
以上代码定义了一个add函数,它接收a和b两个参数。函数体简单地执行加法(+)计算后自动返回执行结果。注意这里没有静态的类型声明,所有的类型检查都在运行时进行,这同其它动态语言中的方式并无二致。 定义了上面函数后,你可以很简单的在REPL中调用它:
在Scheme的世界里,函数是一等公民,它可以像Java中的对象一样被传递,这开启了一些非常有趣的可能性。下面我们将创建一个函数,它接收一个参数,并使它的值增加一倍:
然后通过调用list函数定义一个包含三个数字的列表:
下面是最令人兴奋的部分:
此处调用了带有两个参数的map函数:一个参数是个函数,另外一个参数是个列表(list)。map函数将遍历列表中的每个元素,将其作为参数调用所提供的函数,最后将所得结果组成一个新列表(list),正如我们在REPL中所看到的。这是可以实现Java中for循环功能的更加函数化的方法。 LAMBDAS 还有一个比较方便的地方在于可以利用lambda关键字定义匿名函数,这与Java匿名内部类工作机制类似。重新写上面的例程,跳过中间定义double函数那一段,map语句可写成如下形式:
定义 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |