Не уверен, что именно вы хотите, но ближе всего я мог придумать это:
(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]>
"код компилируется. Как он может быть скомпилирован? Это невозможно. Он имеет две синтаксические ошибки. В нем отсутствует скобка и '(range (x y))' не является законным выражением Lisp. –
@RainerJoswig Если вы добавите в него закрывающие parens, CLISP не будет жаловаться на код. Предполагая, что кто-то потерялся в операции копирования-вставки, его утверждение действительно может быть правдой. – uselpa
Извините, пропустил круглую скобку, когда я набрал вопрос. Я не уверен, что вы имеете в виду, как это не законно? разве это не плохие соглашения? – Matt