在 Scheme (Fluent) 中用变量或循环替换数字不起作用

Replacing number by variable or loop in Scheme (Fluent) doesn't work

我正在使用 ANSYS Fluent 程序进行 CFD 模拟。该程序允许使用所谓的日志文件对模拟设置进行部分自动化,我才知道这个日志文件是用 Scheme 编写的。不幸的是我从来没有听说过 Scheme,我只知道它是一种 Lisp 方言(我也一无所知)。

我正在尝试通过使用循环自动为我的模拟设置一堆参数来自动执行一些无聊的任务。如果我从 Fluent 的命令界面 运行 这个命令:

(cx-gui-do cx-set-list-selections "Boundary Conditions*Table1*List2(Zone)" '( 4))

它做了预期的事情(它从列表中选择了第 4 项)。但是,如果我将其放入循环中:

(do ((z 4 (+ z 1))) ((> z 27))
  (cx-gui-do cx-set-list-selections "Boundary Conditions*Table1*List2(Zone)" '( z))
)

没有任何反应,程序在命令 window 中打印 #f。然后,如果我这样做:

(define z 4)
(cx-gui-do cx-set-list-selections "Boundary Conditions*Table1*List2(Zone)" '( z))

什么都没有发生。

为什么用变量替换数字 4 不起作用?为什么循环 returns a #f?

我认为这里的问题来自'(z)部分。此报价 ' 称为 quote 并且是 (quote ...) 看涨期权的简称。它不会创建列表,它用于 return 未经评估的内容。在您的情况下,如果您传递 (4) 而不是 '(4),您将得到一个错误,因为 Scheme 将尝试对其求值,并且没有名为 4 的函数。当您像第一个示例一样传递一些静态数据(变量或列表)时,可以使用引号。但是当你使用 '(z) 时,这个列表将原样传递给 cx-gui-do,变量 z 不会在这里被替换,它会保留为符号 z.

这听起来可能有点神秘,所以简而言之 - 当您动态创建列表时,您必须使用 list 函数。这应该有效:

(do ((z 4 (+ 1 z)))
    ((> z 27))
  (cx-gui-do cx-set-list-selections "Boundary Conditions*Table1*List2(Zone)" (list z)))

编辑:#f 你在使用 do 循环时看到的是一个 return 值。每次你在 Schemes REPL / prompt / Command Interface 中评估某些东西时,都会打印 return 值(即如果你尝试 (+ 1 20) 你应该得到 21 打印)。对于 do 循环,您必须提供 return expression。如果不是,则未指定 do 循环将 return(因此在某些实现中它可能是 #f 意思是 false,在其他 () 又名 NIL)。那里没有发生任何问题:)