创建一个从键盘读取数字直到读取0的lisp文件。显示最小值

问题描述 投票:0回答:1

我被困住了,我是这样做的,但是我觉得这是错误的。

(defun (find-min a b))
   (cond 
        (> a b) (find-min b (read))
        (< a b) (find-min a (read))
        )
   (display (find-min (read) (read)))
lisp common-lisp
1个回答
0
投票

代码审查

给定的代码格式错误。经常测试您的代码,检查至少语法正确是非常重要的。而不是孤立地编写代码,您应该要求环境解释器来解析代码并执行。您的反馈循环会更短,这将有助于正确编写代码。

例如,如果您启动解释程序(您提到clisp),您将处于读取Eval打印循环(REPL)中,在其中编写Lisp表单,对这些表单进行评估以产生结果,然后将其打印出来。因此,只需编写代码,就可以对其进行解析和评估,从而可以快速通知您可能的错误。

因此,如果您在编写代码时就编写了代码,则会注意到解释器首先读取此内容:

(defun (find-min a b))

这是因为所有括号都是平衡的:Lisp阅读器(REPL中的R)将建立两个元素的列表,即defun和列表(find-min a b)。执行评估时(REPL中的E),列表将解释为Lisp形式,但这是格式错误的defun

DEFUN需要一个函数名称,后跟一个变量绑定列表,然后是函数体。因此,您可以尝试编写例如:

DEFUN

上面定义了一个名为(defun find-min (a b) 0) 的函数,该函数接受两个参数find-mina,并且始终求值为0(该函数的主体)。

您要写的是:

b

(defun find-min (a b) (cond ...)) 表格也格式不正确:

COND
[COND中的[[每个

子句]应该是首先包含一个测试,然后是零个或多个表达式的list。它将是:

(cond (> a b) (find-min b (read)) (< a b) (find-min a (read)) )
请注意,还有剩余的情况,即cond,未解决。

方法

但是总的来说,我不理解您的代码正在试图实现什么。由于所有输入都应使用(cond ((> a b) ...) ((< a b) ...)) 获得,因此无需接受参数(= a b)(read)。整个过程可能是一个循环:

a

但是我想您不应该使用循环形式,因此您应该尝试编写一个具有相同功能的递归函数。

您需要做的是将递归读取的当前最小值递归传递给函数,如下所示:

b

for min = nil then(min(让((值(读取)))
© www.soinside.com 2019 - 2024. All rights reserved.