разбор списка и создание структуры этого

;; structure representing homework points
;; nr: number - the number of the homework
;; points: number - the number of points reached
(define-struct homework (nr points))



;; parse-homework: (list of number pairs) -> (list of homework)
;; The procedure takes a list of number pairs and produces a list of homework     structures
;; Example: (parse-homework (list (list 1 6) (list 2 7) (list 3 0))) should produce  (list (make-homework 1 6) (make-homework 2 7) (make-homework 3 0)) 

(define (parse-homework homework-entries) 
  (if (and (= (length (first homework-entries) 2))(= (length (parse-homework (rest homework-entries)) 2)))
    (make-homework (first homework-entries) (parse-homework (rest homework-entries)))
    (error 'Non-valid-input "entered list is not of length two"))

  )        


(parse-homework (list (list 1 6) (list 2 7) (list 3 0))) 

Этот код выдает ошибку length: ожидает 1 аргумент, учитывая 2: (список 1 6) 2

Я действительно ценю каждое объяснение, которое вы можете мне дать, чтобы влезть в эту махинацию...

Большое Вам спасибо


person qzar    schedule 10.05.2010    source источник
comment
Спасибо, Дирк, я попробую, меня смущает такое огромное количество скобок в схеме ^^   -  person qzar    schedule 10.05.2010


Ответы (1)


Ваши родители неверны (см. ниже)

(define (parse-homework homework-entries) 
   (if (and (= (length (first homework-entries) 2))  ;; <---- Parens wrong here
            (= (length (parse-homework (rest homework-entries)) 2)))  ;; <---- ... and here 
    (make-homework (first homework-entries) (parse-homework (rest homework-entries)))
    (error 'Non-valid-input "entered list is not of length two"))

)      

Вам нужно вызвать функцию length с одним, функцию = с двумя аргументами:

(= (length (first homework-entries)) 2)

Аналогично для другой отмеченной строки.

Изменить При анализе списка домашних заданий учитывайте следующее:

  • Когда вы проанализировали все элементы homework-entries? То есть, когда вы должны прекратить рекурсию? (null?) Ошибки говорят сами за себя: список ввода исчерпан.
  • Каков предполагаемый результат применения parse-homework к списку элементов в соответствии с вашим примером? На самом деле вы не получаете значимого результата.

Попробуйте разбить проблему на более мелкие части:

(define (parse-homework-item item)
    ;; Parse a single homework item, returning an instance of the 
    ;; Homework type for it. 
    ...)

(define (parse-homework list-of-items)
    ;; Loop over the elements of list-of-items, processing each in turn
    ;; using parse-homework-item. Collect each result object into a list
    ;; which is returned as final result.
    ...)
person Dirk    schedule 10.05.2010
comment
Теперь, когда я решил скобки, он выдает мне другую ошибку: во-первых: ожидаемый аргумент типа ‹непустой список›; если пусто, я думаю, что логика кода должна быть неправильной, но я не могу ее понять... - person qzar; 10.05.2010