簡體   English   中英

方案中(等於?)比較的類型不正確

[英]Incorrect type for (equal?) comparison in scheme

我正在按計划編寫一個程序,該程序可以讓我管理與學生有關的信息列表。 此列表的每個元素都是另一個包含有關學生的3個項目的列表:ID(數字字符串),學生姓名(字符串)和年級(整數)。 我目前正在嘗試編寫一個函數,以按ID升序對我的學生列表進行排序。 與此功能一起,我嘗試編寫兩個幫助程序功能,“最小”和“刪除”

我已經測試了最小的函數,它正確返回了最小的ID。 現在,我正在測試我的remove函數,看它是否將返回一個列表,其中ID最小的Student元素將被刪除:

當我致電(display(刪除名單(最小名單(汽車(汽車名單)))))時,我收到一條錯誤消息,說';;對象(“ 4”“ lini”“ 94”)作為string-> number的參數,不是字符串。 進行此呼叫時的當前列表為:((5 me 95)(4 lini 94)(3 rudy 93)(2 mark 92)(1 silas 91))。 我使用string-> number函數進行>比較,所以我認為它在這里也可以工作,但是我也沒有得到我想要與其進行比較的列表的正確元素。 這導致我將(car(car(car roster))添加到(equal?)的第二個參數中,並且給我錯誤';作為第一個參數傳遞給car的對象“ 5”不是正確的類型。 '

有人知道我在這里做錯了嗎? 我也被限制使用set! 函數,do循環以及任何內置的排序函數。

(define smallest
  (lambda (roster record)
          (if (null? roster)
              (begin (display record) record)
              (if (> (string->number record) (string->number (car (car roster))))
                  (smallest (cdr roster) (car(car roster)))
                  (smallest (cdr roster) record)))
         ))

(define remove
  (lambda (roster record)
     (if (equal? (string->number record) (string->number (car(car(car roster)))))   
          (cdr roster)
          (remove (list (cdr roster) (car roster)) record) 
    )))

(define performtask
  (lambda (n roster)
        (cond ((= n 0) (begin
                        (display "\n\tOption 0.")
                        (display "\nReset Roster")
                        (menu '())
                        ))
              ((= n 1) (begin
                        (display "\n\tOption 1.")
                        (display "\nLoad Roster From File")
                        (menu roster)
                        ))
              ((= n 2) (begin                                   
                        (display "\n\tOption 2.")
                        (display "\nStore Roster To File")
                        (display (list (remove roster (smallest roster (car(car roster))))))
                        (menu roster)
                        ))
              ((= n 3) (begin                                   
                        (display "\n\tOption 3.")
                        (display "\nDisplay Roster by ID")
                        (display "\nsmallest record is: ")
                        (smallest roster (car (car roster)))
                        (menu roster)
                        ))
              ((= n 4) (begin                                   
                        (display "\n\tOption 4.")
                        (display "\nDisplay Student Info")
                        (menu roster)
                        ))
              ((= n 5) (begin                                   
                        (display "\n\tOption 5.\n")
                        (display roster)
                        (newline)
                        (menu (cons (ano-read-3-items 0 '()) roster))
                        ))
              ((= n 6) (begin                                   
                        (display "\n\tOption 6.")
                        (display "\nRemove a student from Roster")
                        (menu roster)
                        ))
              ((= n 7) (begin(display "\n\tOption 7. Exit\n")
                        #t
                        ))
              (else (begin
                        (display "\n\tTask No. ")
                        (display n)
                        (display " does not exit.\n\n")
                        (menu roster)
                    )
              )
        )
  )
)

(define menu
  (lambda (roster)
        (begin
           (display "\t============================\n")
           (display "\t    MENU\n")
           (display "\t============================\n")
           (display "\t0. Reset roster\n")
           (display "\t1. Load roster from file\n")
           (display "\t2. Store roster to file\n")
           (display "\t3. Display roster sorted by ID\n")
           (display "\t4. Display student information\n")
           (display "\t5. Add a student to roster\n")
           (display "\t6. Remove a student from roster\n")
           (display "\t7. Exit\n")
           (display "\tEnter your choice: ")
           (performtask (read) roster)
        )
  )
)

因此,您在以下方面遇到了問題:

(define roster '(("5" "me" 95) ("4" "lini" 94) ("3" "rudy" 93) ("2" "mark" 92) ("1" "silas" 91)))
(remove roster "1") ; some error

您的錯誤是此部分:

(remove (list (cdr roster) (car roster)) record) 

假設您要發送(student1 student2)而student1不是要刪除的人。 然后以列表((student2) student1)作為參數遞歸。 錯誤的第二次顯示,因為您要查找的數據比預期的要低。 此外,列表不會縮短,因此如果您的測試成功了,您將獲得無限遞歸。

解決方案是提出答案。 它與找到被刪除的對象時計算到列表尾部的基本情況相匹配,因此,在此之前,必須先對任何先前的元素進行修改,否則最終將刪除所有內容,直到嘗試刪除的id。 它應該看起來像(cons non-match1 (cons non-match2 (cdr roster))因此,遞歸發生在conscdr中:

(cons non-match (remove rest-of-list record))

您可能試圖通過在訪問ID時添加另car來解決此問題? 我看到的是,與smallest使用caar讓你用id caaarremove 這是我看到的第一件事,我想知道為什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM