从when语句中的函数返回

罗格班塔

我要做的就是使用when语句返回一个值:(我想要以下功能:

if(x)
    return y

我正在尝试使用:

(when (x) y)

但是when语句不是以退出函数并返回y的方式求值的。它只是愉快地进行到下一行。有没有一种方法可以在不制作看起来非常难看的if-else块的情况下进行此操作?mzscheme / racket不允许使用1臂ifs。

扔掉账户

您将其标记为Common Lisp和Racket,这是两种完全不同的语言。如果您使用的是Racket或Scheme,并且想尽早从某个函数返回,则可以使用延续来实现:

(define (my-function x y)
  (call-with-current-continuation
    (lambda (return)
      (when x (return y))
      ;; Rest of code not evaluated if X is true
      )))

在包括Racket在内的某些Scheme实现中,call-with-current-continuation也绑定到call/cc,但这call-with-current-continuation是使用延续的唯一可移植方式。

上面的内容比使用cond语句还要丑如果要消除所有多余的废话,可以定义一个宏,该宏创建替代版本的宏,该替代版本define会自动创建延续并将其绑定到return

(define-syntax define/return
   (syntax-rules ()
      ((_ (name . args) . body)
       (define (name . args)
         (capture-vars (return)
            (call/cc (lambda (return) . body)))))))

这需要您具有我的capture-vars宏,您可以在此答案中找到

编辑:Leppie提供了以下实现,define/return它的实现要简单得多,因为它不需要我的capture-vars宏:

(define-syntax define/return
  (lambda (x)
    (syntax-case x ()
      [(_ (name . args) . body)
        (with-syntax
          ([return (datum->syntax #'name 'return)])
         #'(define (name . args)
             (call/cc (lambda (return) . body))))])))

编辑2:但是,return如果将a合并define/return到另一个宏中,则很容易意外地取消捕获这样做的定义

然后,return将按照您的预期运行,并且不会在语法上令人讨厌:

(define/return (my-function x y)
    (when x (return y))
    ;;; more code...
)

但是,如果您使用Common Lisp,情况会有所不同。在Common Lisp中,(return y)仅当定义blocknamed时才编译nil某些形式会隐式定义名为的块nil,例如loop宏。如果没有名为的块nil,您仍然可以使用return-from从已命名的块返回。如果您使用定义了一个函数defun,则该函数的名称也是包装该函数的块的名称,因此可以使用:

(defun my-function (x y)
   (when x (return-from my-function y))
   ;;; more code
   )

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在反应返回语句中调用函数的方法

来自分类Dev

函数返回语句中的字符串串联与逗号

来自分类Dev

IF语句中函数的返回值显示异常行为

来自分类Dev

CBool函数在Access SQL语句中返回整数

来自分类Dev

递归函数的返回语句中的 Ocaml 类型错误

来自分类Dev

如何在if语句中调用函数并保存返回值

来自分类Dev

在MySQL语句中返回\'

来自分类Dev

在else语句中返回

来自分类Dev

if语句中的递归函数

来自分类Dev

返回语句中的JavaScript分配

来自分类Dev

return语句中的Javascript函数

来自分类Dev

在if语句中悬挂的Javascript函数

来自分类Dev

SELECT语句中的DATETIME函数

来自分类Dev

循环语句中的函数IIF

来自分类Dev

在if语句中处理布尔函数

来自分类Dev

在switch语句中调用函数。

来自分类Dev

if语句中的jQuery addClass()函数

来自分类Dev

无法在if语句中调用函数

来自分类Dev

Case 语句中的求和函数

来自分类Dev

在select语句中使用表值函数返回值

来自分类Dev

Oracle是否关闭从SELECT语句中使用的函数返回的SYS_REFCURSOR?

来自分类Dev

在我的语句中使用布尔函数时返回始终为假

来自分类Dev

在用户定义函数的if()语句中使用strcmp不会返回预期的输出

来自分类Dev

在select语句中使用表值函数返回值

来自分类Dev

如何直接将bash函数的返回值放入if语句中?

来自分类Dev

从void函数的return语句中调用函数

来自分类Dev

从void函数的return语句中调用函数

来自分类Dev

返回IF ELSE IF语句的函数

来自分类Dev

函数中的返回语句