For loop 球拍中嵌套的“for”循环显示错误“非过程”

For loop 球拍中嵌套的“for”循环显示错误“非过程”,for-loop,functional-programming,scheme,lisp,racket,For Loop,Functional Programming,Scheme,Lisp,Racket,我有以下代码行在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 (li

我有以下代码行在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

我猜不出为什么。我试了一下,但没用。

我找到了答案,把它整理好了。我必须在when之后为多个语句添加表达式begin。不是双括号

(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 ))
))))
或者只是在以下时间之后的一系列形式:


实际上,你不需要开始。问题只是额外的双括号!在Scheme expr中,表示将此表达式作为函数应用。所以,除非表达式是你想应用的函数,否则你不能在它周围写。哦,是的,答案中加了
(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 ))
)))