我正在使用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 ...)
调用的短手。它不创建列表,而是用于返回未经评估的内容。在您的情况下,如果您传递(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)))
EDIT:#f
您在使用do
循环时看到的是一个返回值。每次在Schemes REPL/prompt/Command Interface中评估某个内容时,都会打印返回值(即,如果您尝试(+ 1 20)
,则应打印为21
(。对于do
循环,您必须提供返回表达式。如果不是,则未指定do
循环将返回什么(因此在某些实现中,它可能是#f
,意思是false
,在其他()
中,也称为NIL(。那里没有发生任何错误:(