我正在使用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
。然后,如果我这样做:
(define z 4)
(cx-gui-do cx-set-list-selections "Boundary Conditions*Table1*List2(Zone)" '( z))
什么都没有发生。
为什么用变量替换数字4
不起作用?为何循环返回#f
?
我认为这里的问题来自'(z)
部分。此勾号'
被称为quote,是(quote ...)
呼叫的简写。它不会创建列表,而是用于返回没有评估的内容。在您的情况下,如果您通过(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)))
哦,还有个小小的解决方法-如果您增加1,则可以像上面一样使用+1
函数。