明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 7704|回复: 26

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

  [复制链接]
发表于 2014-10-14 17:53 | 显示全部楼层 |阅读模式
本帖最后由 highflybir 于 2014-10-15 12:32 编辑

LISP编程中有哪些限制,又有哪些取值范围呢?
我这儿列举了几个例子,希望能抛砖引玉。

1,整数的取值范围: 相当于 2^31, -2147483648 < n < 2147483648; 否则,整数就会变成实数。
2,  实数的取值范围: 相当于 2^1024,即:   -1.79769313e+308 < x < 1.79769313e+308;否则就会显示:-1.#INF和1.#INF.
3, 堆栈的范围:主要是在递归上可以表达出来:
   譬如用以下递归函数   
  1. (defun f (n)
  2.   ( if (= n 1)
  3.     1
  4.     (+ n (f (1- n)))
  5.   )
  6. )

测出结果是: 19975  --看来这个数值还是很低的,所以能不用递归,就不用递归。
否则超过嵌套限制就会出现:
internal stack limit reached (simulated)Hard error occurred ***
内部堆栈达到极限(模拟) ,硬件错误。

好了,我抛了三块砖,请大家继续添加。
   


评分

参与人数 3明经币 +3 金钱 +28 收起 理由
冰之绝恋 + 1 赞一个!
不死猫 + 1 + 18 赶来捧场,发一些技巧.楼下继续.
ll_j + 1 + 10 赞一个!

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下

本帖被以下淘专辑推荐:

  • · 经典|主题: 23, 订阅: 1
  • · 基础|主题: 9, 订阅: 0
发表于 2014-10-16 09:31 | 显示全部楼层
mslide 命令做的sld文件 在dcl image中显示经常偏小.必须在mslide之前把autocad窗口的形状和dcl image调整一样的高宽比例,才能全屏显示sld
回复 支持 1 反对 0

使用道具 举报

发表于 2014-10-14 18:08 | 显示全部楼层
递归的回合可能是20000,扣除defun、cond、if,最多可以做到19997,我在写(http://bbs.mjtd.com/thread-107136-1-1.html)时测试过,这个限制不大,但对常规使用应该是够了。不过写递归是蛮麻烦是事,某种意义上不如while清晰,而且写不好还影响效率,有点吃力不讨好的意思。
 楼主| 发表于 2014-10-14 18:14 | 显示全部楼层
ll_j 发表于 2014-10-14 18:08
递归的回合可能是20000,扣除defun、cond、if,最多可以做到19997,我在写(http://bbs.mjtd.com/thread-10 ...

你的测试很好。就我这个例子来说是19975,而你的例子已经超过了。当然,可能还有别的例子,会超过20000,也不一定,但我感觉应该不会差太远了。
发表于 2014-10-14 18:35 | 显示全部楼层
本帖最后由 Gu_xl 于 2014-10-14 18:38 编辑

我补充几个限制问题:
1、一个图形创建的选择集个数不能超过128个!否则会出现错误:超出选择集数量的最大范围
2、反应器回调函不能使用command命令

点评

所以反应器只能通过vla-sendcommand 来调用command  发表于 2014-10-16 14:59
发表于 2014-10-14 20:32 | 显示全部楼层
本帖最后由 wzg356 于 2014-10-14 20:38 编辑

控制字符e,n,r,t必须小写

变量、函数的名字:不能只含数字;不能包含:“(”、“)”、“·”、“'”、“"”、“;”;

程序中定义的变量、函数名称不要与系统定义的函数名和预定义的变量名(nil、T、Pause和Pi)相同

每一对括号就是一个表达式,表达式中第一个位置必须是函数名:如(函数名)或(函数名 参数....)

(/ 5  2)==>2;(/ 5  (+ 2 0.0))==>2.5
发表于 2014-10-15 00:09 | 显示全部楼层
wzg356 发表于 2014-10-14 20:32
控制字符e,n,r,t必须小写

变量、函数的名字:不能只含数字;不能包含:“(”、“)”、“·”、“'” ...

函数式语言,表达式中第一个位置不是函数名能是什么 ?这个不算限制吧

点评

赞同规则也是限制,应理解为严格的限制。  发表于 2014-10-15 08:34
规则的定义就是于限制,扫盲,多提  发表于 2014-10-15 00:47
发表于 2014-10-15 09:44 | 显示全部楼层
;;以往只是听说,但从未测试
;;Max(min)限制是:如果下面的256改为255就OK了
(defun w1 (/ L N)  
  (repeat (setq n 256)
    (setq l (cons (setq n (1- n)) L))
  )
  (eval (cons max L))
)
发表于 2014-10-15 10:01 | 显示全部楼层
zzyong00 发表于 2014-10-15 00:09
函数式语言,表达式中第一个位置不是函数名能是什么 ?这个不算限制吧

没有任何规则,恐怕做不了任何事
基于lisp的规则,讨论它的限制才有意义
 楼主| 发表于 2014-10-15 10:22 | 显示全部楼层
Gu_xl 发表于 2014-10-14 18:35
我补充几个限制问题:
1、一个图形创建的选择集个数不能超过128个!否则会出现错误:超出选择集数量的最大范 ...

严格地说来,反应器回调函数是可以使用command命令的.
不过不能使用与CAD交互的命令,譬如等待用户输入的命令。那样的话,极可能造成程序死锁。

评分

参与人数 1明经币 +1 收起 理由
自贡黄明儒 + 1 赞一个!

查看全部评分

 楼主| 发表于 2014-10-15 11:19 | 显示全部楼层
对话框被打开时的函数限制:
当对话框被激活(即调用start_dialog)时,不能调用要求用户在AutoCAD命令行输入或者影响对话框外的显示(例如,AutoCAD图形窗口)的AutoLISP函数,这个限制还包括写文字的函数,如print,princ,和prin1
如果程序在调用start_dialogdone_dialog之间调用一个受限函数,AutoCAD会终止所有对话框并显示下列错误:
AutoCAD rejected function.


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

本版积分规则

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

GMT+8, 2024-5-18 21:50 , Processed in 0.461642 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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