2012-03-31 8 views
0

Ich versuche, ein Wortzahl-Programm in Scheme zu erstellen. Ich denke, ich habe einen Algorithmus ausgearbeitet, der meine Zeilen, Wörter und Zeichen zählt, aber wenn ich das Programm starte, sagt es mir: "Das Objekt # \ 1 ist nicht anwendbar." "1" ist das erste Zeichen in der Datei, die ich lese, und es sollte unter "sonst" fallen. Alles, was ich sehe, stimmt mit meinem Case-Statement überein, also denke ich, dass ich es richtig mache, aber klar ist irgendwo etwas durcheinander. Danke für Ihre Hilfe!Scheme Fall Fehler

(define files 
    (lambda (reading n) 
    (begin 
     (define in (open-input-file reading)) 
     (let loop ((lines 0) 
     (words 0) 
     (chars 0) 
     (port (read-char in))) 
     (case (port) 
     ((#\newline) 
      (loop (+ lines 1) words (+ chars 1) (read-char in))) 
     ((#\space #\tab) 
      (loop lines (+ words 1) (+ chars 1) (read-char in))) 
     (else (loop lines words (+ chars 1) (read-char in))))) 
    (close-input-port in) 

    (display lines) 
    (display " ") 
    (display words) 
    (display " ") 
    (display chars) 
    (newline) 
    (display "Top ") 
    (display n) 
    (display " word(s):") 
    (newline) 
    '()))) 
+0

Beachten Sie, dass ein [Mitbenutzer wurde durch Ihre gelöschte Frage verärgert] (http://meta.stackexchange.com/questions/129578/ Frage-gelöscht-während-Schreiben-Antwort) – sarnold

Antwort

2

Ihr Problem ist glücklicherweise einfach zu beheben. Sie haben geschrieben:

(case (port) ...) 

aber das macht einen case auf das Ergebnis der Aufruf der Funktion port. Natürlich ist port keine Funktion, ist es ein Zeichen ist, so dass Sie wollen einfach:

(case port ...) 
+0

Danke! Das ein Problem behoben, aber jetzt habe ich ein anderes ... Ich kann wahrscheinlich diese neue mit Anzeigen und dergleichen jagen – AmberWolfe

+1

Wenn diese Antwort für Sie arbeitete, sollten Sie "Akzeptieren" Sie, indem Sie auf das Häkchen neben der Antwort klicken. –

0

Wie das bedeutet „lassen Schleife“ wissen, wenn Sie das Ende der Datei erreicht haben? Was gibt das read-char zurück, wenn es das Ende erreicht? Tipp: Lesen Sie über das eof-Objekt? Prädikat. Ein Prädikat ist eine Funktion, die #t oder #f zurückgibt. Sie müssen möglicherweise ein cond anstelle eines case verwenden, um dieses Prädikat zu verwenden

Auch die Zeilen, Zeichen und Wörter Variablen sind lokal zu den genannten lassen, so dass Sie nicht ausdrucken können, dann "draußen". (Tipp: Drucke sie innerhalb der Schleife, wenn (eof-object? Port) #t zurückgibt.

Style quibble: verwende nicht den Namen "port" für das char, das read-char zurückgibt. "In" ist das Port (Dateigriff), Vielleicht können Sie "ch" anstelle von "Port" verwenden.