clojure-基本语法-函数定义

clojure-基本语法-函数定义

July 28, 2015 21:12 PM

1.创建函数

1.fn 匿名函数

举例如下:

user=> (fn [] "hello")
#<user$eval756$fn__757 [email protected]413e8>
user=> ((fn [] "hello"))
"hello"
user=> ((fn [x] x) "hello") ; 带参数
"hello"
user=>

简短的函数可以使用#(),%表示唯一的参数;%1、%2 ..表示第1、2、..个参数;%&表示所有参数,如下:

user=> (#(/ % 3) 4)
4/3
user=> (#(/ % 3) 4);结果为4/3
4/3
user=> (#(/ %2 %1) 3 4);结果为4/3
4/3
user=> (#(apply / %&) 3 5 7);结果为3/5/7
3/35
user=>

2.defn 公有函数 ns外可见

举例如下:

user=> (defn f2 [x] (format "hello %s" x));定义一个参数函数
#‘user/f2
user=> (f2 "girl")
"hello girl"
user=> (defn f4 "f4 function" [] (println "f4 function"));带注释的函数
#‘user/f4
user=> (f4)
f4 function
nil
user=> (doc f4);通过doc查看函数注释信息
-------------------------
user/f4
([])
  f4 function
nil
user=> (defn f5 ([]     (str "no parameter"))
  #_=>          ([name] (str "my name is " name)));定义重载的函数
#‘user/f5
user=> (f5)
"no parameter"
user=>  (f5 "clojure")
"my name is clojure"
user=>
user=> (defn f1 [& a] a);定义变参函数
#‘user/f1
user=> (f1 1 2 3)
(1 2 3)
user=> (defn m [& arg] (str arg ", size=" (count arg)));定义变参函数
#‘user/m
user=>  (m 1 2 3 4 5)
"(1 2 3 4 5), size=5"
user=> (m "a" 1 2.3 -1)
"(\"a\" 1 2.3 -1), size=4"
user=>
user=>  (defn f [a f1 b f2 c] (f2 (f1 a b) c));函数作为参数
#‘user/f
user=> (f 5 - 2 + 3)
6
user=> (defn f [a] (fn [b] (- a b)));函数作为返回值
#‘user/f
user=> ((f 7) 4)
3
user=>

3.defn- 私有函数 ns外不可见

举例如下:

user=> (ns test1);ns的意思是切换到指定的命名空间,如果不存在,则新建该命名空间
nil
test1=> (defn- foo [] "world");定义私有函数foo,返回字符串world
#‘test1/foo
test1=> (defn bar [] (str "hello " (foo)));定义公有函数bar,并调用私有函数foo
#‘test1/bar
test1=>

test1=> (foo);当前命名空间内调用foo函数
"world"
test1=>  (bar);当前命名空间内调用bar函数
"hello world"
test1=>

test1=>

test1=>  (ns test2);切换到test2命名空间中
nil
test2=>  (test1/bar);调用test1命名空间的bar函数,返回成功
"hello world"
test2=>  (test1/foo);调用test1命名空间的foo函数,出现异常,提示test1的foo函数不是公开的

CompilerException java.lang.IllegalStateException: var: #‘test1/foo is not public, compiling:(NO_SOURCE_PATH:1:1)
test2=> (ns user)
nil
user=>

4.comp 组合函数

形如:

((comp f1 f2 .. fn) arg1 arg2 .. argn)

就是对参数从右到左组合执行所有函数,可以转变为:

(f1 (f2 (.. (fn arg1 arg2 .. argn))))

举例如下:

计算 -(2 * 4)

user=> (defn f [x y] (- (* x y)));使用defn定义函数方式
;;#user/f
user=> (f 2 4)
;;-8
user=> (def fc (comp - *));使用comp定义组合函数方式
;;#user/fc
user=> (fc 2 4)
;;-8

5.partial 偏函数 或者“部分完整函数”,因为它是不完整的,定义也用def而不是defn。

形如:

((partial f arg1 arg2 .. argn) arga argb .. argz)

就是执行:

(f arg1 arg2 .. argn arga argb .. argz)

举例如下:

user=> (defn f [n] (* n 10));正常函数
;;#‘user/f
user=> (f 2)
;;20 
;;user=> (def fp (partial * 10));偏函数
;;#‘user/fp
user=> (fp 2)
;;20

6.constantly 恒量函数 接受一个参数x,返回一个变参函数,当 调用该 变参函数后,无论传入多少个任意参数,都返回x

user=>  (def consf (constantly "a"))
#‘user/consf
user=> (consf 1 2 3)
"a"
user=> (consf [1 2 3])
"a"
user=>

2.调用函数

1.-> 也称为 “thread” 宏: 调用一系列的函数,后一个函数迭代使用前一个函数返回结果作为第1个入参,返回最后一次的函数调用值

user=> (first (.split (.replace (.toUpperCase "a b c d") "A" "X") " "))
"X"
user=> (-> "a b c d" .toUpperCase (.replace "A" "X") (.split " ") first)
"X"
user=>

2.->> 调用一系列的函数,后一个函数迭代使用前一个函数返回结果作为最后一个入参,返回最后一次的函数调用值

user=> (-> 3 (/ 4))
3/4
user=> (-> 3 (/ 4) (/ 5))
3/20

user=> (->> 3 (/ 4))
4/3
user=> (->> 3 (/ 4) (/ 5))
15/4

3.eval函数 解析表达式数据结构(不是字符串!) 并返回结果.

举例如下:

user=> (doc eval)
-------------------------
clojure.core/eval
([form])
  Evaluates the form data structure (not text!) and returns the result.
nil
user=> (eval (+ 1 2))
3
user=> (doc read-string)
-------------------------
clojure.core/read-string
([s])
  Reads one object from the string s.

  Note that read-string can execute code (controlled by *read-eval*),
  and as such should be used only with trusted sources.

  For data structure interop use clojure.edn/read-string
nil
user=> (read-string "(println 1)")
(println 1)
user=> (eval (read-string "(println 1)"))
1
nil
user=>

4.apply函数 一次性地把一个集合里面的所有元素指定给后面的那个函数作为参数调用

举例如下:

user=> (apply + [1 2 3 4])
10

3.函数检查

fn?

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 16:39:33

clojure-基本语法-函数定义的相关文章

字符编码、文件操作、函数定义

一.字符编码 字符串是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有127个字符被编

ISO/IEC 9899:2011 条款6.9.1——函数定义

6.9.1 函数定义 语法 1.function-definition: declaration-specifiers    declarator    declaration-listopt    compound-statement declaration-list: declaration declaration-list    declaration 约束 2.在一个函数定义中所声明的标识符(它是函数名)应该是一个函数类型,它通过函数定义的声明符部分指定.[注:这样的目的是在一个函数定义

Scala深入浅出实战经典-----002Scala函数定义、流程控制、异常处理入门实战

002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 原因是集成开发环境自带的版本为2.11.0 变量 常量(不可变)声明 val 变量声明 var 无参函数的调用也无需加括号() 定义有参有返回值的函数 def 函数名称(参数名称:参数类型...):返回值类型={ 函数体 } 老师代码 注意最后一个是b是本函数的返回值 默认最后一行为返回值 流程控

关于JS中的函数定义及函数表达式

在初学JS的过程中,老是不能区别什么是函数表达式什么是函数定义,这对基础知识的夯实是不利的.因此查阅资料,认真对其进行了区别. 简单总结如下: 1.区别一:以function开头的函数纪委函数定义,其他则为函数表达式: 2.区别二:函数表达式可以省略函数名. function FunctionName(FormalParameterList) { FunctionBody } //函数定义 function [FunctionName](FormalParameterList) { Functi

第9课 - 函数定义及调用

第9课 - 函数定义及调用 1. makefile中的函数 (1)make 解释器提供了一系列的函数供 makefile 调用 (2)在 makefile 中支持自定义函数实现,并调用执行 (3)通过 define 关键字实现自定义函数 2. 在makefile中自定义函数 (1)自定义函数的语法 其中,$(0) 代表被调用的函数名,$(1) , $(2) , $(3) ... 代表调用函数时后面的传参 (2)深入理解自定义函数 - 自定义函数是一个多行变量,无法直接调用 - 自定义函数是一种过

Scala深入浅出实战经典-----002-Scala函数定义、流程控制、异常处理入门实战

002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 原因是集成开发环境自带的版本为2.11.0 变量 常量(不可变)声明 val 变量声明 var 无参函数的调用也无需加括号() 定义有参有返回值的函数 def 函数名称(参数名称:参数类型...):返回值类型={ 函数体 } 老师代码 注意最后一个是b是本函数的返回值 默认最后一行为返回值 流程控

002-Scala函数定义、流程控制、异常处理入门实战

002-Scala函数定义.流程控制.异常处理入门实战 Scala函数定义 语句结束无分号 定义无参函数 def 函数名称(参数名称:参数类型)[:Unit=]{ 函数体 } 老师的代码 我的实际代码 原因是集成开发环境自带的版本为2.11.0 变量 常量(不可变)声明 val 变量声明 var 无参函数的调用也无需加括号() 定义有参有返回值的函数 def 函数名称(参数名称:参数类型...):返回值类型={ 函数体 } 老师代码 注意最后一个是b是本函数的返回值 默认最后一行为返回值 流程控

JavaScript 函数定义方法

JavaScript 函数定义方法. 函数声明 在之前的教程中,你已经了解了函数声明的语法 : function functionName(parameters) { 执行的代码 } 函数声明后不会立即执行,会在我们需要的时候调用到. function myFunction(a, b) { return a * b; } 分号是用来分隔可执行JavaScript语句. 由于函数声明不是一个可执行语句,所以不以分号结束. 函数表达式 JavaScript 函数可以通过一个表达式定义. 函数表达式可

Lua学习---函数定义

1.函数定义的格式: Lua使用function定义函数,语法如下: function function_name (arc) --arc表示参数列表,函数的参数列表可以为空 --body end 上面的语法等价于: function_name function_name (arc) --body end_ 上面的方法都是定义了一个全局函数,为了不污染命名空间,同时减少性能损耗,我们应该尽量使用"局部函数",方法如下(只需要再前面加local声明即可): local function