明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
楼主: highflybir

[【高飞鸟】] LISP编程的一些限制和范围

  [复制链接]
发表于 2014-10-15 11:22 | 显示全部楼层
highflybir 发表于 2014-10-15 10:22
严格地说来,反应器回调函数是可以使用command命令的.
不过不能使用与CAD交互的命令,譬如等待用户输入的 ...

这个应该是标准答案,书上说的不准确。
上次我测试了一下网友的反应器,他中间就用了command ,程序正常
发表于 2014-10-15 11:28 | 显示全部楼层
highflybir 发表于 2014-10-15 11:19
对话框被打开时的函数限制:
当对话框被激活(即调用start_dialog)时,不能调用要求用户在AutoCAD命令行输 ...

对话框显示后,我的感觉是程序不断在start_dialog和done_dialog之间扫描。
 楼主| 发表于 2014-10-15 11:39 | 显示全部楼层
自贡黄明儒 发表于 2014-10-15 09:44
;;以往只是听说,但从未测试
;;Max(min)限制是:如果下面的256改为255就OK了
(defun w1 (/ L N)  

这个好像不是Max,或者Min函数的限制,如果换一种用法,就可以了,
譬如 (apply 'max L)
不用eval,而改用 apply
可见,这个是eval带来的问题。
 楼主| 发表于 2014-10-15 11:55 | 显示全部楼层
本帖最后由 highflybir 于 2014-10-15 11:57 编辑
自贡黄明儒 发表于 2014-10-15 09:44
;;以往只是听说,但从未测试
;;Max(min)限制是:如果下面的256改为255就OK了
(defun w1 (/ L N)  

不过话说回来,似乎这个地方还是牵涉到一个限制:
似乎LISP的参数限制不能超过256个:
比较下面三种方法:
1. (eval (cons max L))
2. (max 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255)
3.(apply 'max l)

1,2两种方法都会显示:
error: internal restriction: too many arguments in function call:
#<SUBR...
或:
error: bad argument value: does not fit in byte: 256
第3种方法正常运行。
这样,问题就来了,LISP的参数个数真的不能超过255么?
发表于 2014-10-15 12:25 | 显示全部楼层
highflybir 发表于 2014-10-15 11:55
不过话说回来,似乎这个地方还是牵涉到一个限制:
似乎LISP的参数限制不能超过256个:
比较下面三种方法 ...

数值运算的基本都是有256限制,包括+-*/等,但lisp本身并不受此限制,defun函数本身就是无限制参数。
这个问题以前有过讨论,不过现在找不到那个帖子了。
发表于 2014-10-15 19:08 来自手机 | 显示全部楼层
限制无处不在,这是规则,只不过有的明示,有的是"潜规则”
发表于 2014-10-16 08:40 | 显示全部楼层
尽网友之力,把尽量多的潜规则显现出来,方便后来者。

其实这个也可以说说一些经典bug。
比如ip地址问题之类的。getstring等提示参数含有中文字符时可能处理异常等等。
这些bug其实也是限制。
发表于 2014-10-16 08:43 | 显示全部楼层
highflybir 发表于 2014-10-15 11:19
对话框被打开时的函数限制:
当对话框被激活(即调用start_dialog)时,不能调用要求用户在AutoCAD命令行输 ...

可以用princ的吧
(princ (strcat "\n" "用户:" (getvar "loginname") "。"))

本帖子中包含更多资源

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

x
发表于 2014-10-16 09:19 | 显示全部楼层
使用全中文变量会经常出现变量值冲突的情况.(建议中英结合)
超过2M的lsp制作fas会报错(普通程序未测试,加密代码制作fas测试约1.7mb以上报错)
defun command  cond if progn setq while repeat 等函数无法用lisp重定义
64位autocad上面很多windows activex对象无法获取(例如MSScriptControl.ScriptControl)

评分

参与人数 1明经币 +1 金钱 +30 收起 理由
highflybir + 1 + 30 赞一个!

查看全部评分

发表于 2014-10-16 09:29 | 显示全部楼层
ssget "c" pt1 pt2 只能获取可见区域内的东西,而且就算在可见区,当视口高度过高,ssget范围太小的时候依然不能获取图元.建议先执行 (command  "zoom" pt1 pt2)然后(ssget "c" pt1 pt2)最后(command "zoom" "p")可惜这样在大循环的时候效率降低很多,不过可以确保ssget有效.

点评

是的,这个是经典问题。  发表于 2014-10-16 14:20
涨姿势了  发表于 2014-10-16 13:07
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 11:31 , Processed in 0.620364 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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