在方案中用变量或循环替换数字(流利)不起作用



我正在使用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(。那里没有发生任何错误:(

相关内容

  • 没有找到相关文章

最新更新