明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2261|回复: 25

[经验] 【原创】按实现方法给autolisp函数分类

[复制链接]
发表于 2022-2-26 12:23 | 显示全部楼层 |阅读模式
本帖最后由 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的函数。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 7明经币 +7 金钱 +90 收起 理由
caoyin + 1 赞一个!
USER2128 + 1 很给力!
伪书虫86 + 1 论坛因你们而精彩!
自贡黄明儒 + 1 + 5 日益精进了!
masterlong + 1 + 50
Bao_lai + 1 + 5 很给力!
highflybird + 1 + 30

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
 楼主| 发表于 2022-2-26 15:23 | 显示全部楼层
先睹为快,后读免费。没币的朋友在这里下载

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2022-3-2 08:23 | 显示全部楼层
尘缘一生 发表于 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指令的执行时间,参数传递的时间也节省了。
    我没测试过,你可以弄个测试程序看看有多大差别。
    回复 支持 1 反对 0

    使用道具 举报

    发表于 2022-3-2 01:08 | 显示全部楼层

    • ;;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))            i-1
    •         (setq Q (caddr hullPt))            i-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 改写快点的话,如何改写?

    发表于 2022-2-26 13:00 | 显示全部楼层
    支持…
    真是厲害!!
    发表于 2022-2-26 13:06 | 显示全部楼层
    有400多个函数  不知道齐了没
    CDDDDR 200
    CDDDR 200
    CDDR 4
    CDR 200
    不知道为啥  就cddr不是C++写的? 有点怪
     楼主| 发表于 2022-2-26 13:19 | 显示全部楼层
    本帖最后由 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     


    发表于 2022-2-26 13:21 | 显示全部楼层
    可以搞一个循环的比一下效率差别有多大么?
    发表于 2022-2-26 13:21 | 显示全部楼层
    满眼看去都是4
     楼主| 发表于 2022-2-26 13:51 | 显示全部楼层

    说明autolisp很多函数是用它自身开发的。所以慢
    发表于 2022-2-26 14:18 | 显示全部楼层
    感谢大神共享!
    发表于 2022-2-26 14:32 | 显示全部楼层
    baitang36 发表于 2022-2-26 13:51
    说明autolisp很多函数是用它自身开发的。所以慢

    我们在autolisp的基础上
    自定义了无数的函数
    没想到的是
    autolisp先给自己加了好多戏
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

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

    GMT+8, 2024-4-19 18:15 , Processed in 1.166703 second(s), 29 queries , Gzip On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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