Замена числа переменной или циклом в схеме (Fluent) не работает

Я использую программу ANSYS Fluent для моделирования CFD. Эта программа позволяет частично автоматизировать настройку симуляции с использованием так называемого файла журнала, и я только что узнал, что этот файл журнала написан на схеме. К сожалению, я никогда даже не слышал о Scheme, я просто знаю, что это диалект Лиспа (о котором я тоже ничего не знаю).

Я пытаюсь автоматизировать некоторые скучные задачи, используя цикл для автоматической установки набора параметров для моей симуляции. Если я запускаю эту команду из командного интерфейса 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?


person The Drunken Whaler    schedule 18.11.2019    source источник
comment
Что должна делать эта строка `((›z 27))`? Вы имели в виду что-то вроде (when (> z 27) (cx-gui-do ..... - условное выполнение?   -  person rsm    schedule 18.11.2019
comment
@rsm Я скопировал эту строку из какого-то примера в Интернете. Предполагается, что эта строка является условием остановки цикла (цикл начинается с z=4 и останавливается, когда z>27). Если я добавлю when, как вы предложили, программа выдаст ошибку Error: eval: unbound variable Error Object: when   -  person The Drunken Whaler    schedule 18.11.2019
comment
Ой, извини. Я думал, что это часть тела do из-за отступа ;)   -  person rsm    schedule 18.11.2019
comment
@rsm Нет проблем. Извините, если я непреднамеренно вырезал отступ ;-)   -  person The Drunken Whaler    schedule 18.11.2019
comment
Пожалуйста, проверьте мой ответ. Если это решило вашу проблему, пожалуйста, примите это, чтобы отметить свой вопрос как решенный, и если вам это нравится, пожалуйста, проголосуйте. Если ваша проблема все еще существует, дайте мне знать.   -  person rsm    schedule 18.11.2019


Ответы (1)


Проблема здесь, я думаю, исходит из '(z) части. Этот тик ' называется quote и является сокращением от (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). Ничего страшного там не происходит :)

person rsm    schedule 18.11.2019
comment
Похоже, у Fluent нет функции +1, поэтому я вернулся к + 1. В остальном петля работала отлично! Спасибо! (другая вещь не работает, но это для другого вопроса.) Кроме того, в моем профиле пользователя пока нет функции +1 для голосования за ваш ответ :( - person The Drunken Whaler; 18.11.2019
comment
Если вы можете/хотите взглянуть, я был бы признателен: stackoverflow.com/q/58907521/12388640. Спасибо еще раз :-) - person The Drunken Whaler; 18.11.2019
comment
@TheDrunkenWhaler Я обновил свой ответ, чтобы объяснить #f, что вы получаете. К сожалению, я не знаю Fluent, и ваш второй вопрос выглядит как проблема, связанная с Fluent. По крайней мере, код схемы выглядит там нормально. - person rsm; 18.11.2019
comment
Спасибо за объяснение по поводу #f; теперь это имеет смысл! Я предполагаю, что это может быть связано с синхронизацией графического интерфейса или чем-то еще, и я не удивлюсь, если это проблема только для Fluent... Эта вещь с использованием команд для нажатия кнопок графического интерфейса кажется действительно глупой. мне ... Спасибо за вашу помощь в любом случае! (Небольшая поправка: вам повезло, что вы не знаете Fluent ;-) - person The Drunken Whaler; 18.11.2019