首页 > 解决方案 > Racket 中的嵌套“for”循环显示错误“不是程序”

问题描述

我有以下代码行在 Racket 中进行冒泡排序。我发现语法正确,但仍然显示错误:

(define List (list 1 3 5 7 9 2 4 6 8 0))
(define Left  0)
(define Right 0)

(for ([I (range (- (length List) 1))])
  (for ([J (range (+ I 1) (length List))])
    (set! Left  (list-ref List I))
    (set! Right (list-ref List J))

    (when (> Left Right)
      [(set! List (list-set List I Right))
       (set! List (list-set List J Left ))]
    )
  ) 
)

错误是:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #<void>
  arguments...:
   #<void>
  context...:
   /home/jdoodle.rkt:6:2: for-loop
   /home/jdoodle.rkt:5:0: for-loop
   top-level: [running body]
   eval-one-top12
   begin-loop
   loop

猜不出来为什么。我在https://www.jdoodle.com/execute-racket-online上对其进行了测试,但它没有用。

标签: for-loopfunctional-programmingschemelispracket

解决方案


我找到了答案,整理了一下。我必须beginwhen. 不是双括号。

(for ([I (range (- (length List) 1))])
  (for ([J (range (+ I 1) (length List))])
    (set! Left  (list-ref List I))
    (set! Right (list-ref List J))

    (when (> Left Right)
      (begin
        (set! List (list-set List I Right))
        (set! List (list-set List J Left ))
))))

或者只是之后的一系列表格when

(for ([I (range (- (length List) 1))])
  (for ([J (range (+ I 1) (length List))])
    (set! Left  (list-ref List I))
    (set! Right (list-ref List J))

    (when (> Left Right)
      (set! List (list-set List I Right))
      (set! List (list-set List J Left ))
)))

推荐阅读