乐筑天下

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

[编程交流] Cond语句问题

[复制链接]

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:22:29 | 显示全部楼层 |阅读模式
好的,我在试验LOGAND命令,只是作为一个学习练习。
 
我试着构建这个LISP:
 
  1. (defun c:BXLister (/ BX_Ans BX_Ent BX_List)
  2.    (initget "Blocks Xrefs")
  3.    (setq BX_Ans (getkword "\nList Blocks or XRefs? [blocks/XRefs] <Both> : "))
  4.    (cond
  5.    ((= BX_Ans "Blocks")
  6.     (setq BX_Ent  (tblnext "BLOCK" T)
  7.           BX_List "Blocks: \n"
  8.     ) ;_  end setq
  9.     (while    BX_Ent
  10.         (if (eq 0 (logand 0 (cdr (assoc 70 BX_Ent))))
  11.         (setq BX_List (strcat BX_List (cdr (assoc 2 BX_Ent)) "\n"))
  12.         ) ;_  end if
  13.         (setq BX_Ent (tblnext "BLOCK"))
  14.     ) ;_  end while
  15.    )
  16.    ((= BX_Ans "XRefs")
  17.     (setq BX_Ent  (tblnext "BLOCK" T)
  18.           BX_List "XRefs: \n"
  19.     ) ;_  end setq
  20.     (while    BX_Ent
  21.         (if (eq 4 (logand 4 (cdr (assoc 70 BX_Ent))))
  22.         (setq BX_List (strcat BX_List (cdr (assoc 2 BX_Ent)) "\n"))
  23.         ) ;_  end if
  24.         (setq BX_Ent (tblnext "BLOCK"))
  25.     ) ;_  end while
  26.    )
  27.    ((/= BX_Ans "XRefs" "Blocks")
  28.     (setq BX_Ent  (tblnext "BLOCK" T)
  29.           BX_List "Blocks & XRefs: \n"
  30.     ) ;_  end setq
  31.     (while    BX_Ent
  32.         (setq BX_List (strcat BX_List (cdr (assoc 2 BX_Ent)) "\n"))
  33.         (setq BX_Ent (tblnext "BLOCK"))
  34.     ) ;_  end while
  35.    )
  36.    ) ;_  end cond
  37.    (alert BX_List)
  38.    (princ)
  39. ) ;_  end defun

 
我打算根据用户的输入列出外部参照或块。
 
然而,事实上,我遇到的问题并不是logand函数-问题发生在用户输入以列出外部参照时-程序将列出块和外部参照。
 
我认为cond语句有错误,但我看不出是什么
 
提前谢谢各位。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:33:41 | 显示全部楼层
好啊
 
我以不同的方式执行了相同的任务-为了每个人的利益发布:
 
  1. (defun c:BXLister (/ BX_Ent BX_BList BX_XList)
  2.    (setq BX_Ent   (tblnext "BLOCK" T)
  3.      BX_BList "Blocks: \n"
  4.      BX_XList "Xrefs: \n"
  5.    ) ;_  end setq
  6.    (while BX_Ent
  7.    (if (eq 0 (logand 0 (cdr (assoc 70 BX_Ent))))
  8.        (setq BX_BList (strcat BX_BList (cdr (assoc 2 BX_Ent)) "\n"))
  9.    ) ;_  end if
  10.    (if (eq 4 (logand 4 (cdr (assoc 70 BX_Ent))))
  11.        (setq BX_XList (strcat BX_XList (cdr (assoc 2 BX_Ent)) "\n"))
  12.    ) ;_  end if
  13.    (setq BX_Ent (tblnext "BLOCK"))
  14.    ) ;_  end while
  15.    (alert (strcat BX_BList "\n" BX_XList))
  16.    (princ)
  17. ) ;_  end defun
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 15:37:16 | 显示全部楼层
李,
 
单步遍历非图形表的最简单方法是(while)调用:
 
 
大卫
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:42:18 | 显示全部楼层
了不起的大卫,
 
我在使用while进行操作之前先使用cond,这让我觉得很尴尬。
 
我喜欢你的Lisp程序-谢谢。
回复

使用道具 举报

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 15:51:07 | 显示全部楼层
嗨,李,
关于您使用COND的第一个代码示例,我还没有对其进行足够的研究,以完全理解您在做什么,但我确实注意到了这句话
(/=BX_Ans“XRefs”“Blocks”)。我的参考文献中说,不等于函数的定义没有两个以上的参数。这可能是个问题。奇怪的是,在参考手册中,函数是写的(/=atom-atom…),提出两个以上的论点!我猜是打字错误。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 15:55:32 | 显示全部楼层
我的印象是这些功能:
 
=,/=,=可以接受任意数量的参数。
 
如果键入:
 
  1. (/= 4 5 6)

在命令行中,它返回T。
 
谢谢你的时间。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-6 16:03:13 | 显示全部楼层
大卫,
 
只是出于好奇,你是在发帖时手动为每个括号指定不同的颜色,还是有一个程序可以帮你这么做?
回复

使用道具 举报

CAB

29

主题

781

帖子

430

银币

中流砥柱

Rank: 25

铜币
526
发表于 2022-7-6 16:04:58 | 显示全部楼层
我喜欢大卫的。
对此修改输出:
  1. 4
回复

使用道具 举报

10

主题

109

帖子

99

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
50
发表于 2022-7-6 16:15:21 | 显示全部楼层
李,
我对不相等函数的研究很少,结果发现了我的两个参考文献中的错误或遗漏
在Autolisp中,该函数的非标准行为(对我来说)令人惊讶。您可能希望测试Autocad 2004,看看它是否
符合以下要求:
从Autocad 2008联机帮助文件中提取:
.... 如果没有两个连续参数的值相同,则返回T;否则为零。如果只提供了一个参数,/=返回T。
注意,/=的行为并不完全符合其他LISP方言。如果列表中没有两个参数具有相同的值,则标准行为是返回T。在AutoLISP中,如果没有连续参数具有相同的值,则/=返回T;请参阅下面的示例。
示例
(/=10 20)返回T
(/=“you”“you”)返回nil
(/=5.43 5.44)返回T
(/=10 20 10 20)返回零
(/=10 20)返回T
注意:在最后一个示例中,虽然列表中有两个参数具有相同的值,但它们并不跟随在一起;因此/=计算为T。
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 16:18:34 | 显示全部楼层
(/=)函数一直都很脆弱,文档编写得很糟糕。我不惜一切代价避免它,因为它几乎没有实际价值。
 
李,
 
我写了一个程序,可以读取。LSP文件并将其格式化为HTML很早以前。不久前,当CADTutor更改了格式并对其进行了一些调整时,我将其重新编辑为BBC的输出。我一直认为彩色编码的paraenthisis是一个很好的校对工具。也是一个很好的学习工具。
 
我不太喜欢结尾评论;如果结束
 
我在开发一个非常拉格雷罗图因时不时使用它们,但在最终版本中省略了它们-大卫
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-4 18:11 , Processed in 0.433514 second(s), 72 queries .

© 2020-2025 乐筑天下

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