明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2329|回复: 8

写函数的思路扩展

[复制链接]
发表于 2012-5-6 20:20 | 显示全部楼层 |阅读模式
举个最简单的例子。
一开始想计算1+2等于多少。
后来希望适用于其他数据,于是写了函数
(defun calcul (num1 num2)
  (+ num1 num2)
)
再进一步,希望适用于其他加减乘除运算
(defun calcul (num1 symbol num2)
  (symbol num1 num2)
)
上面的例子没有应用lisp的强项,表结构。
"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2012-5-6 20:29 | 显示全部楼层
深入浅出,希望多多开课。

点评

谢谢支持,本来想用1+1=2举例的,怕引起歧义,遂改为1+2=3.  发表于 2012-5-9 06:02
发表于 2012-5-6 20:59 | 显示全部楼层
学习了,谢谢!
 楼主| 发表于 2012-5-9 06:13 | 显示全部楼层
本帖最后由 snddd2000 于 2013-1-2 11:56 编辑

既然想到用函数来改善代码的可读性和简洁度,可能也考虑到函数的效率性。下面给出一个简单的测试运行时间的函数,以备后用。(条条大路通罗马,那条是比较快捷的,没有最快只有更快。)
测试结果依硬件和硬件的被占用情况会有比较大的出入,此不稳定性望坛友改进。(时间差分等次数平均求得)
[code=lisp(defun runtime (TestFunction arg Times / StartTime EndTime xx StartTime-i)
;_TestFunction as Function ,arg as Function's parameter Times as Integer
  (setq StartTime (getvar "DATE") xx 0)
  (repeat Times
    (setq StartTime-i (getvar "DATE"))
    (apply 'TestFunction arg)
    (setq EndTime (getvar "DATE"))
    (princ
      (strcat "\nNo."
       (itoa (setq xx (1+ xx)))
       " Time: "
       (rtos (* 86400 (- EndTime StartTime-i)) 2 8)
       " seaconds"
      )
    )
  )
  (princ
    (strcat "\nTotal Time: "
     (rtos (setq TotalTime (* 86400 (- EndTime StartTime))) 2 8)
     " seaconds"
    )
  )
  (princ (strcat "\nAverage Time: "
   (rtos (/ TotalTime Times) 2 16)
   " seaconds"
  )
  )
  (print)
)
(defun test1  (n)
  (setq        sum 0
        n   (1+ n))
  (while (< 0 n)
    (setq sum (+ sum (setq n (1- n))))
    )
  sum
  )

(defun test2  (n m)
  (setq        sum (1- n)
        m   (1+ m))
  (while (< n m)
    (setq sum (+ sum (setq m (1- m))))
    )
  sum
  )[/code]

调用方法

(RUNTIME test1 (list 100) 10000)

(RUNTIME test2 (list 1 100) 10000)


点评

支持,希望不断更新之。  发表于 2012-5-9 08:52

评分

参与人数 1金钱 +50 收起 理由
wowan1314 + 50 赞一个!

查看全部评分

发表于 2012-5-9 08:47 | 显示全部楼层
 楼主| 发表于 2012-5-9 13:48 | 显示全部楼层
Andyhon 发表于 2012-5-9 08:47
另版测试运行时间的函数
http://forums.autodesk.com/t5/Visual-LISP-AutoLISP-and-General/defun-vs-lamb ...

测试计算时间的函数,有问题,但不知道为什么?望指教。
_$ (RUNTIME (test 1) 10000)
0.0319853
_$ (RUNTIME (test 10) 10000)
0.0300139
_$ (RUNTIME (test 100) 10000)
0.0309795
_$ (RUNTIME (test 1000) 10000)
0.0319853
_$ (RUNTIME (test 10000) 10000)
0.0319853
上边是结果,显然不对。
下面是我将代码直接执行的结果
_$ (setq StartTime (getvar "DATE"))
   (repeat 10000
     (eval (test 10000))
   )
   (setq EndTime (getvar "DATE"))
   (* 86400 (- EndTime StartTime))
2.45606e+006
50005000
2.45606e+006
60.195
应该是对的。
下面是测试的函数
(defun test  (n)
  (setq        sum 0
        n   (1+ n))
  (while (< 0 n)
    (setq sum (+ sum (setq n (1- n))))
    )
  sum
  )
发表于 2012-5-9 14:27 | 显示全部楼层
Command: (setq n 1)
1

Command: (Bench '(test) (list n) 10000)

TEST
Elapsed: 0.0310
Average: 0.0000031019747257

Command: (setq n 10)
10

Command: (Bench '(test) (list n) 10000)

TEST
Elapsed: 0.0940
Average: 0.0000093984603882

Command: (setq n 100)
100

Command: (Bench '(test) (list n) 10000)

TEST
Elapsed: 0.6880
Average: 0.0000687986612320

Command: (setq n 1000)
1000

Command: (Bench '(test) (list n) 10000)

TEST
Elapsed: 6.6250
Average: 0.0006624989211559

点评

谢谢,参考timer函数将eval改为apply,结果应该对了  发表于 2012-5-9 14:40
 楼主| 发表于 2012-5-9 21:56 | 显示全部楼层
下面是众多取LWPline的顶点坐标的函数中的一个,不适用于有重复点的多段线,但是恰恰可以去除有重复的点,比如首尾相连但属性里是非闭合的多段线。望坛友们提供同样功能的函数,一起来扩展思路,测试速度。
  1. (defun lwpent->lwppoints (ent) ;_取LWPline的顶点坐标,忽略重复点
  2.   (setq lwppoints '())
  3.   (if (= (type ent) 'ENAME)
  4.     (progn
  5.       (setq entlist (entget ent))
  6.       (if (= (cdr (assoc 0 entlist)) "LWPOLYLINE")
  7.         (progn
  8.           (while (setq atom10 (assoc 10 entlist))
  9.             (setq entlist (vl-remove atom10 entlist))
  10.             (setq lwppoints (cons (cdr atom10) lwppoints)
  11.             )
  12.           )
  13.           (reverse lwppoints)
  14.         )
  15.       )
  16.     )
  17.   )
  18. )
发表于 2014-8-9 14:00 | 显示全部楼层
snddd2000 发表于 2012-5-9 21:56
下面是众多取LWPline的顶点坐标的函数中的一个,不适用于有重复点的多段线,但是恰恰可以去除有重复的点,比 ...

思路好啊
把重复点去了省得麻烦
最好也能把在同一直线上的中间点也去掉就更好了
例如一多线中有的无转折的直线段上,中间也有顶点,就应去了更好
请问能改成这样的吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-11 16:59 , Processed in 0.217779 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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