好吧,我对lisp很陌生,我在这个项目上工作了几天,了解了lisp,并研究了lisp的某些部分,比如con,cdr,let,funcall和其他一些部分。我正在尝试创建一个糖果机器,随机配色。我已经多次运行这个代码,一开始我花了一段时间才停止获得随机函数的错误,现在它说我对生成糖果供应中的缺点的争论太少了。有谁对这件事的去向和解决办法有什么建议?
到目前为止我的代码是..。
(defvar candy-color '(yellow red blue green pink orange))
(defun generate-candy-supply (size)
(if (= 0 size)
(cons (nth (random (length candy-color)) candy-color))
(generate-candy-supply (- size 1))))
(defun candy-machine (supply-of-candy)
(function
(lambda ()
(prog1
(car supply-of-candy)
(setq supply-of-candy
(cdr supply-of-candy))))))
(defvar *gummy-bear*
(candy-machine (generate-candy-supply 4)))
(defvar *easter-egg*
(candy-machine (generate-candy-supply 6)))
(defun get-candy (machine)
(funcall machine))我的任务是..。
糖果程序的原型是
(defun get-candy (machine)
(funcall machine))在下面的例子中,我们定义了两台糖果机器,一种是含有4种糖果的糖果机器,另一种是含有6种糖果的复活节彩蛋机。示例代码如下所示:
(defvar *gummy-bear*
(candy-machine (generate-candy-supply 4)))
(defvar *easter-egg*
(candy-machine (generate-candy-supply 6)))此程序的示例运行如下所示:
[1]> (load 'candy.lisp)
;; Loading file candy.lisp ...
;; Loaded file candy.lisp
T
[2]> (get-candy *gummy-bear*)
BLUE
[3]> (get-candy *gummy-bear*)
BROWN
[4]> (get-candy *gummy-bear*)
YELLOW
[5]> (get-candy *gummy-bear*)
YELLOW
[6]> (get-candy *gummy-bear*)
NIL
[7]> (get-candy *easter-egg*)
BLUE
[8]> (get-candy *easter-egg*)
BROWN
[9]> (get-candy *easter-egg*)
GREEN
[10]> (get-candy *easter-egg*)
BROWN
[11]> (get-candy *easter-egg*)
YELLOW
[12]> (get-candy *easter-egg*)
BLUE
[13]> (get-candy *easter-egg*)
NIL如果你能帮上忙的话我会非常感激的。我不是在寻找完整的答案,但如果你能指出正确的方向,那将是有帮助的。如果代码中也有错误,您可以指出这些错误。
发布于 2014-11-24 09:17:18
已经回答了你的问题。
您可以将代码写得更短一点:
(defvar *candy-color*
#(yellow red blue green pink orange)) ; a vector
(defun generate-candy-supply (size)
(loop repeat size
collect (elt *candy-color*
(random (length *candy-color*)))))
(defun candy-machine (supply-of-candy)
(lambda ()
(pop supply-of-candy))) ; use POP查找错误的参数数:
只需编译您的代码:
[2]> (compile ' generate-candy-supply)
WARNING: in GENERATE-CANDY-SUPPLY : CONS was called with 1 arguments, but it
requires 2 arguments.上面的警告清楚地告诉您代码有什么问题。因为大多数通用Lisp实现都有一个或多个编译器,所以实际使用它们是很有用的。根据编译器的不同,它们可以发现各种问题,如错误的参数列表、未使用的变量、未声明的变量等等。
发布于 2014-11-24 07:39:29
是的,在调用cons时,您确实很少有争议:
(defun generate-candy-supply (size)
(if ( = 0 size)
(cons (nth( random (length candy-color)) candy-color))
;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <= HERE
(generate-candy-supply ( - size 1))))当您只给出一个参数时,cons需要两个参数。那你用什么美化你的颜色呢?
此外,正确地缩进代码,现在它真的很难阅读。
https://stackoverflow.com/questions/27098434
复制相似问题