乐筑天下

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

[编程交流] (做这个)或(做那个)

[复制链接]

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 17:56:24 | 显示全部楼层 |阅读模式
大家好,
又是我!
 
我对此感到好奇和鼓舞:
185627kfzrdknsddt77zgt.jpg
 
有没有人有过类似的经验?
我的意思是:
[执行此操作]或选择[option1/option2/option3…]在做这件事的时候。
 
以下是我对getstring和getkword的尝试:
  1. ;(Do this) or (do that)
  2. ;Type string or choose keyword:
  3. ;Similar: getdist or getreal
  4. (defun c:test ( / ans )
  5. (setq ans (getstring t "\nType a string or [KWORD] : "))
  6.    (cond
  7.       ( (= ans "KWORD") ( (initget 1 "KW1 KW2 KW3") (setq ans (getkword "\nChoose keyword [KW1/KW2/KW3] : ")) (princ (strcat "\nFinal answer is " ans " ")) )
  8. ;          (cond
  9. ;            ( (= ans "KW1" ) (princ "\nFinal answer is keyword1 ") )
  10. ;            ( (= ans "KW2" ) (princ "\nFinal answer is keyword2 ") )
  11. ;            ( (= ans "KW3" ) (princ "\nFinal answer is keyword3 ") )
  12. ;            (t (princ (strcat "\nFinal answer is " ans " ")) )
  13. ;          );cond
  14.        ) ; = ans "KWORD"
  15.        (t (princ (strcat "\nFinal answer is " ans " "))
  16.        ); t
  17.    );cond
  18. ;   (princ (strcat "\nFinal answer is " ans " "))
  19.    (princ)
  20. );defun
  21. (princ)

 
然而,我遇到的问题是:
  1. Choose keyword [KW1/KW2/KW3] : KW1
  2. Invalid option keyword.

我不理解为什么指定的选项无效,因为它包含在initget函数中。
 
无论如何,我喜欢这种方法,因为对于getdist和getreal函数,值可以用图形和分析方式表示(无需额外提示选择图形或分析方法)。
回复

使用道具 举报

5

主题

1334

帖子

1410

银币

限制会员

铜币
-20
发表于 2022-7-5 18:17:19 | 显示全部楼层
在第一个cond语句中有额外的()。。。
 
  1. ;(Do this) or (do that)
  2. ;Type string or choose keyword:
  3. ;Similar: getdist or getreal
  4. (defun c:test ( / ans )
  5. (setq ans (getstring t "\nType a string or [KWORD] : "))
  6. (cond
  7.     ( (= ans "KWORD")
  8.       (initget 1 "KW1 KW2 KW3")
  9.       (setq ans (getkword "\nChoose keyword [KW1/KW2/KW3] : "))
  10.       (princ (strcat "\nFinal answer is " ans " "))
  11.     ) ; = ans "KWORD"
  12.     (t (princ (strcat "\nFinal answer is " ans " "))
  13.     ); t
  14. );cond
  15. (princ)
  16. );defun

 
这是修订版。。。
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:25:55 | 显示全部楼层
除非您打算在通用程序中将getstring与关键字结合使用,否则不需要额外的提示,例如:
  1. (defun c:test ( / ans )
  2.    (initget "Alpha Beta Gamma")
  3.    (cond
  4.        (   (not (setq ans (getdist "\nEnter a distance or [Alpha/Beta/Gamma]: ")))
  5.            (princ "\nUser exited.")
  6.        )
  7.        (   (numberp ans)
  8.            (princ "\nUser entered a distance: ")
  9.            (princ ans)
  10.        )
  11.        (   (princ "\nUser selected a keyword: ")
  12.            (princ ans)
  13.        )
  14.    )
  15.    (princ)
  16. )
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:37:02 | 显示全部楼层
你好,marko_ribar,
谢谢你清理这个!我可能需要开始使用VLIDE,以使我的语法更具可读性(我习惯于在记事本中编写那些lisp代码)
 
 
李,你好,
我试图从您的代码中理解这一部分,因为它缺少谓词:
  1.         (   (princ "\nUser selected a keyword: ")
  2.            (princ ans)
  3.        )

 
那部分是你的代码(否则做这个)部分吗
或者(然后做第三件事)优先级最低?
 
从条件教程:
  1. (cond ((predicate1) (then do something 1))    ;if this predicate is true,
  2.                                              ;do something1
  3.      ((predicate2) (then do something 2))    ;if this predicate is true,
  4.                                              ;do something2,
  5.                                              ;each predicate and action
  6.                                              ;following the
  7.                                              ;first one is optional
  8.      (t (else do this))                      ;else, if none of the
  9.                                              ;predicates returns
  10.                                              ;T, do this
  11. )
回复

使用道具 举报

114

主题

1万

帖子

1万

银币

中流砥柱

Rank: 25

铜币
543
发表于 2022-7-5 18:44:45 | 显示全部楼层
 
第一个princ表达式[(princ“\n用户选择的关键字:”)]构成cond条件的谓词。由于AutoLISP中的任何非nil值都将验证条件语句,因此princ表达式返回的字符串将验证测试表达式,并导致计算第二个princ表达式。
 
这基本上等同于使用:
然而,由于princ将始终返回提供的字符串(即非零值),因此不需要使用“t”强制计算条件,因为princ表达式可用于获得相同的结果。
回复

使用道具 举报

66

主题

1552

帖子

1514

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
325
发表于 2022-7-5 18:58:26 | 显示全部楼层
李,
谢谢你的解释!
你对细节的了解太棒了!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-12 23:50 , Processed in 0.623547 second(s), 67 queries .

© 2020-2025 乐筑天下

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