创建我们自己的clojure函数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/iceyung/article/details/85875459

Clojure是一门函数式语言,因此函数是其主要特征之一1
之前我们使用了内建的一些函数,当然我们也可以生成自己的函数。

我们先来看一下怎么样使用defn来生成函数:

(defn example []
  (println ("Hello Clojure !")))
;;-> Hello Clojure !

一个函数也是可以定义为带参数的,同样我们可以采用defn来定义这个带参数函数:

(defn example [name]
  (println (str "Hello " name)))
(example "clojure")
;;-> Hello clojure

简单的了解完defn的用法之后我们来详细的看一看我们自己的函数都有哪些需要我们掌握的。

def和let

  • def:使用def来创建全局var
(def user "clojure")
;;-> clojure
;;绑定user变量值为clojure
  • let:使用let来创建临时绑定
(let [user "clojure"]
(println user))
;;-> clojure
;;创建临时绑定user,user的作用域在let括号内超出该范围无效

命名空间

命名空间用来组织并控制对var的访问,可以通过ns来创建自己的命名空间并切换使用。暂可类比于java的包空间,有类似的效果,在Clojure项目中将会大范围使用到,上一节中创建容器中也使用的ns来声明命名空间。

*ns*
;;-> #object[clojure.lang.Namespace 0x1c50df98 "user"]
;;不同的机器有差异
(ns user.clojure)
;;-> nil
;;声明自己的命名空间
(ns user.clojure2
(:require [user.clojure :as uc]))
;;引用已有的命名空间,并取别名为uc,可以通过uc/example来调用user.clojure中的函数
(ns user.clojure2
(:require [user.clojure :refer :all]))
;;加载user.clojure中所有符号,直接使用不用加前缀,这样有一定的风险,若存在不同命名空间内相同函数名的函数时会出现冲突

匿名函数

(fn [] (println "hello clojure"))
;;也可以加参数
(fn [user] (println (str "Hello " name)))

Clojure中函数可以作为参数来进行赋值,一切代码都是数据,所以通过def字段也可以实现类似defn的效果。

def example (fn [user] (println (str "Hello " name)))

还有一种更简洁的匿名函数的写法:

(#(str "hello " %) "clojure")
;;-> hello clojure
;;如果存在多个参数,可以使用%1,%2等

简单的例子

(defn javaOrClojure [language]
  (if (= language "java")
    (println "这是java语言 ")
    (println "这不是java语言 "))
  (if (= language "clojure")
    (println "这是clojure语言 ")
    (println "这不是clojure语言 ")))
(javaOrClojure "java")
(javaOrClojure "clojure")
;这是java语言
;这不是clojure语言
;这不是java语言
;这是clojure语言 

还存在一种函数为defn-,该修饰符为命名空间特有函数,不能跨空间使用类似于private属性,接下来有机会再介绍。可通过在线编译工具2感受一下Clojure的魅力,Clojure函数详解可以参考引文书籍和W3School教程3


  1. Living Clojure(中文版):中国电力出版社 ↩︎

  2. Clojure在线编译工具:http://www.dooccn.com/clojure/ ↩︎

  3. Clojure函数:https://www.w3cschool.cn/clojure/clojure_functions.html ↩︎

猜你喜欢

转载自blog.csdn.net/iceyung/article/details/85875459