2016-08-15 2 views
1

Common Lisp에서 tail call recursive factorial을 구현하려고 시도 중입니다. Common Lisp에서 키워드 매개 변수가 왜 필요합니까?

나는 몇 가지 코드를 복사과 같이 커먼 리스프에서 재 작성 : 그러나

(defun tailrecsum (x &key (running-total 0 running-total-p)) 
    (if (= x 0) 
     (if running-total-p running-total 0) 
     (tailrecsum (- x 1) (+ running-total x)))) 

, 내가 먼저 경고를 얻을 :

SIMPLE-WARNING: 
The function has an odd number of arguments in the keyword portion. 

를 그리고 그것을 실행하려고 할 때, 나는 오류가 발생 :

SIMPLE-PROGRAM-ERROR: 
odd number of &KEY arguments 

키워드 인수가 홀수 일 수없는 이유는 무엇입니까? 그 문제는 무엇이며 어떻게해야합니까?

파이썬에서 예를 들어 내가 쓸 수 :
def func(a, b=10): 
    print([a, b]) 

그래서 나는 키워드 인자의 홀수, 하나를 가질 것이다. 거기에는 문제가 없습니다.

+1

해야

(tailrecsum (- x 1) (+ running-total x)) 

에서 당신이 키워드를 놓치고있어이 경우

:'(tailrecsum을 (- X 1) (+ 총계 (+ 누계 x))' – jkiiski

+0

@jkiiski 당신은 그 대답을 할 수 있습니까? 그럼 나는 그것을 받아 들일 수있다. 어떻게 든 그것은 여전히 ​​'제어 스택 가드 페이지가 일시적으로 무력화되어있다 : 조심스럽게 진행한다. CONTROL-STACK-EXHAUSTED : # Out [46] (print (tailrecsum 19469))'= ( – Zelphir

+1

어떤 구현을 사용하고 있습니까? 최적화 특성이 설정되어 있습니까? 꼬리 재귀가 최적화되지 않은 것 같습니다. SBCL에서이 문제가 없습니다. – jkiiski

답변

3

오류는 키워드 매개 변수의 수를 나타내지 않습니다. 오히려 함수를 호출하는 인수의 개수를 의미합니다. 정의에 의한 키워드 인수는 쌍 (:KEYWORD VALUE)이어야하므로, 홀수 인수를 사용하면 무언가를 놓치게됩니다. 당신은 전화에 키워드를 놓치고

(tailrecsum (- x 1) :running-total (+ running-total x)) 
관련 문제