乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 83|回复: 9

[编程交流] Lispp公司

[复制链接]

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 12:28:37 | 显示全部楼层 |阅读模式
回到我那堆不寻常的问题上来。
 
我的批处理例程可以接受来自用户的字符串,这些字符串本质上是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代码,但无法正常运行),但它激起了我的好奇心。有什么想法吗?
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:37:52 | 显示全部楼层
好问题,但我可以看到一些限制。。。
 
当然,您可以使用以下方法检查有效列表:
 
  1. (vl-consp (read <string> ))

 
但是,正如您所说,这只能确定用户是否输入了列表。
 
我的第二个想法是:
 
  1. (vl-catch-all-error-p
  2. (vl-catch-all-apply 'eval (list (read <string>))))

 
并检查是否抛出错误,但当然,这意味着要评估有问题的代码。。。
回复

使用道具 举报

13

主题

126

帖子

114

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
65
发表于 2022-7-6 12:47:35 | 显示全部楼层
如果有10个以上的字符,其中一个不是括号,那么这显然不是有效的LISP代码。
 
你能试着在测试循环中评估它一次吗?如果它失败了,就返回无效?
 
对不起,我真的没有一个好答案,只是必须是一个聪明的亚历克。
 
格伦
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 12:51:39 | 显示全部楼层
我怀疑你能在不计算代码的情况下检查错误-否则我认为VLIDE会有一个内置的函数。。
 
但是,如果你对它进行评估,它不仅会做它编程要做的事情,你还将依赖于它可能拥有的任何用户输入。。。
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 12:57:11 | 显示全部楼层
我们都可以看到这是两种方式之一。
 
检查它是否是一个列表,检查它是否有相同数量的开括号和闭括号,等等,等等。基本上,把它拆开,按件建立一张有效的支票。
 
或者,自上而下:使用eval函数,但捕获所有“活动”,因此实际上什么都没有做。
 
后者看起来确实更简洁、更容易,因为在我看来,前者需要对照一长串有效选项进行检查,以至于几乎不可能实现。
 
我想知道。。是否可以将代码写入脚本,运行脚本,然后撤消所有活动?我在某个地方读到,一次“撤消”将撤消脚本中的所有操作。这将允许进行评估(因此,进行测试),最终不会进行任何更改。我认为它必须是一个脚本,因为如果它是直接的LISP,就没有办法知道做了多少更改。你怎么认为?
 
*编辑*单个撤消可能不起作用。谁知道呢,也许什么都没做。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:04:56 | 显示全部楼层
为什么要使用脚本?
 
如果要测试代码,然后撤消更改,只需使用vla StartUndoMark/EndUndoMark或(命令“.undo”“\u begin”)/(…“\u end”)
 
但是,为了检查错误,您需要将代码包装在vla-catch-all-apply语句中,因此,我想您只会在标记错误时使用“undo”。
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 13:14:52 | 显示全部楼层
我会使用脚本,因为我不知道那些其他命令,但我现在肯定知道了!o、 o
 
如果将代码包装在(setq变量(vla catch all apply…)中,然后把它包在那些花哨的撤销位中。。难道你不能检查“变量”的状态,看看它是否是一个错误吗?或者,如果没有什么可撤销的,那么“撤销”位是否会不起作用?
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 13:21:58 | 显示全部楼层
天哪,我想就是这样。
 
非常感谢大家,我的好奇心现在很好
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 13:25:47 | 显示全部楼层
如果没有错误,为什么要撤消它?那么,代码确实做到了它的本意吗?
回复

使用道具 举报

20

主题

344

帖子

325

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
100
发表于 2022-7-6 13:28:43 | 显示全部楼层
这个想法只是检查字符串是否可以计算。实际评估不会在此步骤中进行,而是在以后的步骤中进行。如果我一开始没有具体说明,我道歉。
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-3-5 06:04 , Processed in 0.364442 second(s), 72 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表