【问题标题】:Basic Racket syntax error: application not a procedure [duplicate]基本球拍语法错误:应用程序不是程序[重复]
【发布时间】:2016-05-02 02:48:54
【问题描述】:

我收到以下代码的错误消息。这只是一个简单的语法错误,但作为初学者我不确定是什么问题。有人知道吗?

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

【问题讨论】:

    标签: racket


    【解决方案1】:

    cond 表单的子句周围有一组额外的括号,这导致整个正文被解析为单个子句。

    这意味着[(empty? input-list) acc] 被视为一个表达式(子句的条件),它等价于((empty? input-list) acc),因为方括号和圆括号可以互换。这会尝试将empty? 的结果作为过程调用,这会导致错误。

    cond 的稍微简化的语法如下:

    (条件 cond 子句 ...) cond-clause = [test-expr body ...] | [其他正文 ...+]

    请注意,每个cond-clause 都包含在括号(或括号)中,但子句本身并未以任何方式包含。因此,您的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)))])
    

    您的代码仍有一些其他问题,但与您问题中的错误消息无关。一方面,你在这里使用quote(又名')对我来说没有意义,所以你可能还想阅读What is the difference between quote and list?来帮助解决这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-19
      • 2012-02-02
      • 2014-01-19
      • 2018-12-20
      • 2018-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多