Как увеличить счетчик в цикле do в языке Scheme?

Я хочу сделать простое увеличение счетчика на единицу в цикле do на языке Scheme, но я не очень знаком с языком и перепробовал множество сценариев без успеха. Код будет реализован в Ansys Fluent для чтения нескольких файлов дел:

(define j 5)
(Do ((i 10 (+ i 1))) ((>= i 20))
(ti-menu-load-string (format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j))
(set! j (+ j 1))
)

Как сдать новый j значение для цикла do, чтобы я мог изменить имена папок и файлов следующим образом:

Case10-time5-sec
Case11-time6-sec
...

Я знаю что (set! j (+ j 1)) это не правильный способ делать вещи, но дать вам представление о том, что я пытаюсь сделать. Я не думаю, что это должно быть трудно вызвать переменную, когда она изменила значение?

1 ответ

В списке с переменными вы просто добавляете другой термин:

(do ((i 10 (+ i 1))
     (j 5  (+ j 1)))
    ((>= i 20) 'my-return-value)
  (ti-menu-load-string 
   (format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j)))
; ==> my-return-value (and as side effect prints some strings)

Знай это do это просто синтаксический сахар для рекурсивной функции. Вы можете сделать это без этого с помощью именованного let:

(let function-name ((i 10) (j 5))
  (if (>= i 20)
      'my-return-value
      (begin 
        (ti-menu-load-string 
         (format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j))
        (function-name (+ i 1) (+ j 1)))))

На самом деле тогда вы могли бы сделать его функциональным, разделив производство и печать:

(define (make-strings)
  (let function-name ((i 10) (j 5) (result '()))
    (if (>= i 20)
        (reverse result)
        (function-name 
         (+ i 1) 
         (+ j 1) 
         (cons (format #f "/file/read-case \"C:/DataProcessing/Case~a-time~a-sec/test/Case~a-time~a-sec.cas\"" i j i j)
               result)))))

(for-each ti-menu-load-string (make-strings))

Приятно то, что вы можете тестировать make-strings, расширить его, чтобы принять входные переменные и т.д..

Другие вопросы по тегам