2017-10-19 8 views
0

私のプログラムを起動すると、エラーがfirst: expects a non-empty list与えられ続けています:(make-subject (make-person 22 'm 'MW17K) (list 220 301 189 272 311))私は理由を見つけることができません。first:空でないリストを期待します

(define (idk sub) 
    (cond 
    [(empty? sub) empty]   
    [(< (person-age (subject-person (first sub))) ; here2 -------- NB 
     (person-age (subject-person (first (rest sub))))) 
     (idk (first sub))] ; here1 ------------------------ NB 
    [else (idk (first (rest sub)))])) ; here3 

(idk subjects) 

idkがそのようにsubその定義の中subject Sのリストがあり、subject Sのリストとともに呼び出されます。

;;equals 25 but my code keeps erroring. please help 
(person-age (subject-person (first sub)))  

(define-struct person (age sex code)) 

(define-struct subject (person times)) 

(define VP01 (make-subject (make-person 22 'm 'MW17K) (list 220 301 189 272 311))) 
(define VP02 (make-subject (make-person 25 'f 'MP25G) (list 234 197 253 257 206))) 
(define VP03 (make-subject (make-person 23 'f 'CT03R) (list 197 202 214 222 233))) 
(define VP04 (make-subject (make-person 20 'm 'MM09R) (list 273 314 257 264 217))) 
(define VP05 (make-subject (make-person 19 'm 'KR22I) (list 198 197 228 253 199))) 
(define VP06 (make-subject (make-person 26 'm 'FR01B) (list 212 204 289 294 223))) 
(define VP07 (make-subject (make-person 28 'f 'RA15R) (list 258 323 189 247 303))) 
(define VP08 (make-subject (make-person 22 'm 'RP18R) (list 221 307 182 271 316))) 
(define VP09 (make-subject (make-person 24 'f 'GH31W) (list 230 295 304 264 237))) 
(define VP10 (make-subject (make-person 19 'f 'OM29Q) (list 299 194 242 303 243))) 

(define subjects (list VP01 VP02 VP03 VP04 VP05 VP06 VP07 VP08 VP09 VP10)) 

(define (idk sub) 
    (cond 
    [(empty? sub) empty]   
    [(< (person-age (subject-person (first sub))) 
     (person-age (subject-person (first (rest sub))))) 
     (idk (first sub))] 
    [else (idk (first (rest sub)))])) 

(idk subjects) 
+1

あなたは」第2または第3の条件式を入力する前に常に2人の人がいることを確認する必要があります。エラーは空のリストを '(最初に)'に渡そうとしていることを伝えています - これは 'sub'が1つのメンバしか持たない場合に起こります。 – pdoherty926

答えて

1

あなたは型の不一致を持っています。つまり、(first sub)ここではsubjectです。

しかし、その後、あなたはhere1(またはhere3)でそれをidkを呼び出し、それがその後、here2(first sub)を呼び出します。この時点でsubsubjectであり、リストではありません。したがって、エラー、

first:与えられた
非空のリストを期待:(make-subject (make-person 22 'm 'MW17K) (list 220 301 189 272 311))

0

を私は使用をしましょうと、車だと思い、CDRコードをより明確にする:

(let loop ([loop_list subjects]) 
    (if (>= (length loop_list) 2) 
     (if (>= (person-age (subject-person (car loop_list))) 
       (person-age (subject-person (cadr loop_list)))) 
      (person-age (subject-person (car loop_list))) 
      (loop (cdr loop_list))) 
     empty)) 
関連する問題