2014-11-24 1 views
1

좋아요, 그래서 저는 Lisp에 익숙하지 않고 며칠 동안이 프로그램을 작업하여 lisp을 알아보고 cons, cdr과 같은 lisp의 특정 부분을 연구했습니다 ,하자, funcall 및 다른 것들. 무작위로 색상을 분배하는 사탕 기계를 만들려고합니다. 나는이 코드를 여러 번 돌렸고, 처음에는 무작위 함수에 대한 에러를 멈추기 위해 잠시 시간이 걸렸지 만 이제는 사탕 공급에있어서의 단점에 대한 논의가 너무 적다는 것을 말하고있다. 어느 누구에게 가야할지와 그에 대한 해결책에 대한 제안이 있습니까?Lisp 무작위 화하고 목록에서 다른 것으로 끌어 오기 두 개의 함수 사용

는 지금까지 내 코드

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

입니다

, 우리를 정의는 ...이다

두 캔디 기계, 하나 gummy - 곰 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를 도울 수 있다면. 나는 완전히 부 풀리는 대답을 찾고있는 것이 아니라, 올바른 방향으로 나를 가리킬 수 있다면 그것이 도움이 될 것입니다. 코드에 오류가있는 경우이를 지적 할 수 있습니다. 당신이 하나를 제공 할 때,

(defun generate-candy-supply (size) 
    (if (= 0 size) 
    (cons (nth(random (length candy-color)) candy-color)) 
    ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ <= HERE 
    (generate-candy-supply (- size 1)))) 

cons

는 두 개의 인수가 필요합니다 :

답변

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 구현은 하나 이상의 컴파일러를 가지고 있으므로 실제로 사용하는 것이 유용합니다. 컴파일러에 따라 잘못된 인수 목록, 사용되지 않는 변수, 선언되지 않은 변수 등의 다양한 문제를 찾을 수 있습니다.

+0

이 작품은 고맙습니다. –

5

예, 여기 cons에 전화에 몇 인수를해야합니까. 그래서 너는 너의 색을 무엇을하고 있니?

코드를 제대로 들여 쓰면 이제는 읽기가 어렵습니다.

+0

두 번째 함수 "supply-of-candy"에있는 목록을 추가하려면 1. 그 작업을 수행할까요? 2.) 그것은 if 문에 두 개의 인자를주지 않습니까? –

+0

@ triniplayaz1 나는 왜 당신이 여기에서 반대하고 싶은지 정확히 모르겠다. Rainer Joswigs의 대답을보세요. 그는 적절한 해결책입니다. – coredump

+0

교수님이 우리에게 그곳에서 해달라고 부탁 한 것을 이해하지 못했습니다. 그녀는 의사 코드를 썼지 만 힌트를주지 않았거나 그녀가 원했던 것을 우리에게 말하지 않았습니다.나는 사탕 색 자체에 단점을 사용하는 것으로 가정하고 있었지만, 그것을 추가했을 때, "nth"가 문자열이 아니라는 "nth"에서 오류가 발생했습니다. –