找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1178|回复: 12

[已解决] 【已解决】如何判断一个函数是否加载了?

[复制链接]

已领礼包: 10个

财富等级: 恭喜发财

发表于 2018-11-10 16:29:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 newer 于 2018-11-14 17:15 编辑

各位好,如何判断一个函数是否加载了?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-11-10 19:07:26 | 显示全部楼层
lisperado 发表于 2018-11-10 18:56
如果defun & lambda模式可查符号boundp或属性*SUBR
(lambda  (a b) (* (+ a b ) 0.5)  )

发个一劳永逸的方法

  1. (defun isLoaded (str)
  2.    (if (atoms-family 1 (list str))
  3.        t
  4.        nil
  5.    )
  6. )


  1. (setq mid1 '( (a b) (* (+ a b ) 0.5) ) )


命令: (isloaded "mid1")
T

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2018-11-10 17:56:04 | 显示全部楼层
  1. (defun isLoaded        (func)
  2.   (setq ret nil)
  3.   (cond        ((= (type func) 'STR)
  4.          (if (wcmatch (vl-princ-to-string (type (eval (read func)))) "*SUBR")
  5.            (setq ret t)
  6.          )
  7.         )
  8.         ((= (type func) 'SYM)
  9.          (if (wcmatch (vl-princ-to-string (type (eval func))) "*SUBR")
  10.            (setq ret t)
  11.          )
  12.         )
  13.   )
  14.   ret
  15. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 1 反对 0

使用道具 举报

已领礼包: 8724个

财富等级: 富甲天下

发表于 2018-11-10 18:15:35 | 显示全部楼层
谢谢! Lisphk 分享程序!!!!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2018-11-10 18:56:25 | 显示全部楼层
本帖最后由 lisperado 于 2018-11-10 18:59 编辑

如果defun & lambda模式可查符号boundp或属性*SUBR
(lambda  (a b) (* (+ a b ) 0.5)  )

但有例外: setq, set, list, quote, read, eval 也可定义'伪函数':
  1. (setq mid1 '( (a b) (* (+ a b ) 0.5) ) )
  2. (set 'mid2 (list '(a b) '(* (+ a b ) 0.5) ) )

  3. 举例:
  4. (mid1 3 4 )
  5. ; 3.5
  6. (mapcar 'mid2 '(0. 0. 0.) '(3. 4. 5.) )
  7. ;(1.5 2.0 2.5)


如上mid1 & mid2 算不算函数呢?

点评

就是 defun-q 命令: (defun-q mid (a b) (* (+ a b) 0.5)) MID 命令: !mid ((A B) (* (+ A B) 0.5))  详情 回复 发表于 2018-11-11 10:45
发个一劳永逸的方法 命令: (isloaded "mid1") T  详情 回复 发表于 2018-11-10 19:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1667个

财富等级: 堆金积玉

发表于 2018-11-10 21:22:14 | 显示全部楼层
谢谢大神分享经验..!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6468个

财富等级: 富甲天下

发表于 2018-11-11 00:29:29 | 显示全部楼层
学习了。         
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 7个

财富等级: 恭喜发财

发表于 2018-11-11 02:12:07 来自手机 | 显示全部楼层
[quote]lisperado 发表于 2018-11-10 18:56
如果defun

这不就是defun-q吗
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-11-11 10:45:31 | 显示全部楼层
lisperado 发表于 2018-11-10 18:56
如果defun & lambda模式可查符号boundp或属性*SUBR
(lambda  (a b) (* (+ a b ) 0.5)  )

就是 defun-q

命令: (defun-q mid (a b) (* (+ a b) 0.5))
MID
命令: !mid
((A B) (* (+ A B) 0.5))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2018-11-12 13:25:11 | 显示全部楼层
本帖最后由 lisperado 于 2018-11-12 21:55 编辑
newer 发表于 2018-11-10 19:07
发个一劳永逸的方法

谢谢大师回帖 :)
尚未解决呢:
1. atoms-family 返回值是个表 (A list of symbols)
所以,(nil) 不等于 nil

更改如下car
  1. (defun isLoaded? (str)
  2.    (if (car (atoms-family 1 (list str)))
  3.        t
  4.        nil
  5.    )
  6. )

  7. (setq DEF nil)
  8. (isLoaded "DEF")
  9. T
  10. (isloaded? "DEF")
  11. nil


2. 楼主标题是“如何判断一个函数是否加载了”
;而不是符号 (SYMBOL)加载


(setq ABC nil)
(atoms-family 1 '("ABC"))
;(nil)

(setq ABC t)
(atoms-family 1 '("ABC"))
;("ABC")

(setq DEF nil)
(boundp 'DEF)
;nil
(atoms-family 1 '("DEF"))
;(nil)
(isloaded "DEF")  
; T
(isloaded? "DEF")
nil ;修改后

(setq DEF t)
(boundp 'DEF)
T
(atoms-family 1 '("DEF"))
;("DEF")
(isloaded "DEF")
T

  1. (defun foo  ( l )
  2. (mapcar ''((x)(if (boundp x) (vl-symbol-name x))) l)
  3. )


(foo '(ABC DEF GHI))
;("ABC" "DEF" nil)

(atoms-family 1 '("ABC" "DEF" "GHI"))
;("ABC" "DEF" nil)

所以2个示范都返回符号值而不是‘加载值’,加载函数应该要更谨慎?不清楚有没有像命令般可查 (getvar 'cmdactive) 或 lisp 'C:命令'?
  1. (vl-list-exported-functions)
?
p/s: 除了*SUBR,应该有更好的思路吧?


已编辑:vl-list-exported-functions





论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2018-11-12 14:01:41 | 显示全部楼层
ayl1004 发表于 2018-11-11 02:12
[quote]lisperado 发表于 2018-11-10 18:56
如果defun

对呀,谢谢提示!
还有遗漏 vl-bb-set & vl-propagate ?


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2018-11-14 16:00:47 | 显示全部楼层
(if func (func ...))
直接判断就可以,lisp本来都是表,函数和数据又不能重名。
一个函数(setq func nil)就可以注销掉,
而且用setq 就可以定义一个函数
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 10个

财富等级: 恭喜发财

 楼主| 发表于 2018-11-18 16:37:17 | 显示全部楼层
谢谢楼上各位大神
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-17 06:21 , Processed in 0.434758 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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