As expressões for, às vezes chamadas de for loops, são as mesmas que expressões loop, com a diferença de que as expressões for iteram sobre um número limitado de itens. Isso significa que o número de iterações é conhecido antes que o loop for seja executado, e as decisões sobre quando sair do loop são automatizadas para você.
O dispositivo Gatilho de Pulso é um exemplo de loop for com iterações delimitadas quando você define a configuração de loop do dispositivo Gatilho de Pulso como um número. O pulso do Gatilho de Pulso se repete quantas vezes for especificado pela configuração de looping do dispositivo.
Neste exemplo, dois dispositivos Gatilho estão no caminho do Gatilho de Pulso. Quando o pulso do Gatilho de Pulso atinge um dispositivo Gatilho, ele envia um sinal para exibir texto em um dos dispositivos de Cartaz e se repete três vezes.
Como código, esse exemplo pode ter a seguinte aparência:
for (X := 0..2):
TriggerDevice1.Transmit()
TriggerDevice2.Transmit()A expressão for contém duas partes:
Especificação de iteração: as expressões entre parênteses e a primeira expressão devem ser um gerador. Neste exemplo, é
(X := 0..2).Corpo: as expressões após os parênteses. Neste exemplo, essas são as duas linhas com
Transmit().
Gerador
Um gerador produz uma sequência de valores, um por vez, e dá um nome ao valor. Neste exemplo, o gerador é X := 0..2, portanto, a cada iteração do loop, o gerador produz o próximo valor e dá ao valor o nome X. Quando o gerador atingir o final da sequência, o loop for terminará. Esse fluxo de decisão de verificar se a variável de loop tem um valor válido está incorporado à expressão for.
Geradores só oferecem suporte a intervalos, matrizes e mapas.
Como iterar sobre um intervalo
O tipo de intervalo representa uma série de números inteiros; por exemplo, 0..3 e Mín..Máx.
O início do intervalo é o primeiro valor na expressão, por exemplo, 0, e o final do intervalo é o valor seguinte a .. na expressão, por exemplo, 3. O intervalo contém todos os números inteiros entre, e inclusive, os valores inicial e final. Por exemplo, a expressão de intervalo 0..3 contém os números 0, 1, 2 e 3.
Expressões de intervalo oferecem suporte apenas a valores int e só podem ser usadas em expressões for, sync,race e rush.
for (Number := 0 .. 3):
Log("{Number}")O resultado adicionará quatro linhas ao registro contendo os números 0, 1, 2 e 3.
Uma expressão for pode retornar os resultados de cada iteração em uma matriz. No exemplo a seguir, Numbers é uma matriz imutável com os valores int de -1 a -10.
Numbers := for (Number := 1..10):
-NumberComo iterar sobre uma matriz ou um mapa
As iterações sobre matrizes e mapas podem ser apenas os valores, ou o par de chave/valor para mapas e o par de índice/valor para matrizes.
Nesse caso, somente os valores da matriz são usados, e Values é uma matriz imutável com os valores int 2, 3 e 5.
Values := for (X : array{1, 2, 4}):
X+1O mesmo pode ser feito com um mapa, e Values é, nesse caso, uma matriz imutável com os valores int 3,7.
Values := for (X := map{ 1=>3, 0=>7 }):
XO padrão X->Y pode ser usado para desconstruir um par índice-valor ou chave-valor. O índice (ou chave) está vinculado à parte esquerda (X), e o valor está vinculado à parte direita (Y).
Um exemplo de pares índice-valor de uma matriz, Values é uma matriz imutável com os valores int 1, 3 e 6.
Values := for ( X -> Y : array{1, 2, 4}) :
X + YUm exemplo de pares índice-valor de um mapa, Values é uma matriz imutável com os valores int 4 e 7.
Values := for ( X->Y := map{ 1=>3, 0=>7 }):
X + YFiltro
Você pode adicionar expressões falíveis à expressão for para filtrar os valores do gerador. Se o filtro falhar, não haverá resultado para essa iteração, e for pula para o próximo valor produzido pelo gerador.
Por exemplo, o filtro Num <> 0 é adicionado à expressão for para excluir 0 dos resultados retornados.
NoZero := for (Number := -5..5, Number <> 0):
NumberSintaticamente, isso é igual a:
expression0
for (Item : Collection, test-arg-block):
expression1
expression2Definição
Você também pode adicionar expressões nomeadas à especificação de iteração, e o nome pode ser usado tanto na especificação de iteração quanto no corpo.
Values := for ( X := 1..5; Y:=SomeFunction(X); Y < 10):
YResultado: uma matriz com no máximo 5 itens em que todos os valores são menores que 10.
“For” aninhado
Você pode aninhar um loop for dentro de outro loop for. Há duas maneiras de fazer isso:
Uma única expressão “for”: especificada por vários geradores. O resultado é uma matriz unidimensional.
Várias expressões “for”: Blocos
forseparados. O resultado é uma matriz multidimensional.
As seções abaixo os descrevem mais detalhadamente.
Uma única expressão “for”
Você pode ter vários loops em uma única expressão for adicionando mais geradores. O resultado de uma única expressão for com vários geradores é uma matriz unidimensional.
Neste exemplo, Values é uma matriz imutável com os valores int 13, 14, 23 e 24.
Values := for(X:=1..2, Y:=3..4):
X * 10 + YSemanticamente, é o mesmo que:
expression0
for (Item : Collection, Item2 : Collection2):
expression1
expression2Várias expressões “for”
Você também pode aninhar uma expressão for no corpo de outro loop for. Como uma expressão for retorna uma matriz unidimensional, aninhar uma expressão for retorna uma matriz bidimensional.
Nesse caso, Values é uma matriz imutável com duas matrizes int imutáveis. A primeira matriz contém os valores 13 e 14, e a segunda, 23 e 24. Isso pode ser escrito como array{ array{13, 14}, array{23, 24} }.
Values := for ( X := 1..2 ):
for (Y := 3..4):
X * 10 + YFalha
Se alguma coisa falhar dentro da especificação de iteração, todas as alterações decorrentes dessa iteração serão revertidas.
for(X := 1..5; S := IncrementSomeVariable(); X < 3):
XO resultado dessa expressão for é array{1,2}, e somente duas chamadas para IncrementSomeVariable após a avaliação do loop for porque as outras chamadas foram revertidas quando o filtro X < 3 falhou.