Понимание порядка оценки и выполнения с синтаксисом точки с запятой

Я уже немного узнал о точках с запятой FFL из моего предыдущего вопроса. Однако до сих пор неясно, какой порядок оценки или выполнения они применяют. Итак, вот более конкретный пример:

 [ expr_a, expr_b ; expr_c, expr_d ; expr_e, expr_f ]

Каков должен быть порядок выполнения приведенного выше кода? В моей голове должно быть:

  1. оценить а и б
  2. выполнить а, выполнить б
  3. оценить c и d
  4. выполнить в, выполнить д
  5. оценить e & f
  6. выполнить e, выполнить f

Теперь давайте представим, что expr_b = add(test_list, ['b saw ' + str(test_list)]) и подобные для всех остальных выражений. Тогда каким будет окончательное содержимое test_list?

В моей голове должно быть:

пила []

б видел []

c пила [a пила [], b пила []]

д пила [а пила [], б пила []]

е пила [а пила [], b пила [], c пила [а пила [], b пила []], d пила [а пила [], b пила []]]

f пила [a пила [], b пила [], c пила [a пила [], b пила []], d пила [a пила [], b пила []]]

Пожалуйста, объясните, почему это не так.


person Patrick Parker    schedule 21.05.2018    source источник


Ответы (1)


Начнем с того, что вы, вероятно, не захотите писать именно такой код. Как правило, точки с запятой имеют очень низкий приоритет, но литерал списка не является оператором, и код будет выглядеть следующим образом:

[a, (b; c), (d; e), f]

Это означает, что вы запускаете четыре конвейера команд параллельно (хотя два из них состоят только из одного члена). Он будет оценивать a, b, d, f. Затем он выполнит результаты a, затем результаты b. Выполнение b вызовет следующий шаг в конвейере команд, поэтому он оценит и выполнит c. Затем он выполнит d, затем оценит и выполнит e, наконец, выполнит f.

So:

a saw []
b saw []
c saw [a saw [], b saw []]
d saw []
e saw [a saw [], b saw [], c saw [a saw [], b saw []], d saw []]
f saw []
person Denivarius    schedule 21.05.2018