2012-09-23 3 views
1

나는 재귀 적 계승 함수를위한 매우 간단한 lisp 코드를 작성하고 있습니다. 숫자를 사용하여 호출하면 제대로 작동합니다. 그러나 번호 (예 : a)가 아닌 무언가를 사용하여 호출하려고하면 다음 오류가 표시됩니다.간단한 LISP 코드가 입력 오류를 catch하지 않습니다.

오류 : 언 바운드 변수 'A'의 값을 가져 오려고 시도합니다. [조건 유형 : UNBOUND-VARIABLE]

그러나 이것은 내 코드에서 발견 된 것으로 간주됩니다. 여기 내 코드는 다음과 같습니다.

(defun FactorialRec (num) 
    (cond             
     ((not(numberp num)) 
     (princ "Argument must be a number.") 
     (terpri) 
     ()) 
     ((equal num 1) ;base case              
     1) 
     ((<= 1 num) (* num(FactorialRec (- num 1)))) 
    ) 
) 

나는 왜 이것이 numberp가 이것을 잡지 못하는지 알 수 없습니다. 어떤 아이디어? 감사.

답변

0
Break 2 [6]> (FactorialRec "A") 
Argument must be a number. 

내 컴퓨터에서 작동합니다. 그래서 A을 전달했지만 "A"을 전달하지 않았습니까?

+0

고맙습니다. 저는 이런 일이 부주의 한 일이 일어나서 쓰고 익숙해지고 있습니다. 그래서 A는 lisp로 평가 될 수 없다. – iltp21

+0

@ amaliat21, 나는 Barmar가 이미 그것을 아주 잘 도입했다고 생각합니다. – Marcus

1

함수를 호출하기 전에 오류가 발생합니다. Lisp 인터프리터에 함수 호출 표현식을 입력하면 먼저 모든 인수를 평가하고 함수를 호출합니다. 바인드되지 않은 변수를 사용하면 인수 평가가 실패합니다.

+0

고마워요! 나는 내 문제를 발견했다. – iltp21

+0

귀하의 질문에 답변이있는 경우 녹색 체크 표시를 클릭하여 동의해야합니다. – Barmar

2

주 논리에 매개 변수 유형 검사를 혼합하지 마십시오. 이르면 기능의 편리로 함수에 항목에 check-type 매크로를 사용하거나 :

(defun factorial (num) 
    (check-type num (and integer (satisfies plusp))) 
    (if (= num 1) 
    1 
    (* (factorial (1- num)) num))) 

양식 (and integer (satisfies plusp))이 유형의 표현이다. Lisp 유형은 and과 같은 연산자로 조인 될 수 있으며 satisfies 유형 연산자는 모든 술어 함수에서 유형을 생성하는 데 사용될 수 있습니다. 따라서 도메인 값이 정수이고 양수 인 객체 인 유형을 지정할 수 있습니다. check-type은 변수가이 유형에 속하는지 여부를 확인하기 위해 기꺼이 유효성을 검사합니다.

또한 (- num 1) 대신 인수에서 1을 뺀 기본 제공 1- 함수를 사용했습니다. 이 1-은 특수 구문이 아닌 기호입니다.

관련 문제