Lispp公司
回到我那堆不寻常的问题上来。我的批处理例程可以接受来自用户的字符串,这些字符串本质上是LISP代码。当然,可以计算这些字符串,并运行LISP代码。问题是,如果用户输入的命令格式不正确怎么办?假设他们输入“I love to sing-a,about the moon-a in the June-a in the spring-a”,而不是“(vl cmdf“circle”(getpoint)5)”。我需要一种方法来确定他们键入的是不是有效的LISP代码(因此这个线程的标题)。
我做了一些思考,只有两种方法可以解决这个问题,但它们都不完全令人满意。第一个是测试字符串是否可以作为有效列表读取,这是一种(listp(read))思想。如果命令格式正确,这将起作用,因为以这种方式输入的所有命令在通过“读取”函数传递时,将返回一个列表。然而,如果用户键入了一个列表,这将始终返回true,这意味着它不会检查它是否为有效代码。另一种方法是使用eval函数,它几乎完全实现了我试图实现的功能,只是我不希望代码实际被评估。我只是想检查一下,看看是否可以评估。
回想起来,这是一个小错误,尤其是因为一个拼写错误可能会毁掉整个作品(假设有人拼写错了“circle”,它仍然是有效的LISP代码,但无法正常运行),但它激起了我的好奇心。有什么想法吗? 好问题,但我可以看到一些限制。。。
当然,您可以使用以下方法检查有效列表:
(vl-consp (read <string> ))
但是,正如您所说,这只能确定用户是否输入了列表。
我的第二个想法是:
(vl-catch-all-error-p
(vl-catch-all-apply 'eval (list (read <string>))))
并检查是否抛出错误,但当然,这意味着要评估有问题的代码。。。 如果有10个以上的字符,其中一个不是括号,那么这显然不是有效的LISP代码。
你能试着在测试循环中评估它一次吗?如果它失败了,就返回无效?
对不起,我真的没有一个好答案,只是必须是一个聪明的亚历克。
格伦 我怀疑你能在不计算代码的情况下检查错误-否则我认为VLIDE会有一个内置的函数。。
但是,如果你对它进行评估,它不仅会做它编程要做的事情,你还将依赖于它可能拥有的任何用户输入。。。 我们都可以看到这是两种方式之一。
检查它是否是一个列表,检查它是否有相同数量的开括号和闭括号,等等,等等。基本上,把它拆开,按件建立一张有效的支票。
或者,自上而下:使用eval函数,但捕获所有“活动”,因此实际上什么都没有做。
后者看起来确实更简洁、更容易,因为在我看来,前者需要对照一长串有效选项进行检查,以至于几乎不可能实现。
我想知道。。是否可以将代码写入脚本,运行脚本,然后撤消所有活动?我在某个地方读到,一次“撤消”将撤消脚本中的所有操作。这将允许进行评估(因此,进行测试),最终不会进行任何更改。我认为它必须是一个脚本,因为如果它是直接的LISP,就没有办法知道做了多少更改。你怎么认为?
*编辑*单个撤消可能不起作用。谁知道呢,也许什么都没做。 为什么要使用脚本?
如果要测试代码,然后撤消更改,只需使用vla StartUndoMark/EndUndoMark或(命令“.undo”“\u begin”)/(…“\u end”)
但是,为了检查错误,您需要将代码包装在vla-catch-all-apply语句中,因此,我想您只会在标记错误时使用“undo”。 我会使用脚本,因为我不知道那些其他命令,但我现在肯定知道了!o、 o
如果将代码包装在(setq变量(vla catch all apply…)中,然后把它包在那些花哨的撤销位中。。难道你不能检查“变量”的状态,看看它是否是一个错误吗?或者,如果没有什么可撤销的,那么“撤销”位是否会不起作用? 天哪,我想就是这样。
非常感谢大家,我的好奇心现在很好 如果没有错误,为什么要撤消它?那么,代码确实做到了它的本意吗? 这个想法只是检查字符串是否可以计算。实际评估不会在此步骤中进行,而是在以后的步骤中进行。如果我一开始没有具体说明,我道歉。
页:
[1]