`
songry
  • 浏览: 84374 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

Clojure细节之form和special form的区别

阅读更多

前言

    在lisp程序员看来,form和special form的区别是一目了然而且无需解释的--因为这两个

概念本身就源自lisp.但对于指令式语言的开发人员而言,当他们进入clojure的世界中,会不

断看到和听到这两个名词,然后会把special form理解为某种关键字或者是宏之类的东西.

这样的理解实际上是有一定偏差的.

form

    首先让我们来看看Clojure中的form,最简单的form就是由函数和它的参数们构成:

(+ 1 2 3 4)

    +是一个函数,后面的1,2,3,4都是这个函数的实际参数.执行这个form的过程是对所有的

参数进行求值,当前情况,对数字求值的结果就是得到数字本身的数值,然后把这些数值作为

参数传递给+函数.

    复杂一点的form则是form中的函数以及参数都由其他form构成,比如:

((partial + 5) (* 1 2) (- 3 4))

    执行时,会对每一个参数进行求值,第一个位置求值的结果是个用5来和其他参数相加的

函数,第二个位置求值的结果是1和2相乘的值,第三个位置求值的结果是3减去4的值,然后

再对整体form求值,将后两个位置的值作为参数传递给第一个位置得到的函数.

    由上我们可以得知,form的组成规则是(函数 若干个参数),form的执行规则是首先对所有

参数求值,然后把若干个参数求值的结果作为实际参数传递给第一个位置求值得到的函数

并执行这个函数得出结果,毫无疑问,这是一个树形的结构,先对分支求值,然后回到主体,对

主体进行求值,最后得出结果.

    那么我们来看看special form是怎样的呢.

special form

    首先我们看看最简单的special form,变量赋值:

(def a 1)

    如果我们用form的方式来进行执行,会发生什么情况呢?

    首先,我们会对所有参数求值,def看起来是个库函数,我们先不管它,对参数a求值......等等,

a是个什么东西,它并没有指向任何的值啊.这儿就无法执行下去了,所以,(def a 1)这个东西

并非一个form,而是一个special form.

    到此,我们应该能够明白了,special form其实就是不遵从一般form的组成规则和执行规则

的特殊form,它的组成规则和执行规则是由库约定的.像上面的(def a 1)就是指把数值1赋给

变量a,而不是对a和1求值,然后作为参数传递给def.

    让我们再看看另外一个special form,条件判断:

(if (= a 1) (println 1) (println 2))

    如果我们按照form的方式求值,那么明显地,后面的两个打印函数都会执行;但实际的运行中

只会有一个打印结果,也就代表着只会对某个打印函数求值而不是两个都同时求值,这样也充分

体现了special form和form的不同.

 

 

 

分享到:
评论
1 楼 lanily 2014-07-09  
楼主,跟你学clojure了,我想请教一个问题:
本人事先是用java的,所以再写clojure时,会遇到要去背大量的库和函数,clojure有没有类是eclipse的工具,具有自动提示和导入库功能?

相关推荐

    clojure电子书

    《Clojure电子书》集合包含了三本关于Clojure编程的重要书籍和一个Leiningen的Windows安装程序,这对于学习和深入理解Clojure语言至关重要。Clojure是一种基于Lisp的函数式编程语言,它运行在Java虚拟机(JVM)上,...

    Programming Clojure 英文电子版

    - **Java Integration**:由于Clojure运行在JVM之上,因此它可以无缝地访问Java类库中的所有资源。这种紧密集成意味着开发者可以在Clojure项目中使用Java类库提供的强大功能,而无需进行额外的转换或封装。 - **...

    Clojure编程乐趣]+clojure_programming.pdf

    Clojure是一种基于Lisp家族的函数式编程语言,它运行在Java虚拟机(JVM)上,同时也支持JavaScript和其他平台。Clojure的设计目标是提供一个高效、并发、可移植的环境,适合解决现代软件开发中的复杂问题。在这个...

    Practical Clojure.pdf

    因为Clojure运行在Java虚拟机(JVM)之上,开发者可以继续使用熟悉的平台、库和工具。 Clojure语言中的并发性是一个重要特性,它允许开发者更轻松地处理并发任务,而不用担心线程管理和其他并发问题。这是因为...

    clojure1.3.0及资料

    1. **《Programming Clojure》**:这本书由Stuart Halloway和Aaron Bedra编写,是Clojure编程的经典教材之一。它全面介绍了Clojure的基础知识,包括数据结构、控制流、函数式编程概念、元编程以及与Java的交互。...

    Clojure Data Analysis Cookbook

    - **社区资源和工具**:列出了一系列 Clojure 社区提供的工具和库,以及如何参与开源贡献的方法。 #### 四、本书适用人群 - **数据科学家和分析师**:希望通过 Clojure 提升数据分析能力的专业人士。 - **程序员*...

    Clojure入门教程- Clojure – Functional Programming for the JVM中文版

    - **Clojure项目实战**: 通过实际项目来学习Clojure是最有效的方法之一。可以从简单的项目开始,逐步过渡到更复杂的系统开发。 - **Clojure与大数据**: Clojure与Apache Storm等大数据框架结合得非常好,可以用于...

    programming-clojure-3rd

    《Programming Clojure 第三版》是一本深入探讨Clojure编程语言的专业书籍,旨在帮助开发者全面理解和掌握这门基于Lisp的现代函数式编程语言。Clojure是由Rich Hickey设计的,它运行在Java虚拟机(JVM)上,同时也...

    clojure eclipse

    这与面向对象编程有很大的区别,函数式编程更注重状态不变性和无副作用,有助于编写可预测和易于测试的代码。 Clojure的另一个特点是其与Java的无缝集成。由于运行在JVM上,Clojure可以直接调用Java库,甚至可以...

    Living Clojure

    《Living Clojure》是美国亚马逊上获得高分评价的一本关于Clojure语言的学习资料。...这本书的出版,对于推动Clojure编程语言的学习和应用,以及对学习函数式编程感兴趣的读者,都具有积极的价值和意义。

    Professional.Clojure.1119267277

    Clear, practical Clojure for the professional programmer Professional Clojure is the experienced developer's guide to functional programming using the Clojure language. Designed specifically to meet ...

    clojure相关书籍1

    【1】[Clojure编程乐趣](The Joy of Clojure).pdf 【2】Clojure – Functional Programming for the JVM中文版.pdf 【3】Clojure Cookbook.pdf 【4】Clojure Data Analysis Cookbook.pdf 【5】clojure Hand book...

    Clojure Handbook(2012.11.1)

    Clojure是一种现代的Lisp方言,运行在Java虚拟机(JVM)上。作为一种函数式编程语言,它被设计为一种既高效...通过阅读Handbook,读者可以建立起对Clojure语言的初步认识,并逐步深入到语言的各个细节和高级特性中去。

    Lacinia纯Clojure实现的GraphQL

    6. **与库和框架的集成**:Lacinia可以很好地与其他Clojure库和Web框架(如Compojure、Ring)集成,构建完整的GraphQL服务器。 **使用Lacinia的步骤** 1. **安装Lacinia**:通过Leiningen或Clojars将Lacinia添加到...

    clojure1.4包

    在 Clojure 1.4 包中,包含了 Clojure 1.4.0 的核心库和相关工具,这允许开发者在没有网络环境的情况下也能进行 Clojure 开发。要开始使用,你需要解压文件,然后在终端或命令行中启动 Clojure 的 REPL,通过 `...

    Clojure电子书合集1(12本)

    [2009] Programming Clojure.(Stuart Halloway).[1934356336].pdf [2010] Functional Programming with Clojure - Simple Concurrency on the JVM.(Tim Berglund, Matthew McCullough).[193650202X].pdf [2010] ...

Global site tag (gtag.js) - Google Analytics