Понимание порядка вычисления и выполнения с синтаксисом точки с запятой - PullRequest
0 голосов
/ 22 мая 2018

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

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

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

  1. оценить a & b
  2. выполнить a, выполнить b
  3. оценить c & d
  4. выполнить cвыполнить d
  5. вычислить e & f
  6. выполнить e, выполнить f

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

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

пила []

b пила []

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

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

e пила [пила [], b увидел [], c увидел [a увидел [], b увидел []], d увидел [a увидел [], b увидел []]]

f увидел [увидел [], b увидел[], c увидел [пила [], b увидел []], d увидел [a увидел [], b увидел []]]

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

1 Ответ

0 голосов
/ 22 мая 2018

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

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

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

Итак:

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 []
...