VK Video
Сколько раз будет вычислена строка кода если в коде на нее есть 3 ссылки?
3 (три)! Но только если строка не зафиксирована.
Что это значит. Если у нас есть такой код:
=: if(condition: $calc < 0; then: 0; else: $calc)
calc
// И дальше в calc вычисление на 40 строк
то при его вычислении машина дойдя до первого calc
пойдет и вычислит его, потом она дойдет до второго вызова calc
в строке с if
и снова пойдет и вычислит его!
Что бы сказать, что второй раз вычислять не надо — используется ~
:
=: if(condition: $calc < 0; then: 0; else: $calc)
~calc
// И дальше в calc вычисление на 40 строк
В этом случае, когда calc
вычислится первый раз, он будет запомнен (зафиксирован) в пределах выполнения этого кода и повторное обращение к нему в else
не приведет к повторному вычислению.
Как зафиксировать значение строки при первом вычислении, чтобы последующие обращения брали запомненное значение?
Надо поставить ~
перед названием строки:
=: if(condition: $select != ""; then: $select; else: 0)
~select: select(table: 'table_name'; field: 'field_name'; where: 'id' = #number)
В каких случаях это может привести к ошибке вычисления?
Например в while или listReplace. То-есть там, где есть итерации. Если зафиксировать строку на первой итерации, то последующие не будут вычеслены:
= : while(action: $set; limit: 30; iterator: "iter1")
set: var(name: "count"; value: $plus)
plus: listAdd(list: $var; item: $i)
var: var(name: "count"; default: $#lc)
i: dateAdd(date: $#nd; days: $days; format: "Y-m-d")
days: $#iter1 * -1
// Этот код создает список из 30 дат, начиная с текущей и на 30 дней назад.
// Тильда (~) в любом месте его поломает!