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

创建从键盘读取数字直到读取0的lisp文件。显示最小值,lisp,common-lisp,Lisp,Common Lisp,我被卡住了,我是这样做的,但我觉得这是错误的 (defun (find-min a b)) (cond (> a b) (find-min b (read)) (< a b) (find-min a (read)) ) (display (find-min (read) (read))) 代码审查 给出的代码格式不正确。经常测试代码非常重要,至少要检查语法是否正确。您不应该孤立地编写代码,而应该要求环境(解释器)解析并执

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

(defun (find-min a b))
   (cond 
        (> a b) (find-min b (read))
        (< a b) (find-min a (read))
        )
   (display (find-min (read) (read)))
代码审查 给出的代码格式不正确。经常测试代码非常重要,至少要检查语法是否正确。您不应该孤立地编写代码,而应该要求环境(解释器)解析并执行代码。您将有一个更短的反馈循环,这将有助于获得正确的代码

例如,如果您启动您提到的clisp解释器,您将处于Read Eval Print循环REPL中,在该循环中,您将编写Lisp表单,并对其进行求值以生成打印的结果。因此,只需编写代码,就可以对其进行分析和计算,从而快速通知您可能出现的错误

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

(defun (find-min a b))
这是因为所有括号都是平衡的:REPL中的Lisp读取器R将构建一个包含两个元素的列表,即defun和list find min a b。 在REPL中对E执行求值时,列表将被解释为Lisp表单,但这是一个格式错误的defun

需要函数名,后跟变量绑定列表,后跟函数体。因此,您可以尝试编写以下示例:

(defun find-min (a b)
  0)
上面定义了一个名为find min的函数,该函数接受两个参数a和b,并始终将函数体的计算值设为0

在您的情况下,您想写:

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

   (cond 
        (> a b) (find-min b (read))
        (< a b) (find-min a (read))
        )
请注意,还有一种情况,即=a b,未解决

方法 但总的来说,我不理解您的代码试图实现什么。由于所有输入都应该通过读取获得,因此不需要接受参数a和b。整个过程可能是一个循环:

(defun read-min ()
  (loop
    for val = (read)
    for zerop = (= val zero)
    for min = val then (if zerop min (min min val))
    until (= val 0)
    finally (return min)))
正如@leetwinski所建议的,还有一个较短的备选方案:

(loop for val = (read) until (= val 0) minimizing val)
但是我想您不需要使用循环形式,所以您应该尝试编写一个递归函数来实现同样的功能

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

(defun read-min-rec (min-so-far)
  ...)
代码审查 给出的代码格式不正确。经常测试代码非常重要,至少要检查语法是否正确。您不应该孤立地编写代码,而应该要求环境(解释器)解析并执行代码。您将有一个更短的反馈循环,这将有助于获得正确的代码

例如,如果您启动您提到的clisp解释器,您将处于Read Eval Print循环REPL中,在该循环中,您将编写Lisp表单,并对其进行求值以生成打印的结果。因此,只需编写代码,就可以对其进行分析和计算,从而快速通知您可能出现的错误

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

(defun (find-min a b))
这是因为所有括号都是平衡的:REPL中的Lisp读取器R将构建一个包含两个元素的列表,即defun和list find min a b。 在REPL中对E执行求值时,列表将被解释为Lisp表单,但这是一个格式错误的defun

需要函数名,后跟变量绑定列表,后跟函数体。因此,您可以尝试编写以下示例:

(defun find-min (a b)
  0)
上面定义了一个名为find min的函数,该函数接受两个参数a和b,并始终将函数体的计算值设为0

在您的情况下,您想写:

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

   (cond 
        (> a b) (find-min b (read))
        (< a b) (find-min a (read))
        )
请注意,还有一种情况,即=a b,未解决

方法 但总的来说,我不理解您的代码试图实现什么。由于所有输入都应该通过读取获得,因此不需要接受参数a和b。整个过程可能是一个循环:

(defun read-min ()
  (loop
    for val = (read)
    for zerop = (= val zero)
    for min = val then (if zerop min (min min val))
    until (= val 0)
    finally (return min)))
正如@leetwinski所建议的,还有一个较短的备选方案:

(loop for val = (read) until (= val 0) minimizing val)
但是我想您不需要使用循环形式,所以您应该尝试编写一个递归函数来实现同样的功能

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

(defun read-min-rec (min-so-far)
  ...)

您似乎在混合来自Scheme(如display)和Common Lisp(如defun)的元素。你能说明你想写哪种语言,或者你使用的环境是什么吗?如果要添加详细信息,则有一个编辑按钮。非常感谢。我正在用clisp做这件事。我是这方面的初学者。没问题,这只是为了澄清问题的范围。创建一个Lisp文件,从键盘读取数字,直到读取0为止,并显示所有读取数字的最小值。请注意,计算中包含0。例如,如果用户输入:36-41215-9-244-3-510,则程序应返回-24。您需要使用“打印”程序显示最小值,并使用“读取”程序保持读取

e键盘上的下一个数字。你知道如何开始吗?你似乎在混合来自Scheme的元素,例如display和Common Lisp,例如defun。你能说明你想写哪种语言,或者你使用的环境是什么吗?如果要添加详细信息,则有一个编辑按钮。非常感谢。我正在用clisp做这件事。我是这方面的初学者。没问题,这只是为了澄清问题的范围。创建一个Lisp文件,从键盘读取数字,直到读取0为止,并显示所有读取数字的最小值。请注意,计算中包含0。例如,如果用户输入:36-41215-9-244-3-510,则程序应返回-24。您需要使用“打印”程序来显示最小值,还需要使用“读取”程序来继续从键盘读取下一个数字。您知道如何开始吗?谢谢您的解释。对于循环情况,您将如何显示结果。因为它要求您使用“打印”程序来显示最小值,并且使用“读取”程序来保持从键盘读取下一个数字。如果最小化,循环变量可能会短一些:loop for val=read until=val 0最小化valI问这个问题我觉得很愚蠢,但是val代表什么case@leetwinski是的,的确,我忘了it@sarahval是循环变量的名称,它只意味着我应该使用该名称,可能吧。谢谢你的解释。对于循环情况,您将如何显示结果。因为它要求您使用“打印”程序来显示最小值,并且使用“读取”程序来保持从键盘读取下一个数字。如果最小化,循环变量可能会短一些:loop for val=read until=val 0最小化valI问这个问题我觉得很愚蠢,但是val代表什么case@leetwinski是的,的确,我忘了it@sarahval是循环变量的名称,它只意味着我应该使用该名称,可能