EE师傅叫找的的

原创 2004年10月03日 21:20:00

http://blog.csdn.net/windoze/archive/2004/08/01/57796.aspx

一集我们讲到了“函数”,其实这个概念早在初中数学里就已经学过了,一个函数无非就是将自变量映射到值的对应关系,在Lisp里也一样。

Lisp中的函数定义我们已经在上节给出(快速抢答:谁还记得请举手),在Lisp中采用如下形式描述一个函数:

(lambda (p1 p2 ... pn) e)

其中,pi为原子,在函数中称之为参数,e是表达式,也就是函数体。

调用一个函数的方式如下:

((lambda (p1 p2 ... pn) e) a1 a2 ... an)

其中ai为表达式,按照我们的惯例,称之为实参。

整个函数的调用过程如下:每一个表达式ai(实参)先求值,然后再将这些实参代入e中求值,最后的结果即为整个表达式的返回值。

如果一个表达式的第一个元素是一个原子,但不是基本操作符(也就是我们先前提到的那7个),如:

(f a1 a2 ... an)

并且f的值是一个函数(lambda (p1 p2 ... pn) e),则上述表达式等价于

((lambda (p1 p2 ... pn) e) a1 a2 ... an)

看了这一段,可能大家都有点晕,到窗口去做几个深呼吸,然后回来做下面这个练习,看看这个表达式的结果是什么?

((lambda (f) (f '(b c))) '(lambda (x) (cons 'a x)))

如果你得出了结果,那么继续往下看,否则再把前面几段话多读几遍,把上面的练习输入到一个能自动匹配括号的文本编辑器里继续研究。

在这里我打算插几句题外话,可能有很多人已经见识过这个lambda了,不过不太可能是在Lisp里(要是这样的话你就应该不用来看这片“入门”了,不是吗?),而多半是在Python里,Python手册中对这个lambda仅仅是一笔带过,他大概是这么说的:“使用lambda这个词是因为它类似于Lisp语言里同名的一个语法结构。”好了,我们现在就来看看lambda这个典故的真正起源。

lambda这个词来源于lambda演算理论。lambda是什么?对于现在的人来说,这个概念不过就是“函数”而已,但是对于lambda演算理论的出现的那个年代来说,它可是一种革命性的创新。lambda演算理论过于复杂,而且作为一篇Lisp的简介,讨论它已经完全偏离了主题,但是它所提出的另一个概念——高阶函数(High Order Function)——却在Lisp语言中占有重要的地位,甚至可以说是Lisp如此与众不同的主要原因。

正如“高阶导数”就是“导数的导数”一样,所谓高阶函数,其实就是“函数的函数”(高数老师,原谅我吧)。即把一个函数本身当作另一个函数的自变量(在现代的C++中提出的“functor”这个概念其实就是高阶函数在C++中的一种实现)。高阶函数的出现,将“函数”在编程语言中的地位提升到一个“一等公民”的地位,你可以像操作任何基本数据类型一样操作一个函数,对它进行变换、传递,随你怎么折腾。

下面我们回到正题,继续讨论Lisp中的函数,我们可以看到,至今为止,我们的函数都还没有名字,函数可以没有名字,也就是匿名函数正是Lisp的另一大特色,Lisp可以让程序员把数据和名字剥离开,这对于许多其它的编程语言来说是直到现在也无法享受到的一种奢侈。

函数没有名字会带来一个问题,那就是你无法在函数中调用自身(好啦,我知道还有Y组合,不过这是一篇入门文章),所以Lisp提供了一种形式可以让你用一个标识符来引用函数:

(label f (lambda (p1 p2 ... pn) e))

这个表达式和前面的简单lambda表达式等价,但是在e中出现的所有f都会被替换为整个lambda表达式,也就是递归。

同时,Lisp为它提供了一种简写形式:

(defun f (p1 p2 ... pn) e)

你可以开始写你的第一个有用的Lisp程序了,你打算写什么?(无论什么,只要不是Hello world就好)

下一集,我们将给出一些常用的函数。

 


Lisp入门(一)

Lisp入门(二)

Lisp入门(四)

Lisp入门(五)

Lisp入门(后记)

注:这一集要讲的东西太多,可惜我驾驭长篇的能力实在太差,不免写的有些前言不搭后语,如果你对此有什么意见和建议就直接提吧,我会改的。

发表于 2004年08月01日 11:43 AM


wink_smile.gifwink_smile.gif

评论

# 回复:Lisp入门(三) 2004-09-27 6:59 PM d1y2j3
((lambda (f) (f '(b c))) '(lambda (x) (cons 'a x)))
单单这个语句在clisp-2.33.1和Corman Lisp 2.5中都解释不过去
提示如下:
;;; Warning: Unused variable F in anonymous function
;;; An error occurred in function #< COMPILED-FUNCTION: #x11D9930 >:
;;; Error: The function F is undefined
;;; Entering Corman Lisp debug loop.
;;; Use :C followed by an option to exit. Type :HELP for help.
;;; Restart options:
;;; 1 Abort to top level.

我想找个师傅

求师傅教学
  • u011730645
  • u011730645
  • 2013年08月18日 10:12
  • 142

IT职场人生系列之十六:入职(新手篇)

这是IT职场人生系列第十六篇。本文描述的是入职前半年的工作要点,新手和老手的差别很大,所以分开写。最近外出培训四天,没来得及面试,回来的时候很看好的一个刚毕业一年的asp.net程序员被人录用了。作为...
  • cheny_com
  • cheny_com
  • 2011年12月23日 10:22
  • 11557

求C++师傅

本人现在是名学生,由于自认为比较菜鸟。寻求可以教导我成长的师傅。。 ...
  • duweiliaisunyue
  • duweiliaisunyue
  • 2007年06月04日 21:37
  • 130

找师傅

想多认识写朋友,(本人菜鸟) ,也希望找到个牛做师傅
  • YSZ64661
  • YSZ64661
  • 2008年03月29日 12:35
  • 157

我的师傅叫追逐

第一次知道CSDN是在晚上寻找教程的时候  既然开通博客了  那就写   java之路能够走多远  我就更新有多远 本人男  爱好女 属于眼高手低 爱管闲事 好吃懒做的那种类型 距离上一次工作到现在已...
  • a3099209197
  • a3099209197
  • 2016年06月26日 05:32
  • 110

java EE开发之Servlet第十二课:简单自定标签

1 . 什么是自定义标签   尽管JSP本身,以及第三方提供了很多标签库,但因为业务需要,我们有时还是需要自定义标签。因为JSP页面中不可以存在Java代码,所以我们需要自定义标签!2 .标签的真身...
  • womeia331416
  • womeia331416
  • 2017年09月21日 16:43
  • 137

需找黑客师傅

那位好人帮帮我怎么弄WPE。教教我也可以。实在弄不明白了问问,那位好心人帮帮忙!...
  • wei8864096
  • wei8864096
  • 2010年07月27日 14:56
  • 107

找一个java师傅!!

我是软件开发的(JAVA方向)但是我的水平一直提不高,想在网上找一个师傅.愿意的可以加我的QQ吗251602511.谢谢!...
  • mei_lover
  • mei_lover
  • 2006年01月17日 23:30
  • 350

菜鸟找师傅

我从0开始接触JAVA VB VC++该从何学起啊
  • a1132240098
  • a1132240098
  • 2009年07月16日 08:59
  • 68

南京找程序师傅

  我是09年毕业的,专业是机械设计制造及其自动化。但是我对程序很干兴趣,有时间我也会自学软件方面的知识。现在自学了离散数学、数据结构,C++,但是我发现自己对软件开发还是很不了解,也发现了自学的话会...
  • heyongde007
  • heyongde007
  • 2010年08月07日 20:11
  • 2564
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:EE师傅叫找的的
举报原因:
原因补充:

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