2014-12-11 7 views
0

lisp 함수를 작성 중이며 함수에서 x 값을 반환하려고 할 때 EVAL - 정의되지 않은 함수 x가 계속 표시됩니다.lisp에서 정의되지 않은 함수

(defun p+ (x y) 
    (recurcollect (gluelist x y) '())) 

(defun isinlist (x y) 
    (if (car y) 
     (if (equal (cdr x) (cdar y)) 
      t 
      (if (cdr y) 
       (isinlist(x (cdr y))) 
       NIL)) 
     NIL)) 

(defun collectvalue (x y) ;takes an expression and a list and returns the sum of all like expressions from the list 
    (if (equal x NIL) 
     (print '(x is NIL)) 
     (if (equal (cdr x) (cdar y)) 
      (if (cdr y) 
       (collectvalue (list (+ (car x) (caar y)) (cdr x)) (cdr y)) 
       (list (+ (car x) (caar y)) (cdr x))) 
     (if (cdr y) 
      (collectvalue x (cdr y)) 
      x)))) 

(defun recurcollect (x y) ;returns a flat list of collected expressions 
    (if (isinlist (car x) y) 
     (recurcollect (cdr x) y) 
     (if (cdr x) 
      (recurcollect x (cons y (collectvalue (car x) (cdr x)))) 
      (cons y (car x))))) 

(defun gluelist (x y) 
    (if (cdr x) 
     (cons (car x) (gluelist (cdr x) y)) 
     (cons (car x) y))) 

(print (p+ '(2 0 1) '(4 0 1))) ;(6 0 1) 

나는 오류가 함수의 끝에서 X에 의해 발생 생각하지만 난 왜, 지금까지의 내 브래킷이 올바르게 짝 내가 볼 수 없습니다 말할 수있는 이유는 평가하려고 볼 수 없습니다 x를 함수로 사용합니다.

+0

함수를 정의하려고 할 때나 실행하려고 할 때이 문제가 발생합니까? REPL에서 정확하게 평가하는 것은 무엇입니까? – L33tminion

+0

@ L33tminion 실행했을 때 발생합니다. 제가 평가하는 것은 다항식입니다. 각 값은 (계수, 1 차 변수의 힘, 2 차 변수의 지수 등) 3x^2는 (3 2) 3xy^2는 (3 1 2)이 될 것입니다. 에. x는 단일 항이고 y는 다항식을 나타내는 항의 목록입니다. 이 기능의 목적은 모든 유사한 용어를 수집하는 것입니다. – CountBale

+1

코드를 올바르게 포맷하고 (emacs가 대신 할 것입니다.) 완전한 상호 작용 즉, 함수를 호출하는 방법과 Lisp이 인쇄하는 것을 복사하여 붙여 넣으십시오. – sds

답변

3

문제는 isinlist이며 이는 재귀 적으로 (isinlist(x (cdr y)))이라고합니다. (x ...)은 함수 x의 함수 호출로 해석됩니다. 아마도 (isinlist x (cdr y))이 필요합니다.

덧붙여 isinlistmember (:key #'cdr :test #'equal)으로 바꿀 수 있습니다.

+0

당신이 옳을 수도 있지만 멤버가 입력의 성격 때문에 작동하지 않을 것이라고 생각합니다. 이는 cdr의 동등성만을 테스트해야합니다. – CountBale

+2

제안 된'member' 키워드 args를 추가했습니다. – sds

관련 문제