找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1338|回复: 8

[原创]:弄着玩玩,改造"setq"

[复制链接]

已领礼包: 488个

财富等级: 日进斗金

发表于 2005-8-4 23:03:19 | 显示全部楼层 |阅读模式

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

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

×

  1. (defun nsetq(sym foo / $$aeo-swap)
  2.   (if(eval sym)
  3.        (setq $$aeo-swap(vl-princ-to-string(eval sym))
  4.              foo(mapcar '(lambda(x)(if(eq 'str(type x))(strcat x "("$$aeo-swap"): ")x))foo)
  5.        )
  6.   )
  7.   (setq $$aeo-swap(eval foo))
  8.   (if(and $$aeo-swap(/= $$aeo-swap ""))(set sym $$aeo-swap))
  9. )


用法和setq + getXXX完全相同
看例子就明白:

  1. 命令: (setq abc nil)
  2. nil

  3. 命令: (nsetq 'abc '(getint "\n输入整数: "))

  4. 输入整数: 123
  5. 123

  6. 命令: (nsetq 'abc '(getint "\n输入整数: "))

  7. 输入整数: (123): 567
  8. 567

  9. 命令: !abc
  10. 567

  11. -------------------------------------------
  12. 命令: (initget 6 "A B C")
  13. nil

  14. 命令: (nsetq 'abc '(getint "\n输入整数: "))

  15. 输入整数: (567): -5

  16. 值必须为正且非零。

  17. 输入整数: (567): 0

  18. 值必须为正且非零。

  19. 输入整数: (567): A
  20. "A"

  21. 命令: !abc
  22. "A"

  23. --------------------------------------------------------
  24. 命令: (setq abc 1000)
  25. 1000

  26. 命令: (nsetq 'abc '(getdist "\n输入距离"))

  27. 输入距离(1000): 指定第二点: 1660.65

  28. 命令: !abc
  29. 1660.65

  30. --------------------------------------------------------
  31. 命令: (setq abc "Yes")
  32. "Yes"

  33. 命令: (initget "Yes No")
  34. nil

  35. 命令: (nsetq 'abc '(getkword "\nYes or No"))

  36. Yes or No(Yes):
  37. nil

  38. 命令: !abc
  39. "Yes"

  40. 命令: (initget "Yes No")
  41. nil

  42. 命令: (nsetq 'abc '(getkword "\nYes or No"))

  43. Yes or No(Yes): n
  44. "No"

  45. 命令: !abc
  46. "No"


用法总结:

  1. (initget 6 "Abc Ghi") ;;如果需要
  2. (nsetq 'your-symbol  '(GETXXX "Msg"))
  3. ;;如果 your-symbol  有值,提示里面会自动加入.(回车缺省值)
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-8-5 00:12:22 | 显示全部楼层
有新意 ! 学到一招
斑竹的斑竹  来给斑竹加积分
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2005-8-5 08:37:52 | 显示全部楼层
真好,可用于输入表达式或函数,楼主应做一些这方面的例子,让大家进一步了解掌握。
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-5 10:17:07 | 显示全部楼层
不错,很精益求精了,我只把aeo去掉了,嘿嘿。其它的改不动了。
不过有一个吹毛求疵的地方,一般默认值都是用尖括号括起来的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

 楼主| 发表于 2005-8-6 08:43:39 | 显示全部楼层
最初由 ohmylove 发布
[B]不错,很精益求精了,我只把aeo去掉了,嘿嘿。其它的改不动了。
不过有一个吹毛求疵的地方,一般默认值都是用尖括号括起来的。 [/B]


里面的那个名称和以后的变量名不要重名

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

使用道具 举报

发表于 2005-8-6 11:35:32 | 显示全部楼层
学习了aeo的代码并尝试着解释一下:

[php]
;;;
;;;(defun nsetq (sym foo / $$swap)

;;;nsetq:    由setq改进而来,故取名nsetq
;;;sym:      symbol的简写,欲赋值的符号,记得一定要在前面加撇号,
;;;          这样就可以像参数的引用传递一样改变传入符号的值,而不
;;;          是仅仅改变本函数中公共临时变量sym的值。
;;;foo:      表示欲调用的get族函数的表,前面也是要加撇号的,否则
;;;          foo得到只是get族函数的返回值,而不是调用语句本身。
;;;          至于foo这个词的来源可以见下面的链接:
;;;          http://www.faqs.org/rfcs/rfc3092.html
;;;$$swap    函数内局部临时变量,加两个美元符号以保证唯一性,原作
;;;          者aeo还加了aeo在前面,也是这个作用,同时也算签名了。
;;;          swap是交换的意思。

;;;        (if        (eval sym)

;;;计算传入符号的值,如果非空,将在下面加到提示中去作为默认值。

;;;                (setq        $$swap (vl-princ-to-string (eval sym))

;;;将传入符号的值变成字符串,赋给$$swap

;;;                                        foo                                 (mapcar '(lambda        (x)
;;;                                                                                                                                (if        (eq 'str (type x))
;;;                                                                                                                                        (strcat x "(" $$swap "): ")
;;;                                                                                                                                        x
;;;                                                                                                                                )
;;;                                                                                                                        )
;;;                                                                                                                 foo
;;;                                                                                 )

;;;这里是对get族函数的调用语句本身进行处理,以加入默认值的提示。
;;;由于get族函数的参数数目不定,用mapcar处理最省事,只要找到提示
;;;字符串,加上默认值就可以了。当然get族函数的参数也不多,一个或
;;;两个,你单独判断处理也行,但是肯定不如上面的简洁。还有一个细节,
;;;一般提示信息最后都是冒号,按上面的语句加上默认值后,提示信息里
;;;面就有两个冒号了。可是如果提示信息后面不冒号,恰好没有默认值,
;;;则显示的提示信息将没有冒号。

;;;                )
;;;        )

;;;        (setq $$swap (eval foo))

;;;eval函数用来执行get族语句,然后将返回值赋给$$swap

;;;        (if        (and $$swap (/= $$swap ""))

;;;判断$$swap是否为null或空字符串

;;;                (set sym $$swap)

;;;如果非空,将新的值赋给传入符号。一定要用set而不是setq。set会
;;;对每个参数求值,再进行赋值,这样就可以给传入符号赋值了。而setq
;;;不会对sym求值,结果只是给临时变量sym赋值,而不是给sym所指的符号
;;;赋值。
;;;        )

;;;这里没有(princ)语句,这样可以传回结果值。

;;;)
[/php]

我打算使用的代码(vlisp的代码一过来就乱了:():

[php]
(defun nsetq (sym foo / $$swap)
(if (eval sym)
(setq $$swap (vl-princ-to-string (eval sym))  
foo (mapcar '(lambda        (x)
        (if        (eq 'str (type x))
                (progn
                (setq x (vl-string-right-trim " " x)
        n (strlen x)
                        )
        (cond
        ( (= (substr x n 1) ":")
        (setq x (strcat (substr x 1 (1- n)) "<" $$swap ">: "))
)
( (= (substr x (1- n) 2) ":")
(setq x (strcat (substr x 1 (- n 2)) "<" $$swap ">: "))
)
( T
(setq x (strcat x "<" $$swap ">: "))
)
);cond
);progn
x
);if
)
foo
)  
)
)
        (setq $$swap (eval foo))  
        (if        (and $$swap (/= $$swap ""))
                (set sym $$swap)
        )
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-11 18:23:03 | 显示全部楼层
(defun nsetq(sym foo / $$aeo-swap)
  (if(eval sym)
       (setq $$aeo-swap(vl-princ-to-string(eval sym))
             foo(mapcar '(lambda(x)(if(eq 'str(type x))(strcat x "("$$aeo-swap"): ")x))foo)
       )
  )
  (setq $$aeo-swap(eval foo))
  (if(and $$aeo-swap(/= $$aeo-swap ""))(set sym $$aeo-swap))
)
直接用这个就行了吗,好象不行,我不懂了。
楼主举个例子好了,要么干脆做成函数了下载了。555··
想用
不好意思,昨天弄了下,已经搞好了,原来要加引号。
楼主真是小程序解决大问题。>*_*<
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 07:37 , Processed in 0.447742 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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