2016-06-15 81 views
-3

功能,我有以下功能如果Common Lisp中

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

我的问题是,当我测试(testIf -1),它返回的 “Hello World”。所以我想知道为什么if被完全忽略了。请记住,我只想要一个如果在这个程序中,没有别的链。任何帮助,将不胜感激。

要清理混乱,我试图做一些类似的Lisp的(如Java有数据类型,我在这个例子中,以弥补这一点)

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

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

testIf(-1); 

在Java 5将被返回,下一行永远不会被读取。

+0

你看看Lisp的文档如何做一个“如果”的声明? – lurker

+0

是的我有,它表明你可以做(​​如果“测试表达式”“那么表达式”) – JmanxC

+0

这是常用的lisp我正在使用LispWorks – JmanxC

回答

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分支中。正确

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

在Java 5将返回下一行永远不会被读取..

jkiiski的回答是:如果else分支有多种形式,可以使用COND代替解释了这种行为,但值得指出的是,您编写的Lisp代码不像您编写的Java代码。如果你想字面翻译的Java代码,你会怎么做:

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

确实返回5,当n小于或等于0

+0

为了使用'return',你需要创建一个名为'nil'的块。或者将'return'改为'return-from'(例如'(return-from testIf 5)')。 –

+0

@GregBuchholz固定。 DEFUN显然建立了一个块,但没有命名为NIL。我的错! –