lisp提取多点assoc_lisp – 提取列表中的列表

不仅有一种可能的解决方案,而且我将保持接近您的代码.由于这是家庭作业,我不会给你一个有效的答案,但我会尽量给你一些思考的东西,并给出详细的指示:

尝试了解您的代码的作用以及您真正希望它执行的操作:

(defun remove-all (a l)

(cond ((null l) nil)

((eql (car l) a) (delete a (cdr l)))

(t (cons (car l) (delete a (cdr l))))))

(重命名为remove-all,因为已经进行了删除,并以理智的方式重新缩进.)

对于平面列表,代码似乎有效;但嵌套列表怎么样?让我们看一个简单的例子:

>如果你评估会发生什么(删除所有1′((1)))?

>你想为这个输入做些什么?

>你怎么能实现它?

让我们来看看:

>会发生什么:

>列表不为null,继续

>汽车不是等待1继续

>'(1)得到(删除所有'()),屈服'((1))

因此,它没有认识到汽车本身就是一个应该搜索匹配元素的列表.问题似乎在第一步和第二步之间.

>应该做什么:

>检查,如果汽车本身就是一个清单

>如果是,请调用remove-all

>然后,将结果归结为cdr,这也需要“清理”(提示:但只有在有缺陷的情况下)

>究竟怎么样?

>添加一个cond子句,它执行2中提到的事情 – 左边作为家庭作业

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lisp(LISt Processing)是一种编程语言,常被用于自动化CAD软件的开发与扩展。对于提取CAD块的所有属性,可以使用Lisp编写程序来完成。 在CAD软件,块(Block)是一种重要的元素,它可以将多个实体对象组合成一个整体,并赋予其唯一的标识符和属性。块可以包含属性,这些属性可以用于进一步描述和标识块。 要提取CAD块的所有属性,可以按照以下步骤进行操作: 1. 在Lisp,使用`(ssget)`函数选择所有的块对象,将其保存在一个选择集。 2. 遍历选择集,使用`(entget)`函数逐个获取每个块对象的详细信息。 3. 对于每个块对象,使用`(entget)`函数获取其属性列表。 4. 遍历属性列表,使用`(cdr)`函数逐个提取每个属性的键值对。 5. 将提取到的属性信息进行处理和保存,可以输出到控制台或者写入文件。 下面是一个简单的示例代码,用于在AutoCAD软件提取CAD块的所有属性: ```lisp (defun extract-block-attributes () (setq block-ss (ssget "X" '((0 . "INSERT")))) (setq block-count (sslength block-ss)) (setq attribute-list '()) (repeat block-count (setq block (ssname block-ss (setq i (1+ i)))) (setq attribute-ss (ssget "X" (list '(0 . "ATTRIB") (cons 2 (cdr (assoc 2 (entget block))))))) (setq attribute-count (sslength attribute-ss)) (setq j 0) (repeat attribute-count (setq attribute (ssname attribute-ss (setq j (1+ j)))) (setq attribute-data (entget attribute)) (setq attribute-list (append attribute-list (list attribute-data))) ) ) (setq attribute-count (length attribute-list)) (repeat attribute-count (setq attribute-data (nth (setq i (1+ i)) attribute-list)) (princ (cdr (assoc 2 attribute-data))) ; 输出属性名称 (princ ": ") (princ (cdr (assoc 1 attribute-data))) ; 输出属性值 (princ) ; 换行 ) ) ``` 上述代码通过`(ssget)`函数选择所有块对象,然后使用`(ssget)`函数再次选择对应的属性对象。通过遍历属性列表,再分别提取属性的键名和键值,并逐个输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值