2016-04-08 13 views
1

Ich arbeite mit einem Schema-Programm und habe ein Problem beim Versuch, meine Sortierfunktion zu nutzen. Ich habe es geschrieben, um 2 andere Hilfsfunktionen zu verwenden, die ich getestet habe und bestätigen kann, wie beabsichtigt, aber beim Sortieren erhalte ich die richtige Liste mit einem #! Unspezifischen Objekt, das daran angehängt ist. Ich bin mir nicht sicher, wie dieses Objekt erstellt wurde oder wie dieser Nebeneffekt vermieden werden kann.Schema #! Unspezifisches Objekt erscheint nach dem Sortieren

Der Code für die Funktionen ist wie folgt:

(define sort 
    (lambda (roster) 
     (if (not (null? roster)) 
      (cons (smallest roster (car roster)) (sort (remove roster  (smallest roster (car roster))))) 
     ) 
    ) 
) 

(define smallest 
    (lambda (roster item) 
     (cond 
      ((null? roster) item) 
      ((< (string->number (car (car roster))) (string->number (car item))) (smallest (cdr roster) (car roster))) 
      (else (smallest (cdr roster) item)) 
     ) 
    ) 
) 

(define remove 
    (lambda (roster record) 
     (cond 
      ((null? roster) '()) 
      ((equal? (car roster) record) (cdr roster)) 
      (else (cons (car roster) (remove (cdr roster) record))) 
     ) 
    ) 

)

Wenn ich die Sortierfunktion mit einer Test Roster anrufe, bekomme ich folgendes Ergebnis:

(("1" "Anon" "89") ("2" "Student" "90") ("3" "Test" "78") . #!unspecific)

Antwort

4

In Ihrem wenn, gibt es einen dann Teil, aber kein sonst Teil, so dass der Wert, der zurückgegeben wird, wenn Roster null ist, ist nicht spezifiziert:

(if (not (null? roster)) 
    (cons (smallest roster (car roster)) 
      (sort (remove roster (smallest roster (car roster))))) 
    ;; nothing here 
    ) 

Um zu bestätigen, versuchen Sie so etwas wie

(cons 1 (if #t 'then)) 

und Sie sollten so etwas wie

sehen
(1 . #!unspecific) 

Was solltesort zurückgeben wenn roster ist null? Ich würde die leere Liste erraten. Für Stil würde ich wahrscheinlich die Bedingung umkehren, um etwas wie zu haben:

(if (null? roster) 
    roster   ; or '() 
    (cons ...)) 
+0

Danke, invertierte die Bedingung, wie Sie sagten und fügte eine else Klausel hinzu, die eine leere Liste zurückbringt. Funktioniert jetzt großartig! –

Verwandte Themen