목록을 가져 오는 간단한 재귀 함수를 만들고 목록의 요소를 기반으로 적절한 함수를 적용하려고합니다. 입력시 :목록을 구문 분석하여 요소 유형 결정
Input: (myfunct '(plus (minus(5 4) 3))
Output: 4
그래서 문자열이 무엇인지 확인한 다음 그에 따라 표현식을 재귀 적으로 해결합니다. "플러스 4 5)) ('(myfunct을"이 입력에 (오류를 생성
(define (myfunct lis)
((integer? (car lis)) (car lis))
((equal? 'plus (car lis)) (+ myfunct(car (cdr(lis)) myfunct(cdr(cdr lis)))))
)
//if its an integer, return it
//if its plus, call myfunct with the 2 next heads of the list
:
이
내가 (단지 플러스) 지금 무엇을 가지고application: not a procedure;
expected a procedure that can be applied to arguments
given: #f
arguments...:
plus
나는 수정/내가 설명을하시기 바랍니다 수있는 오류에 대한 이유를 정확히 파악할 수없는
편집 :?
(define (myfunct lis)
(cond ((integer? lis) lis)
((integer? (car lis)) (car lis))
((equal? 'plus (car lis))
(+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis)))))))
작동 대상 : (myfunct '(plus (plus 4 5) 6)
그러나 여전히 ... (myfunct '(plus (plus 4 5) (plus 2 3)))
과 호환되지 않습니다. 두 번째 인수는 void "()"로 다시 돌아옵니다. 재귀 트리를 그렸고 그 오류에 대한 이유를 볼 수 없습니다. 어떤 아이디어?
EDIT 2 : 최종 작동 대답, 100 % 확신 할 수없는 이유는 다른 이유가 아닌 것입니다. 제 2 인수는 (어느 점에서) (플러스 1 1) 대신 (플러스 1 1), 그 차는 잘못된 값을 반환합니다.
(define (myfunct lis)
(cond ((integer? lis) lis)
;;((integer? (car lis)) (car lis))
((equal? 'plus (car lis))
(+ (myfunct (car (cdr lis))) (myfunct (cdr (cdr lis)))))
(else (myfunct (car lis)))))
'(CDR을 (cdr lis))'는 표현식이 모두 적절한 목록 인 경우 목록이됩니다. 아마도'(caddr lst)'가 더 적합 할 것이고'(car x)'가 더 이상 정수가 아닌지를 확인할 필요가 없을 것입니다. – Sylwester