明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2654|回复: 5

[求助]如何能在本函数内实现return的效果或者goto的效果呢?

[复制链接]
发表于 2007-3-1 18:25:00 | 显示全部楼层 |阅读模式
我们知道,C语言有return 关键字,return的效果是,当语句读到这个return时,函数或者程序就跳出所有语句,然后返回return语句后面的值,函数终结。而goto则是无条件转移到指定语句。
在lisp中,语句如果是层层嵌套的,括号内的语句没完,是不会跳转的,如何能像其他语言那样,在本函数内实现return的效果或者goto的效果呢?
我在lisp中测试了一下,发现很难实现这两种效果!
下面是我的例子:
  1. (defun fff (x jump) ;;x这个参数可有可无
  2.   (cond
  3.     ((= jump 10) (setq return 31))
  4.     ((= jump 20) (setq return 21))
  5.     ((= jump 30) (setq return z ))
  6.     (t
  7.       (setq i 0)
  8.       (while (< i 50)
  9.         (setq x 1)
  10.         (if (= i 10);;本想跳出while循环的,直接返回值
  11.           (setq jZ 10
  12.   return (fff x jZ)
  13.    )
  14.         )
  15.         (setq y 2)
  16.         (if (= jump 20);;没办法跳出去
  17.           (setq jZ 20
  18.   return (fff x jZ)
  19.    )
  20.         )
  21.         (setq z 31)
  22.         (if (= z 31);;没办法跳出去
  23.    (setq JZ   30
  24.   return (fff x JZ)
  25.    )
  26. )
  27.         (setq i (1+ i))
  28.       )
  29.       (setq return 100)
  30.     )
  31.   )
  32. )  
  33.       
各位能帮我想想办法,谢谢了!

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2007-3-1 19:57:00 | 显示全部楼层
本帖最后由 作者 于 2007-3-1 19:58:47 编辑

举个例子,演示如何跳出循环:
  1. (defun demo (/ catchit i)
  2.   (setq catchit                         ;catchit可以在以后用相关函数判断循坏是否有中途跳出的
  3.          (vl-catch-all-apply
  4.            '(lambda ()
  5.               (setq i 0)
  6.               (repeat 1000              ;循环一千次
  7.                 (setq i (1+ i))
  8.                 (if (= i 10)
  9.                   (exit)                ;在第十次时跳出
  10.                 )
  11.               )
  12.             )
  13.          )
  14.   )
  15.   (princ i)(princ)
  16. )
发表于 2007-3-1 23:26:00 | 显示全部楼层
  1. (setq k T i 0)
  2. (while (and k1 (< i 1000))
  3.   ...
  4.   (while (and k1 k2 ...)
  5.     ...
  6.      (if ... (setq k1 nil))
  7.      (if ... (setq k2 nil))
  8.   )
  9. )
 楼主| 发表于 2007-3-2 10:34:00 | 显示全部楼层

谢谢各位了,我原以为exit是跳出整个程序的。

发表于 2007-3-2 12:22:00 | 显示全部楼层
AUTOLISP年代EXIT是跳出整个程序的,但VLISP年代多了vl-catch-all-apply才能中途跳出
发表于 2012-8-13 10:26:37 | 显示全部楼层
留下足迹,收藏
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-8 04:04 , Processed in 0.158762 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表