明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2692|回复: 5

LISP也能实现函数重载

[复制链接]
发表于 2009-9-20 01:37:00 | 显示全部楼层 |阅读模式
在cond或if的条件中使用type,numberp等函数,LISP也能模仿C++函数的重载功能,函数参数数量只能有一个定值,以下举例说明:
;;HGCAD.COM
;;以dxf索引取出对应dxf值,可以接受某一对象的图元名或图元表。
(defun HG-GetDXF (en-el dxf)
     (cond ((= (type en-el) 'ENAME) (cdr (assoc dxf (entget en-el))))
              ((= (type en-el) 'LIST)  (cdr (assoc dxf en-el)))
              (t nil)
     )
)
以下是type函数返回值:
数据类型type 函数返回的数据类型说明
ENAME图元名
EXRXSUBR外部 ObjectARX 应用程序
FILE文件描述符
INT整数
LIST
PAGETB函数分页表
PICKSET选择集 
REAL浮点数
SAFEARRAY安全数组
STR字符串
SUBR内部 AutoLISP 函数或由编译(FAS 或 VLX)文件加载的函数从 AutoCAD 命令提示中加载的 LISP 源文件函数也可能作为 SUBR 出现。
SYM符号
VARIANT变体
USUBR从 LISP 中加载的用户定义函数
VLA-objectActiveX 对象
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2009-9-21 09:01:00 | 显示全部楼层

“重载”在C#的学习过程中遇到过,是非常不错的功能。LISP在这方面差了。。。

同一个函数名,可以定义无数个。每一个函数的参数类型及数量都不一样(也可以一样)。

举个例子:

(defun DXF (A B)

(+ A B)

)

(defun DXF (lst)

(car lst)

)

(defun DXF (str i len)

(substr str i len)

)

在LISP里面,只能最后一个DXF函数起作用,后面的会覆盖掉前面的定义。

而有了“重载”功能。每个DXF函数都能起作用。

楼主这样子的做法,某种程度上会遇到麻烦。

LISP真的要重载,其实只要提供一个LIST类型的参数。即

(defun Fun (LST)

(setq A (nth 0 LST))

(setq B (nth 1 LST))

;;etc....

)

评分

参与人数 1明经币 +1 收起 理由
yanshengjiang + 1 很给力!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2009-9-20 05:20:00 | 显示全部楼层

你把我弄糊涂了,搞个“重载”这么高级的名词。

但是所举的例子,这是lisp最稀松平常的应用啊。

发表于 2009-9-21 12:01:00 | 显示全部楼层

carrot1983 解释得很充分。

补充一点:C#可以使多个函数体使用同一函数名,实质上编译器是将用户函数名加上参数类型,作为新的内部函数名。

发表于 2009-9-21 17:46:00 | 显示全部楼层
重载?????迷糊
发表于 2009-10-3 23:06:00 | 显示全部楼层
不错,确实是个思路
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-6 07:22 , Processed in 0.179187 second(s), 30 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表