乐筑天下

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

[编程交流] Can';t退出WHILE循环

[复制链接]

24

主题

147

帖子

123

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
120
发表于 2022-7-6 06:07:41 | 显示全部楼层 |阅读模式
大家好,
 
我被困在while循环中,无法摆脱它。有人能帮我吗(如果可能的话,请提供为什么它没有关闭的信息)。这只是我正在使用的一个更大的lisp的一个小函数,退出Esc意味着完整的程序终止。
 
以下是我如何使用它的。一旦用户决定使用drawshapes,如果答案是关键字之一(例如矩形),则用户应该能够绘制他喜欢的任意多个矩形,如果按Enter键,则应再次返回主菜单,要求选择关键字(圆形或椭圆)。
 
提前谢谢。
 
  1. (defun drawshapes (/ dtype)
  2.       (setvar "cmdecho" 1)
  3.       (setq dtype T)
  4.       (while dtype
  5.         (initget (+ 2 4) "R P C E")
  6.         (prompt "\n***    Enter option R, P, C, E   ***")
  7. (setq dtype (getkword "\nselect your option: Rectangle, Pline, Circle, Ellipse or hit Enter to close:"))
  8. (if dtype
  9.                
  10.    (cond
  11.     ( (= dtype "R")
  12.               (setq loop T)
  13.               (while loop   
  14.            (command "_.rectang")
  15.                   (while (= 1 (logand 1 (getvar 'CMDACTIVE)))(command pause))
  16.               ); end while
  17.     )
  18.     ( (= dtype "P")
  19.               (setq loop T)
  20.               (while loop
  21.                   (command "_.PLINE")
  22.            (while (= 1 (logand 1 (getvar 'CMDACTIVE)))(command pause))
  23.               ); end while
  24.            )
  25.     ( (= dtype "C")
  26.               (setq loop T)
  27.               (while loop
  28.                   (command "_.circle")
  29.                   (while (= 1 (logand 1 (getvar 'CMDACTIVE)))(command pause))
  30.               ); end while
  31.     )
  32.     ( (= dtype "E")
  33.               (setq loop T)
  34.               (while loop
  35.            (command "Ellipse")
  36.            (while (= 1 (logand 1 (getvar 'CMDACTIVE)))(command pause))
  37.               ); end while
  38.     )
  39.      ); end cond
  40. ); end if
  41.      ); end while
  42.      (setvar "cmdecho" 0)
  43. );end defun
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:15:07 | 显示全部楼层
(当数据类型

(如果是数据类型?
不是一个大师能告诉你为什么和确切的原因,但这些是我的第一个想法,也是我要研究的
回复

使用道具 举报

24

主题

147

帖子

123

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
120
发表于 2022-7-6 06:20:26 | 显示全部楼层
我已经在getkword行下面有了(if-dtype)。这不是同一件事吗?我尝试将while改为if,并给出了语法错误。
 
我想我有太多的时间Setq的数据类型。不知道为什么。。。我很困惑
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 06:22:00 | 显示全部楼层
在某些情况下,您必须将loop设置为nil。
 
此外,您可以使用:
  1. (while (setq dtype (getkword "\n....

 
 
-大卫
回复

使用道具 举报

26

主题

1495

帖子

20

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
118
发表于 2022-7-6 06:27:16 | 显示全部楼层
此外,AFAIK,getkword实际上在(initget)调用中只使用1或0。
 
-大卫
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:29:53 | 显示全部楼层
如果你在大多数情况下使用while,我会在while上看到一个增量计数器。。
  1. (setq cntr 1)
  2. actions
  3. (setq cntr (1+ cntr))
  4.         ;increment the counter

或者像大卫说的那样,你可以(setq dtype nil)
在每个(=dtype)语句之后。这将在使用一次后退出循环,但它表示您希望他们能够进入其中许多形状。。。因此,您可以根据更多用户输入设置标志。
 
注意你的代码中:
  1. (setq loop T)
  2.               (while loop

 
 
这意味着是的,它们确实应该留在这个循环中,直到你添加一些关闭/退出循环的东西,通常是(setq loop nil),对于你在那里得到的东西。
hth公司
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:33:30 | 显示全部楼层
这里还有一个片段,我使用initget和strcase的组合来获得正确的用户输入。initget函数还将确保用户从预定义列表中进行选择,因此我觉得测试用户输入没有正常必要
  1. (initget "Freeze Thaw On oFF Lock Unlock eXit")        ;; establish controls
  2. (setq lstate (strcase (getkword "\nChoose layer control [Freeze/Thaw/On/oFF/Lock/Unlock/eXit]:")))

 
我不确定initget中的算术是否真的在做任何事情,因为只要在下半部分加上一个(strcase)就可以对给定的选择进行任何大小写,因此。。。。只有在做出正确选择时,prog才会继续,而不在initget中使用算术。我不确定这是否或多或少是正确的,但它对我的目的很有效
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:40:54 | 显示全部楼层
另一个例子,这一项归功于Jeffery p sanders和他的importxyz。lsp。只是摘录一下,展示一些现有的方法
  1.      ;;;--- Inform the user of progress
  2.      (if(> cellCnt 99)
  3.        (progn
  4.          (princ "\n Currently retrieving cells in Row ")
  5.          (princ (strcat (itoa stRow) " of " (itoa LsRow)))
  6.          (setq cellCnt 0)
  7.        )
  8.      )
  9.      ;;;--- Increment the column
  10.      (setq stCol(+ stCol 1))
  11.      ;;;--- Make sure the column stays in the range
  12.      (if(> stCol LsCol)
  13.        (setq stCol copyCol stRow(+ stRow 1))
  14.      )
  15.    )
  16.    ;;;--- Return the list
  17.    cellList
  18. )  

 
但是,请密切关注其中的变量。。
回复

使用道具 举报

15

主题

243

帖子

228

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
75
发表于 2022-7-6 06:42:30 | 显示全部楼层
再举一个例子,希望能有所帮助。。。
(这是Jeff Tippit,SPAUG总裁,www.SPAUG.org的lisp)
  1.      (setq DO_MORE "Y")
  2.      (while (= DO_MORE "Y")
  3.         (BIG_LOOP)
  4.      ); End while
  5.      (defun BIG_LOOP ()
  6.         (USER_INPUT)
  7.         (setq FRAMUS_DONE 0)     
  8.         (while (/= FRAMUS_DONE 1)
  9.            (SHOW_DIALOG)
  10.         ); End while
  11.         (I_OR_G)
  12.         (initget "Y N")
  13.         (setq DO_MORE (getkword "\nChange more blocks? Y/N <Y>: "))
  14.            (if
  15.               (or
  16.                  (= DO_MORE "y")
  17.                  (= DO_MORE "")
  18.                  (= DO_MORE nil)
  19.               ); End or
  20.                  (setq DO_MORE "Y")
  21.            ); End if
  22.      ); End BIG LOOP

在上面的这个例子中,你可以看到他是如何接受用户输入并根据用户选择决定是否继续程序的
回复

使用道具 举报

2

主题

389

帖子

387

银币

初来乍到

Rank: 1

铜币
10
发表于 2022-7-6 06:46:48 | 显示全部楼层
我同意循环变量会让你永远停留在时间里,除非你找到改变它的方法。总的来说,你的方法似乎在正确的轨道上。
 
我更喜欢在用户眼中看起来更像自动驾驶。这是一个编辑,它充实了您的选项,添加了一个显式的退出选项,并且需要一个简单的回车/回车来重复最后一个选项。它还需要一个额外的变量,该变量应添加到本地列表中。未经测试。
 
在快速回顾之后,我发现我的cond实际上并不必要,因为如果dtype=“eXit”,循环不应该走那么远。哎呀!
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-10 18:19 , Processed in 0.937572 second(s), 83 queries .

© 2020-2025 乐筑天下

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