您的位置:首页 > 其它

Lisp语言:函数的定义,调用以及参数的传递

2012-06-07 18:23 309 查看
进一步了解一下Lisp语言中函数的使用,虽然从这篇文章才开始介绍函数,但是我们在之前的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函数的参数定义还有更复杂的形式,如可选参数,关键字参数等,在以后的文章中我们继续学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐