2016-05-02 11 views
-1

以下のコードでエラーメッセージが表示されます。それは単なる構文エラーですが、初心者としては何が間違っているのか分かりません。誰か知ってる?基本ラケット構文エラー:アプリケーションがプロシージャではありません

(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)) 

答えて

2

あなたは体全体が単一の句として解析することが原因となっているcond形式の句を囲む括弧の余分なセットを持っています。

これは、((empty? input-list) acc)に相当する式として、[(empty? input-list) acc]が式として扱われていることを意味します。大括弧とかっこは互換性があるためです。これは、エラーの原因となるプロシージャとしてempty?の結果を呼び出そうとします。各cond-clauseがブラケット(または括弧)に包まれていること

 
(cond cond-clause ...) 

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

お知らせが、条項自体がどのような方法でラップされない:condため

Aわずかに単純化された文法は次の通りです。したがって、あなたのcondフォームは次のようになります。

(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)))]) 

あなたのコードはまだいくつかの他の問題がありますが、それらは、あなたの質問にエラーメッセージとは無関係です。 1つは、quote(別名')の使用は私にとっては意味がありません。そのためにはWhat is the difference between quote and list?もお読みください。

関連する問題