Elisp函数返回值

9

我在Elisp中遇到了一个(可能很蠢的)问题。我想要一个函数根据when条件返回tnil。以下是代码:

(defun tmr-active-timer-p
  "Returns t or nil depending of if there's an active timer"
  (progn
    (if (not (file-exists-p tmr-file))
        nil
      ; (... more code)
      )
    )
)

但是我遇到了一个错误。我不确定如何使函数返回一个值...我读过一些文章,说函数返回最后一个表达式的结果值,但在这种情况下,我想做类似于(PHP混乱警告)的东西:
// code

if ($condition) {
  return false;
}

// more code...

也许我没有抓住重点,函数式编程不允许这种方法吗?

好的,问题实际上是在 tmr-active-timer-p 之前缺少括号。 - hhaamm
2
你需要接受这个答案。 - phils
1个回答

18

首先,在tmr-active-timer-p之后需要一个参数列表;defun语法如下:

(defun function-name (arg1 arg2 ...) code...)

其次,您不需要使用progn将主体包装起来。

第三,返回值是最后一个被评估的表单。在您的情况下,您可以直接编写

(defun tmr-active-timer-p ()
  "Returns t or nil depending of if there's an active timer."
  (when (file-exists-p tmr-file)
      ; (... more code)
    ))

如果文件不存在,它将返回nil(因为(when foo bar)(if foo (progn bar) nil)相同)。

最后,在lisp中,悬挂的括号被认为是一种不好的代码格式。

PS. Emacs Lisp没有return,但它有非本地退出。我敦促您避免使用它们,除非您真正知道自己在做什么。


好的,你的答案是正确的。基本上没有返回语法。在Elisp中,你不能轻易地从函数的中间返回,而且可能也不是一个好主意,因为它违背了函数式编程范式。感谢你关于悬挂括号的建议。 - hhaamm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接