highflybir 发表于 2014-10-14 17:53:10

LISP编程的一些限制和范围

本帖最后由 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, 堆栈的范围:主要是在递归上可以表达出来:
   譬如用以下递归函数   
(defun f (n)
( if (= n 1)
    1
    (+ n (f (1- n)))
)
)
测出结果是: 19975--看来这个数值还是很低的,所以能不用递归,就不用递归。
否则超过嵌套限制就会出现:
internal stack limit reached (simulated)Hard error occurred ***
内部堆栈达到极限(模拟) ,硬件错误。

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


不死猫 发表于 2014-10-16 09:31:12

mslide 命令做的sld文件 在dcl image中显示经常偏小.必须在mslide之前把autocad窗口的形状和dcl image调整一样的高宽比例,才能全屏显示sld

laofoye 发表于 2025-4-9 10:05:04

不死猫 发表于 2014-10-16 09:31
mslide 命令做的sld文件 在dcl image中显示经常偏小.必须在mslide之前把autocad窗口的形状和dcl image调整 ...

这个可以解决

ll_j 发表于 2014-10-14 18:08:15

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

highflybir 发表于 2014-10-14 18:14:06

ll_j 发表于 2014-10-14 18:08 static/image/common/back.gif
递归的回合可能是20000,扣除defun、cond、if,最多可以做到19997,我在写(http://bbs.mjtd.com/thread-10 ...

你的测试很好。就我这个例子来说是19975,而你的例子已经超过了。当然,可能还有别的例子,会超过20000,也不一定,但我感觉应该不会差太远了。

Gu_xl 发表于 2014-10-14 18:35:57

本帖最后由 Gu_xl 于 2014-10-14 18:38 编辑

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

wzg356 发表于 2014-10-14 20:32:35

本帖最后由 wzg356 于 2014-10-14 20:38 编辑

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

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

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

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

(/ 52)==>2;(/ 5(+ 2 0.0))==>2.5

zzyong00 发表于 2014-10-15 00:09:16

wzg356 发表于 2014-10-14 20:32 static/image/common/back.gif
控制字符e,n,r,t必须小写

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

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

自贡黄明儒 发表于 2014-10-15 09:44:12

;;以往只是听说,但从未测试
;;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))
)

zzyong00 发表于 2014-10-15 10:01:14

zzyong00 发表于 2014-10-15 00:09 static/image/common/back.gif
函数式语言,表达式中第一个位置不是函数名能是什么 ?这个不算限制吧

没有任何规则,恐怕做不了任何事
基于lisp的规则,讨论它的限制才有意义

highflybir 发表于 2014-10-15 10:22:39

Gu_xl 发表于 2014-10-14 18:35 static/image/common/back.gif
我补充几个限制问题:
1、一个图形创建的选择集个数不能超过128个!否则会出现错误:超出选择集数量的最大范 ...

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

highflybir 发表于 2014-10-15 11:19:49

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


页: [1] 2 3
查看完整版本: LISP编程的一些限制和范围