首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lisp随机化并使用两个函数从列表中提取到另一个函数。

Lisp随机化并使用两个函数从列表中提取到另一个函数。
EN

Stack Overflow用户
提问于 2014-11-24 05:34:30
回答 2查看 202关注 0票数 1

好吧,我对lisp很陌生,我在这个项目上工作了几天,了解了lisp,并研究了lisp的某些部分,比如con,cdr,let,funcall和其他一些部分。我正在尝试创建一个糖果机器,随机配色。我已经多次运行这个代码,一开始我花了一段时间才停止获得随机函数的错误,现在它说我对生成糖果供应中的缺点的争论太少了。有谁对这件事的去向和解决办法有什么建议?

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

代码语言:javascript
复制
(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))

我的任务是..。

糖果程序的原型是

代码语言:javascript
复制
(defun get-candy (machine)
  (funcall machine))

在下面的例子中,我们定义了两台糖果机器,一种是含有4种糖果的糖果机器,另一种是含有6种糖果的复活节彩蛋机。示例代码如下所示:

代码语言:javascript
复制
(defvar *gummy-bear*
        (candy-machine (generate-candy-supply 4)))
(defvar *easter-egg*
        (candy-machine (generate-candy-supply 6)))

此程序的示例运行如下所示:

代码语言:javascript
复制
[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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-24 09:17:18

已经回答了你的问题。

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

代码语言:javascript
复制
(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

查找错误的参数数:

只需编译您的代码:

代码语言:javascript
复制
[2]> (compile ' generate-candy-supply)
WARNING: in GENERATE-CANDY-SUPPLY : CONS was called with 1 arguments, but it
         requires 2 arguments.

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

票数 4
EN

Stack Overflow用户

发布于 2014-11-24 07:39:29

是的,在调用cons时,您确实很少有争议:

代码语言:javascript
复制
(defun generate-candy-supply (size)
  (if ( = 0 size)
    (cons (nth( random (length candy-color)) candy-color))
    ;;    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <= HERE
    (generate-candy-supply ( - size 1))))

当您只给出一个参数时,cons需要两个参数。那你用什么美化你的颜色呢?

此外,正确地缩进代码,现在它真的很难阅读。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27098434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档