1

我正在使用 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))
)

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

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

什么都没有发生。

为什么用 4变量替换数字不起作用?为什么循环返回一个#f

4

1 回答 1

2

我认为这里的问题来自'(z)部分。此刻'度称为报价,是(quote ...)call 的简写。它不会创建一个列表,它是为了返回一些没有评估的东西。在你的情况下,如果你通过(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循环时,您会看到返回值。每次您在 Schemes REPL / prompt / Command Interface 中评估某些内容时,都会打印返回值(即,如果您尝试(+ 1 20),您应该得到21打印的结果)。对于do循环,您必须提供返回表达式。如果不是,则未指定do循环将返回什么(因此在某些实现中,它可能是#f含义false,在其他()又名 NIL 中)。那里没有发生任何问题:)

于 2019-11-18T02:07:44.733 回答