2016-05-02 9 views
-1

Ich erhalte eine Fehlermeldung für den folgenden Code. Es ist nur ein einfacher Syntaxfehler, aber als Anfänger bin ich mir nicht sicher, was falsch ist. Jeder weiß es?Basic Racket Syntaxfehler: Anwendung keine Prozedur

(define qsort 
    (lambda (input-list) 

    (define sort-pivot-iter 
     (lambda (input-list pivot acc) 
     (let ([current    (first input-list)] 
      [pivot-less   (first acc)] 
      [pivot-greater-equal (first (rest acc))]) 
      (cond (
       [(empty? input-list) acc] 
       [(< current pivot) (sort-pivot-iter (rest input-list) pivot 
        '((cons current pivot-less) pivot-greater-equal))] 
       [(>= current pivot) (sort-pivot-iter (rest input-list) pivot 
        '(pivot-less (cons current pivot-greater-equal)))]))))) 

    (let* ([pivot (first input-list)] 
     [pivot-sorted (sort-pivot-iter 
        (rest input-list) pivot (list empty empty))] 
     [left (first pivot-sorted)] 
     [right (first (rest pivot-sorted))]) 
     (cond 
      [(< (length input-list) 2) input-list] 
      [else (append (qsort left) '(pivot) (qsort right))])))) 


(qsort '(2 3 1)) 

Antwort

2

Sie haben einen zusätzlichen Satz von Klammern um die Klauseln der cond Form, die der ganze Körper als eine einzige Klausel analysiert werden verursacht.

Das bedeutet, dass [(empty? input-list) acc] als Ausdruck behandelt wird (Bedingung der Klausel), der ((empty? input-list) acc) entspricht, da eckige Klammern und Klammern austauschbar sind. Dies versucht, das Ergebnis empty? als eine Prozedur aufzurufen, die den Fehler verursacht.

eine etwas vereinfachte Grammatik für cond ist wie folgt:

 
(cond cond-clause ...) 

    cond-clause = [test-exprbody ...] 
       | [else body ...+] 

Hinweis, dass jede cond-clause in Klammern gewickelt wird (oder Pars), aber die Klauseln selbst sind nicht in irgendeiner Art und Weise gewickelt. Daher sollten Sie Ihre cond Form wie folgt aussehen:

(cond 
    [(empty? input-list) acc] 
    [(< current pivot) (sort-pivot-iter (rest input-list) pivot 
             '((cons current pivot-less) pivot-greater-equal))] 
    [(>= current pivot) (sort-pivot-iter (rest input-list) pivot 
             '(pivot-less (cons current pivot-greater-equal)))]) 

Ihr Code hat noch einige andere Probleme, aber die sind in keinem Zusammenhang mit der Fehlermeldung in Ihrer Frage. Für eine Sache, Ihre Verwendung von quote (aka ') hier macht keinen Sinn für mich, so dass Sie auch lesen möchten What is the difference between quote and list?, um damit zu helfen.