Основные элементы языка программирования Icon. Чанышев О.Г. - 21 стр.

UptoLike

Составители: 

41
12. Немного о совыражениях – coexpression
В отличие от генераторов, рассмотренных ранее,
coexpression генерирует новое значение, если это возможно, при
каждом новом обращении к нему. Правда, так называемые «реге-
нерационные» совыражения могут генерировать от начала, но это
достигается за счет создания нового совыражения.
Coexpression нужно создать при помощи оператора create, а
затем активировать при помощи @, чтобы получить результат:
procedure main()
s:="qwertyuiop"
x:=create(!s)
writes(" ",*x)
writes(" ",@x)
writes(" ",*x)
writes(" ",@x)
writes(" ",*x)
end
Выход: 0 q 1 w 2
В данном случае *x – дает число сгенерированных значений.
Пример.
Пронумеруем строки входного файла, перезаписывая их в
выходной файл outf.txt:
procedure main(args)
f:=open(args[1])
outf:=open("outf.txt","wt")
x1:=create(seq())
while Sf:=!f do write(outf,@x1," ",Sf)
end
Совыражения могут передаваться в процедуры в качестве
параметров:
...............
proc1(create !s)
..............
procedure proc1(C)
42
return(@C)
end
Вызов proc{e1,e2,...,eN} эквивалентен proc([e1,e2,...,eN]), где
все ei – совыражения.
Для того чтобы понять, как работают «совыражения» в ре-
жиме псевдопараллельного выполнения, приведем два примера, не
пожалев места на странице.
.........................
S1:="0123456789"
S2:="abcdefghik"
a:=create !S1
b:=create !S2
while sim1:=@a do
{
writes(" ",sim1)
while sim2:=@b do writes(" ",sim2)
write()
}
.........................
Выход:
0 a b c d e f g h i k
1
2
3
4
5
6
7
8
9
Совыражение b мы разрядили в один прием, и далее печа-
таются только значения совыражения a.
А теперь заменим второе while на every:
.........................
while sim1:=@a do
        12. Немного о совыражениях – coexpression                       return(@C)
                                                                        end
      В отличие от генераторов, рассмотренных ранее,
coexpression генерирует новое значение, если это возможно, при           Вызов proc{e1,e2,...,eN} эквивалентен proc([e1,e2,...,eN]), где
каждом новом обращении к нему. Правда, так называемые «реге-      все ei – совыражения.
нерационные» совыражения могут генерировать от начала, но это
достигается за счет создания нового совыражения.                       Для того чтобы понять, как работают «совыражения» в ре-
      Coexpression нужно создать при помощи оператора create, а   жиме псевдопараллельного выполнения, приведем два примера, не
затем активировать при помощи @, чтобы получить результат:        пожалев места на странице.
      procedure main()                                                 .........................
      s:="qwertyuiop"                                                  S1:="0123456789"
      x:=create(!s)                                                    S2:="abcdefghik"
      writes(" ",*x)                                                   a:=create !S1
      writes(" ",@x)                                                   b:=create !S2
      writes(" ",*x)                                                   while sim1:=@a do
      writes(" ",@x)                                                   {
      writes(" ",*x)                                                   writes(" ",sim1)
      end                                                              while sim2:=@b do writes(" ",sim2)
      Выход: 0 q 1 w 2                                                 write()
      В данном случае *x – дает число сгенерированных значений.        }
                                                                       .........................
     Пример.                                                           Выход:
     Пронумеруем строки входного файла, перезаписывая их в              0abcdefghik
выходной файл outf.txt:                                                 1
     procedure main(args)                                               2
     f:=open(args[1])                                                   3
     outf:=open("outf.txt","wt")                                        4
     x1:=create(seq())                                                  5
     while Sf:=!f do write(outf,@x1," ",Sf)                             6
     end                                                                7
                                                                        8
     Совыражения могут передаваться в процедуры в качестве              9
параметров:                                                            Совыражение b мы разрядили в один прием, и далее печа-
     ...............                                              таются только значения совыражения a.
     proc1(create !s)                                                  А теперь заменим второе while на every:
     ..............                                                    .........................
     procedure proc1(C)                                                while sim1:=@a do

                              41                                                                   42