2016-08-20 45 views
-2

我想创建一个读取2个整数并输出两个之间的所有数字的lisp代码。我目前的代码是功能只输出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(或condprogn ...)如果您想在条件后执行多个操作
  • 1+用于递增参数,而不是完整表达式;把它看作是一个传统语言中的循环变量
  • 如果您打印该变量,或者将其添加到结果列表中,则您的变量仅在函数外部变为“可见”。

此外,您的问题common-lisp标记为更好的知名度。

编辑

证明,原来的代码不会对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默认编译​​吗?如果没有,那么这也不是编译。 –