【原创】按实现方法给autolisp函数分类
本帖最后由 baitang36 于 2022-2-26 12:44 编辑autolisp有很多函数,它是怎么做出来的?有的是用c++写的,相当于直接调用c++子程序,速度很快;还有的是用lisp写的,速度慢。举个例子,alert是用c++写成的,自动桌子叫它location类型的函数。princ是用lisp实现的。
我做了个试验,可以把它们分开。
附件文件function.txt的格式是,每行一个函数,函数名在前,后面是类型代码。
类型代码180 和200是location,也就是用c++实现的,速度快。类型代码4是用lisp实现的,速度慢。其它类型未知。如果你想让你的程序速度快,就尽量多用类型码180 和200的函数,少用类型码为4的函数。
先睹为快,后读免费。没币的朋友在这里下载
尘缘一生 发表于 2022-3-2 01:08
[*];;Graham扫描法求凸包
[*](defun graham-scan (ptlist / hullpt maxXpt sortPt P Q)
[*](if (<...
cddr的lisp源码是(defun cddr(x)(cdr (cdr x)))
cddr的fas码是 14 01 01 01 00 05 00 29 29 16
如果cddr直接写成(cdr (cdr x))应该能快一点,因为省去了14 和16指令的执行时间,参数传递的时间也节省了。
我没测试过,你可以弄个测试程序看看有多大差别。 baitang36 发表于 2022-2-26 14:44
用lisp来延伸
[*];;Graham扫描法求凸包
[*](defun graham-scan (ptlist / hullpt maxXpt sortPt P Q)
[*](if (< (length ptlist) 3) ;3点以下
[*] ptlist ;是本集合
[*] (progn
[*] (setq maxXpt (assoc (apply 'max (mapcar 'car ptlist)) ptlist));最右边的点
[*] (setq sortPt (sort-by-angle-distance ptlist maxXpt)) ;分类点集
[*] (setq hullPt (list (cadr sortPt) maxXpt)) ;开始的两点
[*] (foreach &n (cddr sortPt) ;从第3点开始
[*] (setq hullPt (cons &n HullPt)) ;把Pi加入到凸集
[*] (setq P (cadr hullPt)) ;Pi-1
[*] (setq Q (caddr hullPt)) ;Pi-2
[*] (while (and q (> (det &n P Q) -1e-6)) ;如果左转
[*] (setq hullPt (cons &n (cddr hullPt))) ;删除Pi-1点
[*] (setq P (cadr hullPt)) ;得到新的Pi-1点
[*] (setq Q (caddr hullPt)) ;得到新的Pi-2点
[*] )
[*] )
[*] (reverse hullpt);返回凸集
[*] )
[*])
[*])
把CDDR 改写快点的话,如何改写?
牛xx!!!!!!!!!!!!!!!!!!!!!!! 支持…
真是厲害!! 有400多个函数不知道齐了没
CDDDDR 200
CDDDR 200
CDDR 4
CDR 200
不知道为啥就cddr不是C++写的? 有点怪 本帖最后由 baitang36 于 2022-2-26 13:47 编辑
taoyi0727 发表于 2022-2-26 13:06
有400多个函数不知道齐了没
CDDDDR 200
CDDDR 200
检查了一下,没错,确实如此。
挖了一下, cddr的lisp源码是(defun cddr(x)(cdr (cdr x))
cddr的fas码是 14 01 01 01 00 05 00 29 29 16
可以搞一个循环的比一下效率差别有多大么? 满眼看去都是4 masterlong 发表于 2022-2-26 13:21
满眼看去都是4
说明autolisp很多函数是用它自身开发的。所以慢 感谢大神共享! baitang36 发表于 2022-2-26 13:51
说明autolisp很多函数是用它自身开发的。所以慢
我们在autolisp的基础上
自定义了无数的函数
没想到的是
autolisp先给自己加了好多戏