- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第 2 章 函数
第 2 章 函数
函数不仅是 Lisp 程序的根基,它同时也是 Lisp 语⾔的基⽯。在多数语⾔⾥,+ (加
法) 操作符都和⽤户 定义的函数多少有些不⼀样。但 Lisp 采⽤了函数应⽤作为其统
⼀模型,来描述程序能完成的所有计算。
在Lisp ⾥,+ 和你 ⼰定义的函数⼀样,也是个函数。
事实上,除了少数称为特殊形式 (special form )的操作符之外, Lisp 的核⼼就是⼀个
函数的集合。有什么可以阻⽌你给这个集合添砖加⽡呢?答案是:
没有
如果你觉得某件事 Lisp 应该能做,那你完全可以把它写出来,然后你的新函数可以享
有和内置函数同等的待遇。
这对程序员产⽣了深远的影响。它意味着,或可以把任何⼀个新加⼊的函数都看作是
对Lisp 语⾔的扩充,也可以把它当成特定应⽤的⼀部分。典型情况是,有经验的Lisp
程序员两边都写⼀些,并不断调整语⾔和应⽤之间的界限,直到它们彼此完美地配合
在⼀起。本书要讲述的正是如何在语⾔和应⽤之间达到最佳的结合点。由于我们向这
⼀最终⽬标迈进的每⼀步都依赖于函数,所以 然应该先从函数开始。
2.1 作为数据的函数
有两点让 Lisp 函数与众不同。⼀是前⾯提到的:
Lisp 本⾝就是函数的集合。
这意味着我们可以 ⼰给 Lisp 增加新的操作符。另⼀个关于函数的重要问题,是要了
解:
函数也是 Lisp 的对象。
Lisp 提供了其他语⾔拥有的⼤多数数据类型。我们有整数和浮点数、字符串、数组、
结构体等等。但 Lisp 还⽀持⼀种乍看之下让⼈奇怪的数据类型:函数。⼏乎所有编程
语⾔都提供某种形式的函数或过程。那么,说 Lisp 把函数作为⼀种数据类型提供出
来 又是什么意思呢?这意味着在 Lisp ⾥我们可以像对待其他熟悉的数据类型那样来
对待函数,就像整数那样:在运⾏期创建⼀个新函数,把函数保存在变量和结构体⾥
⾯,把它作为参数传给其他函数,还有把它作为函数的返回值。
这种在运⾏期创建和返回函数的能⼒特别有⽤。这个优点可能初看起来还让⼈⼼存疑
虑,就好像那些可以在某些计算机上运⾏的可以修改 ⾝的机器语⾔程序⼀样。但对
于 Lisp 来说,在运⾏期创建新函数的技术简直就是家常便饭。
2.2 定义函数
多数⼈的学习会从 ⽤ defun 创建函数 开始。下⾯的表达式定义了⼀个叫 double 的函
数,其返回值是传⼊参数的两倍。
(defun double (x) (* x 2))
DOUBLE
如果把上述定义送⼊ Lisp ,我们就可以在其他函数⾥调⽤ double ,或者从最顶层
(toplevel) 调⽤:
(double 1)
2
Lisp 的源代码⽂件通常主要由类似这样的函数定义组成,这有⼏分类似 C 或者 Pascal
这些语⾔中的过程定义。但接下来就⼤不⼀样了。这些 defun 并不只是过程定义,它
们还是 Lisp 调⽤。在我们了解了 defun 背后的运作机制后,这种区别会更明显。
同时,函数本⾝也是对象。defun 实际所做的就是构造这样的对象,然后把它保存在
第⼀个参数名下。因此我们既可以调⽤ double ,也可以持有这个名字对应的函数对
象。要得到这个对象,通常的做法是使⽤ # (井号 + 单引号) 操作符。这个操作符的作
⽤可以理解成:它能将名字映射到实际的函数对象。把它放到double 的前⾯:
#double
#Interpreted-Fun tion C66ACE
我们就有了上⾯定义所创建的实际对象。尽管它的输出形式在不同的Lisp 实现中各不
相同,但 Common Lisp 的函数是第⼀类(first-class) 对象,它和整数和字符串这些更熟
悉的对象享有完全相同的权利。所以,我们既可以把这个函数作为参数传递,也可以
把它作为返回值返回,还能把它存在数据结构⾥,等等:
(eq #double ( ar (list #double)))
T
甚⾄可以不⽤ defun 来定义函数。和⼤多数 Lisp 对象⼀样,我们也可以通过其⽂字表
达的形式来引⽤它。
就像当我们提到⼀个整数时,只要使⽤这个数字本⾝那样。⽽表⽰字符串时,⽤括在
两个双引号之间的⼀
系列字符。如果要表达的是⼀个函数,我们可以使⽤⼀种称为–表达式(lambda-
expression) 的东西。–表达式是⼀个由三个部分组成的列表:lambda 符号、参数列
表,以及包含零个以上表达
您可能关注的文档
最近下载
- GB50086-2015 岩土锚杆与喷射混凝土支护工程技术规范.docx
- T GAIA 031—2025 人血清中米酵菌酸的测定 高效液相色谱-串联质谱法.pdf VIP
- 内蒙古森工集团招聘考试真题2024.docx VIP
- 铁路客运组织.pptx VIP
- 2025江苏苏州市农业发展集团有限公司下属子公司工作人员招聘13人考试备考试题及答案解析.docx VIP
- 火车过桥问题课件.ppt VIP
- 2025年农村生活污水治理资金申请专项报告.docx
- YS_T 1092-2015有色重金属冶炼渣回收的铁精粉.pdf
- 主体结构验收汇报施工单位最新.doc VIP
- 05X101-2 地下通信线缆敷设(OCR).pdf VIP
文档评论(0)