如果在GNU CLISP中有条件

时间:2018-05-15 12:17:23

标签: lisp common-lisp

我需要一些帮助,当我在解释器中输入值时,我的代码没有返回好的答案。这是我的代码:

(defun compromis() 
  (flet ((prompt (string)
           (format t "~&~a: " string)
           (read nil 'eof nil)))
    (print "Enter values :")
    (let ((E (prompt "tddv_estime"))
          (W (prompt "tddv_worst"))
          (C (prompt "gisement_courant"))
          (M (prompt "gisement_max"))
          (m (prompt "gisement_min")))
      (if (> E W)
          (if (> C m)
              (print "Decrement")
              (print "Error")))
      (if (< E W)
          (if (< C M)
              (print "Increment")
              (print "Nothing"))))))

我应该阅读&#34;增量&#34;使用E=8W=16C=2Max=8Min=1,我"Nothing"显示了两次......

2 个答案:

答案 0 :(得分:2)

您看到"Nothing"两次因为 print 打印返回其参数,因为它是函数中的最后一个表单 compromis,它返回print返回的值。 由于您正在评估REPL中的代码(Read-Eval- Print 循环), 你看到打印输出的返回值。

PS。请注意,lispers通过缩进读取代码,而不是通过paren count。我编辑了你的功能以符合通用的编码标准(实际上,Emacs为我做了这些)。

答案 1 :(得分:2)

在编译过程中,我在代码中发现了问题:

; caught ERROR:
;   The variable M occurs more than once in the LET.

因为Common Lisp(通常)不区分大小写 - 读者将所有符号转换为大写,所以当读取代码时m变为M。您可以创建小写符号(例如使用|m|语法),但它并不常见。

当您将Mm重命名为Mxmi时 - 代码按预期工作,请打印Increment