我需要一些帮助,当我在解释器中输入值时,我的代码没有返回好的答案。这是我的代码:
(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=8
,W=16
,C=2
,Max=8
和Min=1
,我"Nothing"
显示了两次......
答案 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|
语法),但它并不常见。
当您将M
和m
重命名为Mx
和mi
时 - 代码按预期工作,请打印Increment
。