【问题标题】:How to increase counter in a do-loop within Scheme language?如何在 Scheme 语言的 do-loop 中增加计数器?
【发布时间】:2017-12-16 21:14:06
【问题描述】:

我想在 Scheme 语言的 do-loop 中做一个简单的计数器加一,但我对该语言不太熟悉,并且尝试了许多脚本但没有成功。该代码将在 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-loop,以便我将文件夹和文件名更改如下:

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

我知道(set! j (+ j 1)) 不是正确的做事方式,而是让您了解我正在尝试做的事情。我觉得改变值的时候调用变量应该不难吧?

【问题讨论】:

  • 是什么让你觉得(set! j (+ j 1)) 不会做你想做的事?

标签: scheme global-variables counter do-loops


【解决方案1】:

在带有 vars 的列表中,您只需添加另一个术语:

(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 进行单元测试,扩展它以获取输入变量等。

【讨论】:

  • 谢谢!效果很好。你能检查一下我添加的更新吗?我认为如果将它分成几部分,问题就可以解决。我希望我没有在帖子中造成更多混乱!
  • @Emma 它们是不相关的问题,因此在doloops 中扩展这个关于变量的问题并不是一个好主意。您使用+ 添加数字。例如。 (+ 6 1/10); ==> 6.1。我觉得I've answered this before。想想下一个需要多个变量帮助的人。您的编辑对他们有用还是只是令人困惑?如果您需要,我会恢复并创建一个新问题。
  • !您建议(+ 6 1/10); ==> 6.1 的方法适用于读取一个案例(一个外部do-loop),但在第二个循环中失败:在第一个循环中:i 将是10 j=5datafilenum 将更改自:5.100 =>6.000,在第二个循环中:i =11j =6datafilenum 将从 6.100 =>7.000 更改我不知道如何将 datafilenum 作为小数点后 3 位的变量观点。如您所见,需要将该变量j 与小数点后的数字连接起来。希望这能澄清问题。
  • Stackoverflow 不建议删除问题,因为这可能会导致阻止用户提出新问题!
  • @Emma 我建议您将更改恢复为保留主题。您可以使用~0,3F,它会在右侧归零,就像我在a different answer.中展示的那样
猜你喜欢
  • 1970-01-01
  • 2021-10-04
  • 1970-01-01
  • 2013-04-14
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 2018-09-15
  • 2011-03-13
相关资源
最近更新 更多