Lisp语言:函数的定义,调用以及参数的传递
2012-06-07 18:23
309 查看
进一步了解一下Lisp语言中函数的使用,虽然从这篇文章才开始介绍函数,但是我们在之前的Lisp文章中已经多次接触函数了。
函数的定义
在Lisp中函数的定义使用下面的格式:
其中defun是函数定义的关键字,function1是函数名,跟着的()是参数定义,在这里不需要参数,所以()中间是空的,然后(format *query-io* "in function1~%")是函数体,就是调用函数时需要执行的代码。
其中的函数体可以是任意多行的语句,如下面这样:
函数的调用
函数的调用比较简单,使用括号加函数名就可以了,如(function1)。
函数的返回
在没有加入返回语句的情况下,一个函数的最后一个语句的计算结果会被当作函数的返回值返回给调用者,如下面的代码中,main函数调用function1函数,而function1函数的最后一个语句计算结果是“value to return”,所以在main函数中调用function1函数后会将变量result赋值为“value to return”,然后通过format语句将result的结果打印出来:
需要注意的是return-from函数的第二个参数是函数名,从哪个函数返回就写哪个函数的函数名,如果一个函数的函数名有修改记得修改return-from对应的函数名。
这一点多少有点令人不满,为什么从函数返回还要指定函数的名称,不像Lisp简洁的风格。
参数的定义
上面提到的函数都市没有参数的,现实中定义和使用函数一定会需要参数,Lisp中函数的参数如何定义呢?
Lisp中函数的参数定义在函数名后面的括号中,如下面的代码就定义了a 和b 两个参数。因为Lisp使用的是动态类型,而非静态类型,所以参数是不需要指定类型的,不像c语言那样需要(int a , String b)这样定义参数。
对于有参数的函数,调用时需要在函数名后带上相同数量的变量作为实际参数,如function3的调用如下,其中10会被赋予变量a,而20会被赋予变量b。
如果函数调用是填写的参数数量和函数定义时不同,执行时会报错的。
如(function3 10)会报参数太少,而(function3 10 20 30)会报参数太多。
有关Lisp函数的参数定义还有更复杂的形式,如可选参数,关键字参数等,在以后的文章中我们继续学习。
函数的定义
在Lisp中函数的定义使用下面的格式:
(defun function1 () (format *query-io* "in function1~%"))
其中defun是函数定义的关键字,function1是函数名,跟着的()是参数定义,在这里不需要参数,所以()中间是空的,然后(format *query-io* "in function1~%")是函数体,就是调用函数时需要执行的代码。
其中的函数体可以是任意多行的语句,如下面这样:
(defun function1 () (format *query-io* "in function1 line 1~%") (format *query-io* "in function1 line 2~%") (format *query-io* "in function1 line 3~%"))
函数的调用
函数的调用比较简单,使用括号加函数名就可以了,如(function1)。
函数的返回
在没有加入返回语句的情况下,一个函数的最后一个语句的计算结果会被当作函数的返回值返回给调用者,如下面的代码中,main函数调用function1函数,而function1函数的最后一个语句计算结果是“value to return”,所以在main函数中调用function1函数后会将变量result赋值为“value to return”,然后通过format语句将result的结果打印出来:
(defun main () (setq result (function1)) (format *query-io* "result is: ~a~%" result) ) (defun function1 () (format *query-io* "in function1~%") "value to return")如果希望提前从一个函数中返回,需要用到return-from函数,如下面的代码中函数function1执行到第二句的时候直接调用return-from返回了“value returned by return-from”作为返回值,后面的语句就不执行了,main函数中result的结果就是“value returned by return-from”
(defun main () (setq result (function1)) (format *query-io* "result is: ~a~%" result) ) (defun function1 () (format *query-io* "in function1~%") (return-from function1 "value returned by return-from") (format *query-io* "this line will not be reached") "value to return")
需要注意的是return-from函数的第二个参数是函数名,从哪个函数返回就写哪个函数的函数名,如果一个函数的函数名有修改记得修改return-from对应的函数名。
这一点多少有点令人不满,为什么从函数返回还要指定函数的名称,不像Lisp简洁的风格。
参数的定义
上面提到的函数都市没有参数的,现实中定义和使用函数一定会需要参数,Lisp中函数的参数如何定义呢?
Lisp中函数的参数定义在函数名后面的括号中,如下面的代码就定义了a 和b 两个参数。因为Lisp使用的是动态类型,而非静态类型,所以参数是不需要指定类型的,不像c语言那样需要(int a , String b)这样定义参数。
(defun function3 (a b) (format *query-io* "parameter a is: ~a b is: ~a~%" a b ))
对于有参数的函数,调用时需要在函数名后带上相同数量的变量作为实际参数,如function3的调用如下,其中10会被赋予变量a,而20会被赋予变量b。
(function3 10 20)
如果函数调用是填写的参数数量和函数定义时不同,执行时会报错的。
如(function3 10)会报参数太少,而(function3 10 20 30)会报参数太多。
有关Lisp函数的参数定义还有更复杂的形式,如可选参数,关键字参数等,在以后的文章中我们继续学习。
相关文章推荐
- Lisp语言:函数的定义,调用以及参数的传递
- 初探linux内核编程,参数传递以及模块间函数调用
- javascript函数的定义与调用以及参数传递
- 父类与子类之间静态函数的调用以及函数参数的传递
- 初探linux内核编程,参数传递以及模块间函数调用
- jquery,定义函数,调用函数function,函数function之间参数传递
- 初探linux内核编程,参数传递以及模块间函数调用
- 函数的概念、定义、调用、参数传递、作用域
- 初探linux内核编程,参数传递以及模块间函数调用
- x64 调用约定,参数传递以及函数返回值
- JavaScript学习笔记第一天——定义函数以及参数调用
- python知识点1之引用、拷贝、函数参数传递、实例调用了类变量
- C++数组(二维数组)与指针 以及 函数传递/返回指针和数组参数
- 可变参数模拟printf()函数实现一个my_print()函数以及调用可变参数需注意的陷阱
- python 函数调用时传递参数的一些规范
- JavaScript中简单函数定义调用,以及函数劫持
- 关于C语言中函数调用和参数传递机制的探讨(ZZ)
- javascript入门系列演示·函数的定义以及简单参数使用,调用函数
- 编写一个程序,其main()调用一个用户定义的函数(以光年值为参数,并返回对应天文单位 的值).该程序按下面的格式要求用户输入光年值
- Python教程学习简记2--Python 函数调用 定义函数 函数的参数 递归函数