22 在 AutoCAD 2000 或更高版本中使用相同的函数调用: 命令:((if t if) nil (princ 1) (princ 2)) 12; 错误: 无法应用特殊格式: IF 运算符位置的计算顺序不同 AutoLISP 的早期版本先计算表达式中的运算符位置,然后从左到右计算参数。在 AutoCAD 2000 和更高版本中,AutoLISP 先从左到右计算参数,然后再计算运算符。 不允许 LAMBDA 主体为空 在 AutoCAD 2000 和更高版本中,主体为空的 lambda 语句将导致语法错误。这种结构在 AutoCAD R14 中可以使用。这种 lambda 主体可能出现在 LAMBDA、DEFUN、DEFUN-Q 和表函数表达式中。例如,下列语句将导致错误: (lambda (a)) (setq func '(a)) (func) 下列表达式是有效的: (lambda (a) nil) (setq func '((a) nil)) (func) 在多种访问模式中同时打开文件的处理 单个文件在不同的访问模式下同时打开的处理已经被纠正。在 AutoLISP 的早期版本中,打开单个文件并同时执行读、写和附加到文件将产生可重复但不标准的结果。在一个文件上的操作影响其他文件上的下一个操作。在 AutoCAD 2000 和更高版本中,下一个读、写或附加操作的位置被定位在每个打开的文件上,并在程序员的控制之下。例如,以下函数在 R14 与 AutoCAD 2000 和更高版本中执行的结果不同: (defun file-handle () (setq write-ptr (open "test.txt" "w") append-ptr (open "test.txt" "a") read-ptr (open "test.txt" "r")) ;; 用写模式写五行 (repeat 5 (write-line "write-mode lines" write-ptr)) ;; 用附加模式写五行 (repeat 5 (write-line "append-mode lines" append-ptr)) ;; 从文件开头读文件内容 (while (print (read-line read-ptr))) (close write-ptr) (close append-ptr) (close read-ptr) (princ) ) 在 AutoCAD R14 中,函数执行结果为一个包含十行文字的文本文件(五行包含字符串“write-mode lines”,五行包含“append-mode lines”)。在 AutoCAD 2000 和更高版本中,得到的文件只包含五行“append-mode lines”,因为用于添加模式的文件指针未被写操作重置。 结果溢出的 EXPT 返回不同的值 在 AutoCAD R14 中,EXPT 表达式计算出的值如果超过 AutoLISP 双精度浮点范围将返回 0。在 AutoCAD 2000 和更高版本中,同一个表达式将返回“1.#INF”。 在 LISPINIT=1 的 SDI 中,在后续的图形中不加载 ACAD.LSP 和 MNL 文件 在 SDI 模式下运行并将 LISPINIT 系统变量设置为 1 时,acad.lsp 文件只加载到启动文档中,而不是加载到所有在 AutoCAD 任务中后续打开的图形中。为确保将 acad.lsp 加载到所有新文档中,请将 ACADLSPASDOC 系统变量设置为 1。 OSNAP 的新默认设置可能导致应用程序失败 |