尘缘一生 发表于 2022-2-25 00:48:53

(vl-catch-all-apply 'function list) ??

本帖最后由 尘缘一生 于 2022-2-25 23:20 编辑

如标题,

如果函数没有变量表的,如何扑捉错误?

或者错误不管执行下去呢?

[*]

[*](setq msg (vl-catch-all-apply
[*]                '(lambda ()
[*]                   ......
[*]                   ......
[*]                   ......
[*]               )
[*]            )
[*]    )
[*]    (If (VL-Catch-All-Error-P msg)    ;如果有错误
[*]      (VL-Catch-All-Error-Message msg);返回出错提示
[*]      msg                              ;否则返回执行结果
[*]    )


如上所示,封装无名函数?是否正确,没事?

注记:经测试,格式是正确的 2022-2-25

尘缘一生 发表于 2022-2-25 01:57:48

本帖最后由 尘缘一生 于 2022-2-25 23:19 编辑


[*];;;*************函数 gxl-catchapply.lsp*************
[*];;;(gxl-CatchApply fun args) 重定义 VL-CATCH-ALL-APPLY ,如函数错误返回nil
[*];;;(gxl-CatchApply vla-offset (list (vlax-ename->vla-object (car(entsel))) 10))
[*](defun gxl-CatchApply ( fun args / result )
[*];; ?Lee Mac 2010
[*](if
[*]    (not
[*]      (vl-catch-all-error-p
[*]      (setq result
[*]          (vl-catch-all-apply (if (= 'SYM (type fun)) fun (function fun)) args)
[*]      )
[*]      )
[*]    )
[*]    result
[*])
[*])
[*];;;***************** 函数 gxl-CatchApply*****************

和尚777 发表于 2022-2-25 16:37:33

(setq s(vl-catch-all-apply '(lambda()(/ 1 0))))
(if (vl-catch-all-error-p s)(vl-catch-all-error-message s)s)

muwind 发表于 2022-2-25 22:54:51

本帖最后由 muwind 于 2022-2-25 22:57 编辑

(vl-catch-all-apply 'function list)
我理解这样的,list 是可以省略的,若'function本身是有参数的 list省略的结果就是 “参数缺少 ”
如果'function 本身没有参数。返回的是函数本身的错误,比如和尚那个 返回就是除数为0
说到底 这个重点在 apply ,应该说是apply的plus版

尘缘一生 发表于 2022-2-25 23:12:33

本帖最后由 尘缘一生 于 2022-2-25 23:17 编辑

muwind 发表于 2022-2-25 22:54
(vl-catch-all-apply 'function list)
我理解这样的,list 是可以省略的,若'function本身是有参数的 lis ...
我测试没问题,这就应该是标准写法:

[*]

[*];;卸载三领------------------
[*](defun c:removesl ( )
[*](setq msg
[*]    (vl-catch-all-apply
[*]      (function
[*]      (lambda ()
[*]          (slexit (slmsg "卸载三领 V2.0" "卸載三領 V2.0")(slmsg "你要卸载三领吗?请谨慎确定!" "妳要卸載三領嗎?請謹慎確定!"))
[*]          (if (menugroup "SLMENU") (vl-cmdf "menuunload" "slmenu")) ;卸载菜单
[*]          (bf-removesupportpath (list (slpath sl-path0)));;删除支持路径
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "SLMENU.CUIX"))
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "SLMENU.cuix"))
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "SLMENU.bak.cuix"))
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "SLMENU.mnu"))
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "SLMENU.mnr"))
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "SLMENU_light.mnr"))
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "三领设计.vlx"))
[*]          (sl:filesystem-deltree (strcat (slpath sl-path0) "\\" "实用程序"))
[*]          (sl:filesystem-deltree (strcat (slpath sl-path0) "\\" "用户程序"))
[*]          (sl:filesystem-deltree (strcat (slpath sl-path0) "\\" "excel计算"))
[*]          (sl:filesystem-deltree (strcat (slpath sl-path0) "\\" "填充"))
[*]          (sl:filesystem-deltree (strcat (slpath sl-path0) "\\" "图库"))
[*]          (sl:filesystem-deltree (strcat (slpath sl-path0) "\\" "安装说明"))
[*]          (delstartupsuite (strcat (slpath sl-path0) "\\" "三领设计.VLX") "三领设计");删除启动组
[*]          (uninssetup);;删除acadxxxxdoc.lsp
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "SLMENU.dll"))
[*]          (vl-file-delete (strcat (slpath sl-path0) "\\" "SLMENU.DLL"))
[*]          (sl:filesystem-deltree (slpath sl-path0))
[*]      )
[*]      )
[*]    )
[*])
[*](if (vl-catch-all-error-pmsg) ;;如果有错误
[*]      (vl-catch-all-error-message msg);;返回出错提示
[*]    (princ "\n 三领设计 V2.0 已成功卸载")
[*])
[*])

页: [1]
查看完整版本: (vl-catch-all-apply 'function list) ??