Lisp函数的表示 lisp函数设置
创始人
2024-06-06 03:41:25
0

本文是paul graham所著的《Lisp之根源》的第二部分,介绍了Lisp函数的表示(***部分)。有关Lisp函数表示的具体描述如下:

函数的表示

接着我们定义一个记号来描述函数.函数表示为(lambda ( ... ) e ),其中  ... 是原子(叫做参数 ),e 是表达式. 如果表达式的***个元素形式如上

  1. ((lambda ( ... ) e )  ... )  

则称为函数调用 .它的值计算如下.每一个表达式 先求值,然后e 再求值.在e 的求值过程中,每个出现在e 中的 的值是相应的 在最近一次的函数调用中的值.

  1. > ((lambda (x) (cons x '(b))) 'a)  
  2. (a b)  
  3. > ((lambda (x y) (cons x (cdr y)))  
  4.    'z  
  5.    '(a b c))  
  6. (z b c) 

如果一个表达式的***个元素f 是原子且f 不是原始操作符

  1. (f  ... )  

并且f 的值是一个函数(lambda ( ... )),则以上表达式的值就是

  1. ((lambda ( ... ) e )  ... )  

的值. 换句话说,参数在表达式中不但可以作为自变量也可以作为操作符使用:

  1. > ((lambda (f) (f '(b c)))  
  2.    '(lambda (x) (cons 'a x)))  
  3. (a b c) 

有另外一个函数记号使得函数能提及它本身,这样我们就能方便地定义递归函数.3 记号

  1. (label f (lambda ( ... ) e ))  

表示一个象(lambda ( ... ) e )那样的函数,加上这样的特性: 任何出现在e 中的f 将求值为此label表达式, 就好象f 是此函数的参数.

假设我们要定义函数(subst x y z ), 它取表达式x ,原子y 和表z 做参数,返回一个象z 那样的表, 不过z 中出现的y (在任何嵌套层次上)被x 代替.

  1. > (subst 'm 'b '(a b (a b c) d))  
  2. (a m (a m c) d) 

我们可以这样表示此函数

  1. (label subst (lambda (x y z)  
  2.                (cond ((atom z)  
  3.                       (cond ((eq z y) x)  
  4.                             ('t z)))  
  5.                      ('t (cons (subst x y (car z))  
  6.                                (subst x y (cdr z))))))) 

我们简记f =(label f (lambda ( ... ) e ))为

(defun f ( ... ) e )

于是

  1. (defun subst (x y z)  
  2.   (cond ((atom z)  
  3.          (cond ((eq z y) x)  
  4.                ('t z)))  
  5.         ('t (cons (subst x y (car z))  
  6.                   (subst x y (cdr z)))))) 

偶然地我们在这儿看到如何写cond表达式的缺省子句. ***个元素是't的子句总是会成功的. 于是

  1. (cond (x y ) ('t z ))  

等同于我们在某些语言中写的

  1. if x then y else z  

对Lisp函数的表示便介绍到这里。

【编辑推荐】

  1. Lisp介绍之七个原始操作符
  2. 细数程序开发语言的七大奇迹
  3. Clojure编程语言 扩展你的Java想象力
  4. Scala将成为现代Web 2.0的发起语言
  5. Scala和Clojure,以及优秀的企业级语言之道

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...