Вложенный 'для' l oop в Racket показывает ошибку 'не процедура' - PullRequest
0 голосов
/ 08 февраля 2020

У меня есть следующие строки кода для сортировки пузырьков в 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, но он не работал.

1 Ответ

1 голос
/ 08 февраля 2020

Я нашел ответ, разобрался с ним. Я должен добавить выражение begin для нескольких операторов после 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)
      (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 ))
)))
...