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

原创 2012年06月07日 18:23:27

进一步了解一下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函数的参数定义还有更复杂的形式,如可选参数,关键字参数等,在以后的文章中我们继续学习。


lisp函数知识大全

AutoLISP提供了大量的预定义函数。若将函数名(大小写都可)作为表中的第一个元素函数变元(若有的话)作为表中后面的元素,就可以调用那个函数。本章按字母顺序列出AutoLISP所有基本函数。用户会发...
  • u012938194
  • u012938194
  • 2015年03月27日 17:19
  • 2416

Lisp语言:函数的可选参数,剩余参数以及关键字参数

上一篇有关Lisp函数的文章简单介绍了函数的定义和调用,其中使用的参数是一般的参数。为了方便大家,将那篇文章的链接列出:http://blog.csdn.net/keyboardota/article...
  • keyboardOTA
  • keyboardOTA
  • 2012年06月15日 01:03
  • 4190

Lisp.定义函数

多数人通过defun来学习怎样定义函数。下面的表达式定义了一个叫做double的函数,这个函数返回它参数的两倍。 [1]> (defun double (x) (* x 2)) DOUBLE ...
  • airinsoul
  • airinsoul
  • 2011年09月13日 23:10
  • 3264

lisp中的变量

支持两种类型变量:词法变量(lexical)和动态变量(dynamic),分别对应于其他语言中的局部变量和全局变量,只能说是大致相似,并不是所有的语言都有lisp中的闭包的词法作用域变量 与其他...
  • ryuali2010
  • ryuali2010
  • 2012年07月19日 23:21
  • 2966

Lisp语言:变量以及变量的作用范围

到现在才讨论变量似乎有点迟,在过去的文章中我们已经很多次使用变量。之所以到现在才讨论变量是因为不想各位因为复杂的变量使用规定感到困惑。如果只是基本使用,理解变量确实可以很简单。就像在之前的几篇文章中,...
  • keyboardOTA
  • keyboardOTA
  • 2012年06月21日 15:47
  • 5122

Lisp.函数参数

将函数看做数据意味着,我们可以将它们作为参数传递给其它函数。这种能力是Lisp自下而上编程非常重要的一部分。 一个允许函数作为数据对象的语言必须提供一些调用它们的方式。在Lisp中,这个函数...
  • cnweike
  • cnweike
  • 2011年09月16日 17:05
  • 1650

lisp 函数(一)

一:定义新函数 1:(defun name (parameter*) "optional documentation string" Body-form*) Name: 可以是任何包含字典...
  • ryuali2010
  • ryuali2010
  • 2012年07月19日 16:38
  • 1947

Lisp语言:Do循环的使用

有关Lisp语言中的Do循环,就像很多人说的一样,初看起来太奇怪了,不知道怎么理解。所以在这里做一个简单的介绍,看完大家可以发现其实Lisp中的do循环也是比较简单的。 先看看Lisp语言中对于do循...
  • keyboardOTA
  • keyboardOTA
  • 2012年11月29日 17:35
  • 6731

Lisp语言:循环控制

了解了Lisp语言的条件判断,让我们看看Lisp语言的循环控制。对于稍有编程经验的人来说,循环是比较容易理解的,一般语言里面的循环无外乎for循环,while循环,do until循环等,有些语言的循...
  • keyboardOTA
  • keyboardOTA
  • 2012年06月05日 09:28
  • 6419

Lisp语言:控制台输出与输入

Lisp全名是Lisp Processor,就是列表处理语言的意思,所以Lisp语言以列表为中心。正因为这个原因,很多Lisp语言的教程在简单介绍基本Lisp后就开始讨论Lisp中的列表,出现一堆令人...
  • keyboardOTA
  • keyboardOTA
  • 2012年05月29日 23:58
  • 6162
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Lisp语言:函数的定义,调用以及参数的传递
举报原因:
原因补充:

(最多只允许输入30个字)