如果在普通的 lisp 中运行

If function in common lisp

我有以下功能

(defun testIf (n)
  (if (<= n 0) t)
  print "Hello World")

我的问题是当我测试 (testIf -1) 时,它 returns "Hello World"。因此我想知道为什么 if 被完全忽略了。请记住,我只想要这个程序中的 if,没有 else 链。任何帮助将不胜感激。

为了消除混淆,我试图在 lisp 中做一些类似的事情(因为 java 有数据类型,我必须在这个例子中对此进行补偿)

public int testIf(n)
{
    if(n <= 0)
        return 5;

    System.out.println("Hello "World");
    return 0;
}

testIf(-1);

在 Java 中,将返回 5 并且永远不会读取下一行..

不忽略IF;它的 return 值被丢弃了,因为它后面还有另一种形式。函数 returns 来自主体最后一个形式的值。考虑这个函数

(defun foo ()
  1
  2)

您希望 return 1 吗?当然不是。那将是完全违反直觉的。 IF 和其他任何形式一样,那么为什么它的结果会在您的函数中被 return 编辑?

您可以使用 RETURN-FROM 从函数中提早 return:

(defun test-if (n)
  (when (<= n 0) ; You should use WHEN instead of IF when there's no else-branch.
    (return-from test-if t))
  (print "Hello World"))

但是,在大多数情况下,这并不符合习惯。请记住,Lisp 是一种与 Java 截然不同的语言,您不应该尝试用 Lisp 编写 Java。最好将 PRINT 放在 else 分支中。如果else-branch有多种形式,可以用COND代替:

(defun test-if (n)
  (cond ((<= n 0) t)
        (t (print "Hello World")
           :foo
           :bar
           :quux)))

In java the 5 would be returned and the next line would never be read..

jkiiski 的回答正确地解释了这种行为,但值得指出的是,您编写的 Lisp 代码与您编写的 Java 代码不同。如果你想按字面翻译 Java 代码,你会这样做:

(defun testIf (n)
  (if (<= n 0)
    (return-from testIf 5))
  (print "Hello World")
  (return-from testIf 0))

当 n 小于或等于 0 时, return 5。