2016-08-20 5 views
-2

Я пытаюсь создать код lisp, который читает 2 целых числа и выводит все числа между ними. мой текущий кодФункция только выводит 1

(defun range (x y) 
    (if (< x y) 
     x 
     (1+ (range(x y)))) 

код компилируется и запускается, но только выходы «1».

+1

"код компилируется. Как он может быть скомпилирован? Это невозможно. Он имеет две синтаксические ошибки. В нем отсутствует скобка и '(range (x y))' не является законным выражением Lisp. –

+0

@RainerJoswig Если вы добавите в него закрывающие parens, CLISP не будет жаловаться на код. Предполагая, что кто-то потерялся в операции копирования-вставки, его утверждение действительно может быть правдой. – uselpa

+0

Извините, пропустил круглую скобку, когда я набрал вопрос. Я не уверен, что вы имеете в виду, как это не законно? разве это не плохие соглашения? – Matt

ответ

2

Не уверен, что именно вы хотите, но ближе всего я мог придумать это:

(defun range (x y) 
    (when (< x y) 
    (print x) 
    (range (1+ x) y))) 

Тестирование

CL-USER> (range 3 7) 

3 
4 
5 
6 
NIL 

Обратите внимание на

  • отступы ваш код правильно
  • when (или cond или progn ...), если вы хотите выполнить более одного действия после условия
  • 1+ используется для увеличения параметра, а не полного выражения; подумайте об этом как о переменной цикла в традиционном языке
  • ваша переменная становится только «видимой» вне функции, если вы ее распечатываете или добавляете в список результатов.

Кроме того, отметьте свой вопрос common-lisp для лучшей видимости.

EDIT

доказательство того, что исходный код мчит на некоторых экземплярах CLISP:

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/> 

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993 
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997 
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998 
Copyright (c) Bruno Haible, Sam Steingold 1999-2000 
Copyright (c) Sam Steingold, Bruno Haible 2001-2010 

Type :h and hit Enter for context help. 

[1]> (range 1 5) 

*** - EVAL: undefined function RANGE 
The following restarts are available: 
USE-VALUE  :R1  Input a value to be used instead of (FDEFINITION 'RANGE). 
RETRY   :R2  Retry 
STORE-VALUE :R3  Input a new value for (FDEFINITION 'RANGE). 
ABORT   :R4  Abort main loop 
Break 1 [2]> 
[3]> (defun range (x y) 
    (if (< x y) 
     x 
     (1+ (range(x y))))) 
RANGE 
[4]> (range 1 5) 
1 
[5]> 
+0

«исходный код» -> «исходный код с добавленной скобкой и для некоторых входов» –

+0

И делает ли CLISP по умолчанию? Если это не так, то это тоже не компиляция. –

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