明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2250|回复: 6

[函数] 函数名作为变量的小用法

[复制链接]
发表于 2013-7-25 18:01 | 显示全部楼层 |阅读模式
本帖最后由 Casa小宝 于 2013-7-25 20:18 编辑

eval是lisp最特别的函数之一,其用法灵活
下面举个遍历选择集的小例子
遇到类似的需要反复利用的一段程序,都可用以简化程序
  1. ;~自定义遍历选择集(可嵌套使用)
  2. ;子函数funcstr默认可使用mm和ent变量,若只使用这两个变量可不带变量运行
  3. (defun Ca_repeat(sset funcstr / mm ent)
  4. (setq mm 0)
  5.   (repeat (sslength sset)
  6.     (setq ent (ssname sset mm))
  7.     (eval(read funcstr))
  8.     (setq mm (1+ mm))
  9.   )
  10.   )

  11. ;例如
  12. (setq ss (ssget))
  13. (Ca_repeat ss "(if (= "0" (dxf 8 (entget ent))) (princ "\n 含0图层"))")
  14. (defun DXF (NO ED)
  15.        (cdr (assoc NO ED))
  16.    )

评分

参与人数 1明经币 +1 收起 理由
wowan1314 + 1 赞一个!

查看全部评分

发表于 2013-7-25 19:50 | 显示全部楼层
eval 和 read 的组合可以在程序运行过程中生成代码,编译的时候会有警告提示
(eval(read ******(eval(read ######))***)) 的嵌套使用会更妙
我忘了是在哪个程序中这样用过了
 楼主| 发表于 2013-7-25 20:59 | 显示全部楼层
yxp 发表于 2013-7-25 19:50
eval 和 read 的组合可以在程序运行过程中生成代码,编译的时候会有警告提示
(eval(read ******(eval(read ...

我也只是懂些皮毛:),不死猫前辈这方面研究的更多
例如 http://bbs.mjtd.com/thread-72144-1-1.html 可选参数调用
或者他近来关于加密的研究,都是运用这个原理
 楼主| 发表于 2013-7-25 23:18 | 显示全部楼层
eval + read + vl-prin1-to-string 的运用也是很有趣的
下面这个函数用到了gu版的gxl-StrParse,请搜索相关帖子得到该子函数
  1. ;指定调用多层嵌套的子函数
  2. (defun Ca_call(funcstr / funclst lst n str)
  3.   (setq funclst (gxl-StrParse funcstr ":")
  4.         funclst (reverse funclst);("d" "c" "a")
  5.         lst '())
  6.   (foreach n funclst
  7.     (setq str (vl-prin1-to-string (setq lst (cons (read n) lst)))  
  8.           lst (list str)
  9.           )
  10.     )
  11.   (eval(read str))
  12.   )

  13. (defun a(funcst / a-1)
  14.   (defun a-1(funcst / a-1-1 a-1-2)
  15.     (defun a-1-1() (alert "a-1-1"))
  16.     (defun a-1-2() (alert "a-1-2"))
  17.     (alert "a-1")
  18.     (eval (read funcst))
  19.     )
  20.   (defun a-2(funcst / a-2-1 a-2-2)
  21.     (defun a-2-1() (alert "a-2-1"))
  22.     (defun a-2-2() (alert "a-2-2"))
  23.     (alert "a-2")
  24.     (eval (read funcst))
  25.     )
  26.   (alert "a")
  27.   (eval (read funcst))
  28.   )

  29. (Ca_call "a:a-1:a-1-2")
发表于 2013-7-26 08:47 | 显示全部楼层
[em0][em0]
发表于 2013-8-3 19:58 | 显示全部楼层
顶一顶.......
发表于 2013-8-4 01:43 | 显示全部楼层
哗,刚刚开始,不知道自己有没有这个恒心。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-5 07:36 , Processed in 0.282356 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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