Lisp随机化并使用两个函数从列表拉到另一个列表

时间:2014-11-24 05:34:31

标签: lisp common-lisp clisp

好的,所以我是lisp的新手,我一直在研究这个程序几天,了解lisp并研究lisp的某些部分,例如cons,cdr,let,funcall和其他一些部分。我正在尝试创造一种随机分配颜色的糖果机。我已多次运行此代码,起初我花了一段时间才停止获取随机函数的错误,现在它说我对于generate-candy-supply中的缺点有太少的争论。任何人都有任何关于去哪里和任何解决方案的建议?

到目前为止我的代码是......

(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))

我的任务是......

CANDY计划的原型是

(defun get-candy (machine)
  (funcall machine))

在以下示例中,我们定义了两个CANDY-MACHINE,一个是gummy-bear 有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

如果你能帮助id高度欣赏它。我不是在寻找全面的答案,但如果你能指出我正确的方向,那将会有所帮助。如果代码中也有错误,你可以指出这些错误。

2 个答案:

答案 0 :(得分:5)

是的,您在此致cons的电话中确实没有争议:

(defun generate-candy-supply (size)
  (if ( = 0 size)
    (cons (nth( random (length candy-color)) candy-color))
    ;;    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <= HERE
    (generate-candy-supply ( - size 1))))
当你给它一个时,

cons需要两个参数。那你用你的颜色做什么?

还要正确缩进代码,现在很难阅读。

答案 1 :(得分:4)

coredump已经回答了你的问题。

您可以将代码写得更短:

(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.

以上警告清楚地告诉您代码有什么问题。由于大多数Common Lisp实现都有一个或多个编译器,因此实际使用它们很有用。根据编译器的不同,他们可以找到各种问题,例如错误的参数列表,未使用的变量,未声明的变量等等。