在Emacs Lisp中检查转发sexp是否成功

在Emacs Lisp中检查转发sexp是否成功,emacs,lisp,elisp,emacs24,Emacs,Lisp,Elisp,Emacs24,我想检查(转发sexp 1)是否成功,或者是否以错误结束。 问题是它返回nil,即使它已经成功了。如何进行此检查?请尝试扫描sexps。 它是转发sexp背后的主力,并返回一个有意义的值 当然,如果参数不平衡,那么您将得到一个错误-因此您需要忽略错误或条件案例如果有错误,forward sexp不会返回零(事实上,在这种情况下,它不会返回任何内容;相反,它会发出错误信号).向前sexp如果无法向前移动点,则发出错误信号。如果需要,您可以使用条件case捕捉到这一点。下面是一个测试它的命令示例:

我想检查
(转发sexp 1)
是否成功,或者是否以错误结束。
问题是它返回nil,即使它已经成功了。如何进行此检查?

请尝试
扫描sexps
。 它是
转发sexp
背后的主力,并返回一个有意义的值


当然,如果参数不平衡,那么您将得到一个错误-因此您需要
忽略错误
条件案例

如果有错误,forward sexp
不会返回零(事实上,在这种情况下,它不会返回任何内容;相反,它会发出错误信号).

向前sexp如果无法向前移动点,则发出错误信号。如果需要,您可以使用
条件case
捕捉到这一点。下面是一个测试它的命令示例:

(defun test-forward-sexp ()
  "simple command testing (forward-sexp 1)"
  (interactive)
  (condition-case nil
      (progn
        (forward-sexp 1)
        (message "succeeded"))
    (error (message "failed"))))

您可以在信息页面上阅读更多有关处理错误的信息。

我同意,但鉴于我们正在尝试获得
t
nil
返回,我们可以使用
(忽略错误乐趣)
在错误情况下获得
nil
。很抱歉造成混淆。然后你可以通过
(忽略错误(转发sexp 1)t)
得到你想要的。这不是对这个问题的直接回答,但我注意到这确实是基本答案,可能更恰当地解决了在这种情况下应该做什么(即使用
条件case
)@我想你误解了你的问题。我现在不认为我误解了。我忘了在问题中包括忽略错误,这可能会导致混淆。现在,答案充分解决了给出nil问题的
(forward sexp)
:scan如果工作,则给出一个值,而forward sexp在工作时给出nil。您的方法是一种更通用的错误测试方法。它们是不同的问题吗?直接的答案是使用
扫描sexps
(以避免零),间接的答案是在出现错误时更恰当地处理,这也可以解决这个问题?@duality逐字阅读您的问题,您会问如何使用
转发sexp
并检测错误,而不是如何编写代码来移动sexps。我认为公认的答案很好。我只是反对你说我的回答不是对这个问题的直接回答。当然,当涉及到这件事时,阅读确实变得困难:-)。我道歉。