找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1272|回复: 4

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

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2007-3-1 18:25:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
我们知道,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. )  

各位能帮我想想办法,谢谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2007-3-1 20:13:41 | 显示全部楼层
举个例子,演示如何跳出循环:

  1. [FONT=courier new]
  2. (defun demo (/ catchit i)
  3.   (setq catchit                         ;catchit可以在以后用相关函数判断循坏是否有中途跳出的
  4.          (vl-catch-all-apply
  5.            '(lambda ()
  6.               (setq i 0)
  7.               (repeat 1000              ;循环一千次
  8.                 (setq i (1+ i))
  9.                 (if (= i 10)
  10.                   (exit)                ;在第十次时跳出
  11.                 )
  12.               )
  13.             )
  14.          )
  15.   )
  16.   (princ i)(princ)
  17. )[/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2007-3-2 10:31:53 | 显示全部楼层
谢谢各位了,我原以为exit是跳出整个程序的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2007-3-2 11:13:58 | 显示全部楼层
1.楼主的意思不大明白。
2.作为一种面向过程的语言,LISP提供了顺序、条件、循环、分支四种结构。
   对于GOTO跳转语句,其需要跳转位置标识,而LISP却是以表为结构,故该功能不能实现。
   但可以通过函数调用的方法变相实现各种需求。
3.楼主提供的代码很难懂,根据我的理解,改动后如下,以便讨论:
[PHP]
(defun fff (x jump)
    ;;x这个参数可有可无
    (cond
        ((= jump 10) (setq return 31))
        ((= jump 20) (setq return 21))
        ((= jump 30) (setq return z))
        (t
         (setq i 0)
         (while        (< i 50)             
             (setq x 1)
             (if (= i 10)                 
                 (setq jZ     10
                       i 100
                       return (fff x jZ)
                 )
                 (progn
                     (setq y 2)
                     (if (= jump 20)                         
                         (setq jZ     20
                               i 100
                               return (fff x jZ)
                         )
                         (progn
                             (setq z 31)
                             (if (= z 31)                                 
                                 (setq JZ     30
                                       i 100
                                       return (fff x JZ)
                                 )                                 
                             )
                         )
                     );结束(if (= jump 20)
                 )                       
             );结束(if (= i 10)
         )

        )
    )
)
[/PHP]
<br>
2007-03-22 15;40
前几天翻书发现LISP语言是提供有GOTO这个函数的,不知为何Alisp却把它给剔除掉了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2007-3-3 11:36:23 | 显示全部楼层

  1. (setq is t)
  2. (while (and is (...))
  3.   (cond ( (..) (setq is nil) )   ;;跳出了
  4.       ((..)(..)
  5.   )
  6. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-22 05:24 , Processed in 0.320175 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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