Common lisp 函数仅输出1
我试图创建一个lisp代码,读取2个整数并输出两者之间的所有数字。我现在的代码是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]
(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]>