如果功能在常见的lisp中

时间:2016-06-15 00:31:17

标签: operators common-lisp control-flow

我有以下功能

foreach

我的问题是当我测试(defun testIf (n) (if (<= n 0) t) print "Hello World") 时,它会返回&#34; Hello World&#34;。因此,我想知道为什么if被完全忽略了。请记住,我只想在这个程序中使用if,没有其他链条。任何帮助将不胜感激。

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

(testIf -1)

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

2 个答案:

答案 0 :(得分:3)

IF不被忽略;它的返回值只是被丢弃,因为它之后还有另一种形式。函数返回正文最后一种形式的值。考虑这个功能

(defun foo ()
  1
  2)

您希望返回1吗?当然不是。这完全是违反直觉的。 IF只是一个与其他形式一样的形式,为什么它的结果会在你的函数中返回?

你可以使用RETURN-FROM从函数中提前返回:

(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分支有多个表单,则可以使用COND代替:

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

答案 1 :(得分:0)

  

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

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

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