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

Lisp随机化并使用两个函数将列表拉入另一个列表,lisp,common-lisp,clisp,Lisp,Common Lisp,Clisp,好的,我是lisp新手,我已经在这个程序上工作了几天,了解lisp并研究lisp的某些部分,如cons、cdr、let、funcall和其他一些部分。我正在尝试创建一个随机分配颜色的糖果机。我已经多次运行了这段代码,起初我花了一段时间才停止随机函数的错误,现在它说我在generate candy supply中的cons参数太少了。有人对去哪里和解决这个问题有什么建议吗 到目前为止我的代码是 (defvar candy-color '(yellow red blue green pink ora

好的,我是lisp新手,我已经在这个程序上工作了几天,了解lisp并研究lisp的某些部分,如cons、cdr、let、funcall和其他一些部分。我正在尝试创建一个随机分配颜色的糖果机。我已经多次运行了这段代码,起初我花了一段时间才停止随机函数的错误,现在它说我在generate candy supply中的cons参数太少了。有人对去哪里和解决这个问题有什么建议吗

到目前为止我的代码是

(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))
在下面的示例中,我们定义了两个糖果机,一个是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
此程序的示例运行如下所示:

(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

如果你能帮忙,我将不胜感激。我不是在寻找完整的答案,但如果你能为我指出正确的方向,那将是有益的。如果代码中也有错误,您可以指出这些错误

是的,您对
cons
的调用中没有多少参数:

(defun generate-candy-supply (size)
  (if ( = 0 size)
    (cons (nth( random (length candy-color)) candy-color))
    ;;    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <= HERE
    (generate-candy-supply ( - size 1))))
(取消生成糖果供应(尺寸)
(如果(=0尺寸)
(cons(第n个(随机长度糖果颜色))糖果颜色)

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

(defun generate-candy-supply (size)
  (if ( = 0 size)
    (cons (nth( random (length candy-color)) candy-color))
    ;;    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <= HERE
    (generate-candy-supply ( - size 1))))
(取消生成糖果供应(尺寸)
(如果(=0尺寸)
(cons(第n个(随机长度糖果颜色))糖果颜色)

5944

您可以将代码写得短一点:

(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实现都有一个或多个编译器,因此实际使用它们是很有用的。根据编译器的不同,它们可以发现各种问题,如错误的参数列表、未使用的变量、未声明的变量等等。

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.

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

如果我要添加第二个列表中的列表功能“糖果供应”1.)这样行吗这难道不是两个人的论点吗?@triniplayaz1我不知道你到底为什么要在这里犯错误。看看Rainer Joswig的回答。他给出了一个正确的解决方案。我也不明白我的教授要我们在那里做什么。她写了一些伪代码,但没有给我们任何提示,也没有告诉我们她想要什么。我假设只是使用cons返回到candy color本身,但是当我添加它时,我从“nth”中得到了错误,说“nth”不是字符串。如果我添加第二个函数“supply of candy”中的列表1。)会起作用吗?2。)这不是给了If语句两个人参数吗?@trinplayaz1我不知道你为什么要在这里使用cons。看看雷纳·乔斯维格的回答。他提出了一个恰当的解决方案。我也不明白教授要我们在那里做什么。她写了一些伪代码,但没有给我们任何提示,也没有告诉我们她想要的是什么。我假设只是使用cons返回糖果颜色本身,但当我添加它时,我从“nth”中得到错误,说“nth”不是字符串。