2016-06-15 3 views
-3

У меня есть следующие функцииЕсли функция в общей шепелявости

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

Моего вопрос, когда я испытываю (testIf -1), он возвращает «Hello World». Поэтому мне интересно, почему if был полностью проигнорирован. Имейте в виду, я просто хочу, если в этой программе нет никакой другой цепи. Любая помощь будет оценена по достоинству.

Чтобы прояснить путаницу, я пытаюсь сделать что-то похожее на это в шепелявость (как Java имеет типы данных, которые я должен был компенсировать это в данном примере)

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

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

testIf(-1); 

В Java 5 будет возвращен и следующая строка никогда не будет считана.

+0

Вы смотрите на Лисп документации как сделать заявление «если»? – lurker

+0

Да, у меня есть и это указывает, что вы можете сделать (если «test expression» «then expression») – 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, и вы не должны пытаться писать Java в Lisp. Лучше просто поместить PRINT в ветку else. Если еще Гиса имеет несколько форм, вы можете использовать COND вместо:

(defun test-if (n) 
    (cond ((<= n 0) t) 
     (t (print "Hello World") 
      :foo 
      :bar 
      :quux))) 
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 при п меньше или равно 0.

+0

Чтобы использовать 'return', вам нужно создать блок с именем' nil'. Или измените 'return' на' return-from' (например, '(return-from testIf 5)'). –

+0

@GregBuchholz Исправлено. Очевидно, DEFUN устанавливает блок, но не названный NIL. Виноват! –

Смежные вопросы