Common lisp 函数仅输出1

Common lisp 函数仅输出1,common-lisp,clisp,Common Lisp,Clisp,我试图创建一个lisp代码,读取2个整数并输出两者之间的所有数字。我现在的代码是 (defun range (x y) (if (< x y) x (1+ (range(x y)))) (反吹范围(x y) (如果((范围15) ***-评估:未定义的功能范围 以下重新启动可用: 使用值:R1输入一个要使用的值,而不是(FDEFINITION'范围)。 重试:R2重试 存储值:R3为(FDEFINITION'范围)输入新值。 中止:R4中止主循环 中断1[2]

我试图创建一个lisp代码,读取2个整数并输出两者之间的所有数字。我现在的代码是

(defun range (x y)
  (if (< x y)
      x
      (1+ (range(x y))))
(反吹范围(x y)
(如果(

代码编译并运行,但只输出“1”。

不确定您到底想要什么,但我能想到的最接近的是:

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

  • 正确缩进代码
  • 如果要在一个条件后执行多个操作,请在(或cond或progn…)时使用
  • 1+
    用于增加参数,而不是完整的表达式;在传统语言中,可以将其视为循环变量
  • 只有在打印变量或将其添加到结果列表时,变量才会在函数外部“可见”
另外,为您的问题添加标签
common lisp
,以提高可视性

编辑

证明原始代码确实在CLISP的某些实例上运行:

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

[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]>
欢迎来到GNU CLISP 2.49(2010-07-07)
[1] >(范围15)
***-评估:未定义的功能范围
以下重新启动可用:
使用值:R1输入一个要使用的值,而不是(FDEFINITION'范围)。
重试:R2重试
存储值:R3为(FDEFINITION'范围)输入新值。
中止:R4中止主循环
中断1[2]>
[3] >(除雾范围(x y)
(如果((范围15)
1.
[5]>

“代码编译”。如何编译它?不可能。它有两个语法错误。缺少括号和
(范围(x y))
不是合法的Lisp表达式。@RainerJoswig如果你给它添加了一个结束符,那么CLISP不会抱怨代码。假设一个人在复制粘贴操作中丢失了他的陈述可能是真的。对不起,我键入问题时漏掉了一个括号。我不确定你的意思是什么,为什么它不合法?这不是很糟糕吗ons?@uselpa:CLISP:WARNING:in RANGE在第2.5行中用1个参数调用了RANGE,但它需要2个参数;编写了文件/tmp/test.fas使用了以下函数,但未定义:X@Matt:您已使用两个参数定义了一个函数
range
,分别为
x
y
。您正在使用一个参数调用它参数表达式也是错误的,因为
X
不是一个函数。“原始代码”->“添加了括号的原始代码,对于某些输入”,默认情况下CLISP是否编译?如果不编译,则这也不是编译。
Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

[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]>