Glen Smith 发表于 2022-7-6 12:52:06

请教育我。

我正在通过修改李不久前为我写的一些代码来学习LISP。有人能给我解释一下下面两段代码之间的区别吗?
 

(setq bname (getfiled "select block to insert" "" "dwg" )
(if (setq file
            (getfiled "Select Text File" (if *load *load "") "txt" )
   (progn .......

 

(setq bname (getfiled "select block to insert" "" "dwg" 0))
(if (setq file
            (getfiled "Select Text File" "" "txt" 0))
   (progn .......

 
李的代码是第一个,我已经修改为第二个。在选择输入文件后,我遇到了“文件为零”的问题,我认为我跟踪到了位字段-8只发送文件名,0发送完整路径。(if*load*load“”)语句做什么?为什么要使用它,而不是它下面明显更简单的版本?
 
根据VLISP帮助文件:
 
我不确定为什么要使用表达式来指定默认文件名?
 
谢谢你给我的指导。
 
格伦

Lee Mac 发表于 2022-7-6 13:03:51

我使用*load作为全局变量,并在选择文件后存储新的文件路径,因此它将此作为下一个默认值。
 
至于位代码,8将只返回文件名(如果文件位于搜索路径中),但您可以使用“findfile”获取整个路径。
 
如果没有,您可以使用128获得整个路径。
 
请记住,位0用于创建新文件。

Glen Smith 发表于 2022-7-6 13:13:46

啊-这很有道理,我没有想过它是一个全局变量。
 
据我所知,位0用于创建一个新文件,但仅当它被设置时。因此,创建一个新文件将是1而不是0,对吗?
 
谢谢,我真的很感谢有一个地方,我可以问问题,而不是仅仅依靠帮助文件和试错。
 
格伦

Lee Mac 发表于 2022-7-6 13:20:18

嗯,现在你让我思考了。
 
在帮助文件中,它说使用0到15之间的整数作为标志,但是我只使用过位值:1、4、8、16等等。
 
但这就提出了一个问题,如果两者都可以使用,AutoCAD如何知道您想要的是位代码8还是(3+5)?
 

Glen Smith 发表于 2022-7-6 13:28:07

根据帮助文件,不使用位1(二进制值2),但无论如何,任何给定值都会在该位编码字段中设置一组唯一的位。3不是一个单一的标志值,而是两个不同的标志都设置了:位0(小数点1)和位1(小数点2)都设置并相加得到小数点3。(在这种情况下无效,因为未使用位1)
同样,5将是位2(十进制4)添加到位0(十进制1)的集合。
 
8只能设置为位3。
 
我花了一段时间才了解位编码字段,但一旦通过了二进制到十进制到二进制的转换,就可以用一个数字设置多个选项。
 
格伦

Lee Mac 发表于 2022-7-6 13:37:20

哦,别误会,我知道二进制加法是如何工作的,但我认为可以使用位值而不是二进制值,反之亦然。

Glen Smith 发表于 2022-7-6 13:45:44

我想你知道它是怎么工作的,只是想确保其他人读到它时不会感到困惑。
 
另一个问题,是*使这个变量成为全局变量吗?15年前,我不得不(两次)上一门1学分的C课程,这门课程一直留在我的脑海里,它告诉我这是一个指针,而不是一个变量,但我猜想LISP不使用指针。
 
在“*”上搜索是徒劳的。
 
格伦

Lee Mac 发表于 2022-7-6 13:58:18

啊,抱歉搞砸了。
 
全局变量可以是函数定义中未本地化的任何符号(语法旁边的两个括号)。
 
我只是使用了更模糊的符号,例如“*load”或“$load”,这样它们就不太可能与其他程序使用的变量冲突。
 
页: [1]
查看完整版本: 请教育我。