请教,关于lambda函数
对于 lambda函数,我看教程和帮助实在看不懂,各位高手和飞哥能否给几个实际的例子,还有以下是飞版写的程序的一段语句,各位能否帮忙解释一下,小弟水平太低,请见谅.
(setq items (mapcar '(lambda(e) (mapcar 'vlax-variant-value e)) items))<BR>还有(setq a (mapcar '(lambda(e) (if (not (vl-every 'null e)) e)) A))<BR> <P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(setq items (mapcar '(lambda(e) (mapcar 'vlax-variant-value e)) items))<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><o:p> </o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>mapcar 只能作用于表,所以这里的items必为表。中间的<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>'(lambda(e) (mapcar 'vlax-variant-value e))为函数,<SPAN lang=EN-US> e </SPAN>为局部变量<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(mapcar '(lambda(e) (mapcar 'vlax-variant-value e)) items))是把表items中的每一项送进中间的函数中(代入e)处理后的返回结果再送回items的原来的位置中<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>现在看函数'(lambda(e) (mapcar 'vlax-variant-value e)). 许不大恰当,但你可以假设你已在某处定义了如下一个函数:<SPAN lang=EN-US><o:p></o:p></SPAN>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(defun lambda (e) (mapcar 'vlax-variant-value e)),<SPAN style="mso-spacerun: yes"> </SPAN>而你现在可以将<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(mapcar '(lambda(e) (mapcar 'vlax-variant-value e)) items))简单看成<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(mapcar 'lambda items),深入一层看(mapcar 'vlax-variant-value e), 显然e也是表,这个表达式的意思是把e中的每一个原子都送函数vlax-variant-value处理后送回原来的位置。<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>假如:<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(setq varstr (vlax-make-variant "ghost"))<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(setq varint (vlax-make-variant 5 vlax-vbInteger))<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(setq e (list varstr varint))<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(mapcar 'vlax-variant-value e)则返回("ghost" 5)<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>记住,<SPAN lang=EN-US> e </SPAN>为items中的每一个原子。<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>假如:<SPAN lang=EN-US>(setq items (list (list varstr varint) (list varint varstr)))<o:p></o:p></SPAN>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(mapcar '(lambda(e) (mapcar 'vlax-variant-value e)) items)则返回<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left>(("ghost" 5) (5 "ghost"))<o:p></o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-layout-grid-align: none" align=left><o:p> </o:p>
<P class=MsoNormal style="MARGIN: 0cm 0cm 0pt">Sorry,会不会越抹越黑? 其实lambda就是相当于一个临时函数,(lambda (e) ....
就相当于(defun fun(e) .......)
上面的调用就相当于
(setq items (mapcar 'fun items)) 我也是没理解这个函数,找不到突破口 hushiyong11 发表于 2021-9-27 09:44
我也是没理解这个函数,找不到突破口
按defun 写,然后去掉函数名,defun换成lambda就可以了。 本帖最后由 vectra 于 2021-9-30 09:36 编辑
;;几个示例帮助理解:
;;1、运行无名函数
_$ ((lambda (e) (* e e)) 2)
4
;;2、给无名函数一个函数名?
_$ (setq foo (lambda (e) (* e e)))
#<USUBR @0000000038f0b098 -lambda->
_$ (foo 2)
4
简单的说,无名函数就是在你需要定义一个函数,但又不用费力给他想一个名字时用
页:
[1]