【问题标题】:How to exit from a function at any arbitrary point, in elisp如何在任意点退出函数,在elisp中
【发布时间】:2013-04-27 05:13:43
【问题描述】:

这是一个简单的问题,但不知何故我无法通过谷歌搜索找到答案:

如果不满足某些条件,您如何在任意执行点退出函数。例如(我这里用“(exit)”代替):

(defun foo ()
  (progn (if (/= a1 a2)
             (exit) ; if a1!=a2, exit the function somehow
           t)
         (blahblah...)))

【问题讨论】:

    标签: function emacs elisp exit


    【解决方案1】:

    在elisp中,你可以使用catchthrowinstead of cl's block and return-from

    (defun foo ()
      (catch 'my-tag
        (when (not (/= a1 a2))
          (throw 'my-tag "non-local exit value"))
        "normal exit value"))
    

    C-hig (elisp) Nonlocal Exits RET

    【讨论】:

      【解决方案2】:

      在身体周围放一个块,然后从身体返回:

      (require 'cl-macs)
      (defun foo ()
        (block foo
          (if (/= a1 a2)
              (return-from foo)
              reture-value))))
      

      【讨论】:

        【解决方案3】:

        只需使用defun* 而不是defun(附带cl 包)。这个宏已经像 Common Lisp 的 defun 一样工作(将函数体包装在 try-catch 块中,并将 return-from 别名为 throw 等)。

        例如:

        (require 'cl)
        
        (defun* get-out-early ()
          "Get out early from this silly example."
          (when (not (boundp some-unbound-symbol))
            (return-from get-out-early))
          ;;
          ;; Get on with the func...
          ;;
          (do-such-and-such with-some-stuff))
        

        【讨论】:

          【解决方案4】:

          函数返回最后评估的表单的值。如果您不关心值是什么,那么nil 可能是一个候选者。在这种情况下,该函数返回 if 函数的值。

          例如:

          (defun foo ()
            (if (/= a1 a2)
                nil
              "return-value"))
          

          在这个简单的例子中,这些也是等价的:

          (defun foo ()
            (if (not (/= a1 a2))
                "return-value"))
          
          (defun foo ()
            (when (not (/= a1 a2))
              "return-value"))
          

          【讨论】:

          • :这不是我的问题。抱歉,我之前的示例具有误导性。我改了。
          • 啊,好吧。在大多数情况下,您应该能够构建代码以避免需要非本地退出,但我已经使用标准 elisp 方法添加了另一个答案。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-05
          • 1970-01-01
          • 1970-01-01
          • 2017-04-02
          • 1970-01-01
          • 2015-03-27
          • 2012-04-14
          相关资源
          最近更新 更多