如果在普通的 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。
我有以下功能
(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。