LISP也能实现函数重载
<div>在cond或if的条件中使用type,numberp等函数,LISP也能模仿C++函数的重载功能,函数参数数量只能有一个定值,以下举例说明:</div><div></div><div><div><font color="#f00000">;;HGCAD.COM</font></div><div><font color="#f00000">;;以dxf索引取出对应dxf值,可以接受某一对象的图元名或图元表。<br/>(defun HG-GetDXF (en-el dxf)<br/> (cond ((= (type en-el) 'ENAME) (cdr (assoc dxf (entget en-el))))<br/> ((= (type en-el) 'LIST) (cdr (assoc dxf en-el))) <br/> (t nil)<br/> )<br/>)</font></div><div></div><div>以下是type函数返回值:</div><div><table class="BasicLeft" rules="cols" cellspacing="0" style="WIDTH: 650px; HEIGHT: 381px;"><tbody><tr><td width="100"><strong><em>数据类型</em></strong></td><td><strong><em>type 函数返回的数据类型说明</em></strong></td></tr><tr><td width="50">ENAME</td><td>图元名</td></tr><tr><td>EXRXSUBR</td><td>外部 ObjectARX 应用程序</td></tr><tr><td>FILE</td><td>文件描述符</td></tr><tr><td>INT</td><td>整数</td></tr><tr><td>LIST</td><td>表</td></tr><tr><td>PAGETB</td><td>函数分页表</td></tr><tr><td>PICKSET</td><td>选择集 </td></tr><tr><td>REAL</td><td>浮点数</td></tr><tr><td>SAFEARRAY</td><td>安全数组</td></tr><tr><td>STR</td><td>字符串</td></tr><tr><td>SUBR</td><td>内部 AutoLISP 函数或由编译(FAS 或 VLX)文件加载的函数从 AutoCAD 命令提示中加载的 LISP 源文件函数也可能作为 SUBR 出现。 </td></tr><tr><td>SYM</td><td>符号</td></tr><tr><td>VARIANT</td><td>变体</td></tr><tr><td>USUBR</td><td>从 LISP 中加载的用户定义函数</td></tr><tr><td>VLA-object</td><td>ActiveX 对象</td></tr></tbody></table></div></div> <p>“重载”在C#的学习过程中遇到过,是非常不错的功能。LISP在这方面差了。。。</p><p>同一个函数名,可以定义无数个。每一个函数的参数类型及数量都不一样(也可以一样)。</p><p>举个例子:</p><p>(defun DXF (A B)</p><p>(+ A B)</p><p>)</p><p>(defun DXF (lst)</p><p>(car lst)</p><p>)</p><p>(defun DXF (str i len)</p><p>(substr str i len)</p><p>)</p><p>在LISP里面,只能最后一个DXF函数起作用,后面的会覆盖掉前面的定义。</p><p>而有了“重载”功能。每个DXF函数都能起作用。</p><p>楼主这样子的做法,某种程度上会遇到麻烦。</p><p>LISP真的要重载,其实只要提供一个LIST类型的参数。即</p><p>(defun Fun (LST)</p><p>(setq A (nth 0 LST))</p><p>(setq B (nth 1 LST))</p><p>;;etc....</p><p>)</p> <p>你把我弄糊涂了,搞个“<strong>重载”这么高级的名词。</strong></p><p><strong>但是所举的例子,这是lisp最稀松平常的应用啊。</strong></p> <p><span class="Apple-style-span" style="LINE-HEIGHT: 30px; FONT-FAMILY: Verdana; COLOR: rgb(97,183,19); FONT-SIZE: 12px;"><b>carrot1983 解释得很充分。</b></span></p><p><span class="Apple-style-span" style="LINE-HEIGHT: 30px; FONT-FAMILY: Verdana; COLOR: rgb(97,183,19); FONT-SIZE: 12px;"><strong>补充一点:</strong><font color="#000000" size="3">C#可以使多个函数体使用同一函数名,实质上编译器是将用户函数名加上参数类型,作为新的内部函数名。</font></span></p> 重载?????迷糊 不错,确实是个思路
页:
[1]