2014-11-04 1 views
0
;; An ATOM is one of: 
;; -- Symbol 
;; -- String 
;; -- Number 

;; An SEXP (S-expression) is one of: 
;; -- empty 
;; -- (cons ATOM SEXP) 
;; -- (cons SEXP SEXP) 

그래서 나는 SEXP의 모든 숫자를 요약하려고합니다! 여기 내 코드가의 구성표 구조 및 목록 목록이있는 경우 목록에서 숫자를 계산하는 방법

;; sum-numbers: sexp -> Number 

(define (sum-numbers sexp) 
(cond 
    [(empty? sexp) 0] 
    [(ATOM? (first sexp)) (+ (atom-sum-numbers (first sexp)) 
          (sum-numbers (rest sexp)))] 
    [(SEXP? (first sexp)) (+ (sum-numbers (first sexp)) 
          (sum-numbers (rest sexp)))])) 

;; atom-sum-numbers: Atom -> Number 
(define (atom-sum-numbers a) 
    (cond 
     [(symbol? a) 0] 
     [(number? a) (+ (ATOM-number a) 
        (atom-sum-numbers a))] 
     [(string? a) 0])) 

그러나 오류가 cond를 말한다 : 모든 질문의 결과는 거짓이었다. 거기서 무슨 일이 일어 났는지 궁금 하네.

+0

은 [문서를 살펴 보자 ] (http://docs.racket-lang.org/reference/define-struct.html). '(define-struct ATOM (symbol string number)) '을 쓸 때,'ATOM'은 기호, 문자열, 숫자의 3 가지 요소의 조합이라는 것입니다. –

+1

@ ÓscarLópez OP가 원하는 것 같았던 것은 C의 노조와 ​​비슷한 것입니다. 어떤 Scheme 구현이 노동 조합을 지원하는지는 모르겠다. 그 기억이 안전하지 않은 것 같습니다. 물론 정적 유형의 언어에는 대수 데이터 형식과 같은 개념이 있지만 Scheme에는 적용되지 않습니다. –

답변

1

구조체 접근 자 프로 시저와 목록 조작 절차가 혼합되어있어 작동하지 않습니다. 구조체를 사용하는 경우 일관성을 유지해야하며 구조체 자체의 절차를 사용해야합니다.

또한, 당신의 ATOM 구조는 그대로, 그것은 말하는, 잘못 같습니다 원자는 기호, 문자열 숫자로 구성되어있다 (세 가지, 그 중 단지 하나!). 물론 symbol?, number?string? 술어는 해당 구조체에서 작동하지 않으므로 cond은 모든 조건이 false라는 이유로 불만을 제기합니다.

원자가 실제로는 원자 인이 아닌 다른 구조체를 사용해보십시오. 구조체가 아닙니다. 그렇지 않으면 ATOM 구조를 재고해야합니다. 현재 양식이 상상하지 않는 방식으로 이루어집니다. 예를 들어,이 작동합니다 :

(define (sum-numbers sexp) 
    (cond 
    [(empty? sexp) 0] 
    [(SEXP? (SEXP-ATOM sexp)) (+ (sum-numbers (SEXP-ATOM sexp)) 
           (sum-numbers (SEXP-SEXP sexp)))] 
    [else (+ (atom-sum-numbers (SEXP-ATOM sexp)) 
      (sum-numbers (SEXP-SEXP sexp)))])) 

(define (atom-sum-numbers a) 
    (cond 
    [(symbol? a) 0] 
    [(number? a) a] 
    [(string? a) 0])) 

이 현실을 테스트하자 및 원자 일반 제도 원자의 ATOM 구조체없는 경우 어떻게주의 사항 :

(sum-numbers 
(make-SEXP 'x 
      (make-SEXP 7 
         (make-SEXP "a" 
            '())))) 
=> 7 
+1

감사합니다! ATOM이 구조체인지 아닌지 궁금합니다. 이 경우 ATOM은 평평합니다. 이 경우에는 ATOM을 써야할까요? ATOM과 SEXP인지를 확인하는 함수? 그것이 SEXP이든 아니든. – ads27

+0

또한 SEXP는 구조가 아닌 목록이어야합니다. – ads27

0
;; atom? : Any -> Boolean 
;; true if input is an Atom false otherwise 
(define (atom? at) 
    (or (number? at) 
     (symbol? at) 
     (string? at))) 

;; sexp? : Any -> Boolean 
;; true if input is n Sexp, false otherwise 
(define (sexp? s) 
    (or 
    (empty? s) 
    (and (cons? s) 
      (atom? (first s)) 
      (sexp? (rest s))) 
    (and (cons? s) 
      (sexp? (first s)) 
      (sexp? (rest s))))) 

;; sum-numbers: sexp -> Number 
;; given a sexp returns the sum of all the Numbers in the list 

;; sum-numbers: Sexp -> Number 
(define (sum-numbers sexp) 
    (cond 
    [(empty? sexp) 0] 
    [(atom? (first sexp)) (+ (atom-sum-numbers (first sexp)) 
           (sum-numbers (rest sexp)))] 
    [(sexp? (first sexp)) (+ (sum-numbers (first sexp)) 
           (sum-numbers (rest sexp)))])) 


;; atom-sum-numbers: anything(symbol number or string) -> Number 
;; if the given is a number, add it 

(define (atom-sum-numbers a) 
    (cond 
    [(symbol? a) 0] 
    [(number? a) a] 
    [(string? a) 0])) 
관련 문제