如何在Scheme语言中增加do循环中的计数器?

如何在Scheme语言中增加do循环中的计数器?,scheme,global-variables,counter,do-loops,Scheme,Global Variables,Counter,Do Loops,我想在Scheme语言的do循环中执行一个简单的计数器递增,但我对该语言不太熟悉,并且尝试了许多脚本,但都没有成功。代码将在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.ca

我想在Scheme语言的do循环中执行一个简单的计数器递增,但我对该语言不太熟悉,并且尝试了许多脚本,但都没有成功。代码将在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(+j1))
不是做事情的正确方法,而是让你了解我在做什么。我认为在变量改变值时调用它并不困难?

在变量列表中,您只需添加另一个术语:

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

很好的一点是,您可以进行单元测试
生成字符串
,扩展它以获取输入变量等

在变量列表中,您只需添加另一个术语:

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

很好的一点是,您可以进行单元测试
生成字符串
,扩展它以获取输入变量等

什么使你认为
(set!j(+j1))
不会做你想做的事?什么使你认为
(set!j(+j1))
不会做你想做的事?谢谢!这很有效。你能检查一下我添加的更新吗?我认为如果把问题分成几部分,问题就可以解决。我希望我没有在帖子中制造更多的混乱@Emma它们是不相关的问题,因此在
do
循环中扩展关于变量的问题不是一个好主意。您可以使用
+
添加数字。例如,
(+61/10);=>6.1
。我觉得。想想下一个想要在多个变量上得到帮助的人。你的编辑对他们有用还是让人困惑?如果您需要,我会还原并创建一个新查询。!您建议的方法
(+61/10);=>6.1
用于读取一个案例(一个外部do循环),但在第二个循环中失败:在第一个循环中:
i
将是
10
j=5
datafilenum
将从:
5.100=>6.000
,在第二个循环中:
i=11
j=6
datafilenum
将从
6.100=>7.000
更改,我不知道如何使
datafilenum
成为小数点后有3位数字的变量。如您所见,需要将变量
j
与小数点后的数字连接起来。希望这能澄清问题。Stackoverflow不建议删除问题,因为这可能会导致您的帐户无法提出新问题@艾玛:我建议你将更改还原为保留主题。你们可以使用
~0,3F
,它会像我在《谢谢你们》中所说的那个样,将右边的焊盘归零!这很有效。你能检查一下我添加的更新吗?我认为如果把问题分成几部分,问题就可以解决。我希望我没有在帖子中制造更多的混乱@Emma它们是不相关的问题,因此在
do
循环中扩展关于变量的问题不是一个好主意。您可以使用
+
添加数字。例如,
(+61/10);=>6.1
。我觉得。想想下一个想要在多个变量上得到帮助的人。你的编辑对他们有用还是让人困惑?如果您需要,我会还原并创建一个新查询。!您建议的方法
(+61/10);=>6.1
用于读取一个案例(一个外部do循环),但在第二个循环中失败:在第一个循环中:
i
将是
10
j=5
datafilenum
将从:
5.100=>6.000
,在第二个循环中:
i=11
j=6
datafilenum
将从
6.100=>7.000
更改,我不知道如何使
datafilenum
成为小数点后有3位数字的变量。如您所见,需要将变量
j
与小数点后的数字连接起来。希望这能澄清问题。Stackoverflow不建议删除问题,因为这可能会导致您的帐户无法提出新问题@艾玛:我建议你将更改还原为保留主题。您可以使用
~0,3F
,它会将右侧的焊盘归零,如中所示