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

UptoLike

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

15
2.2. !e – генерация элементов
Если e – некоторая структура, то !e берет первый элемент
структуры, а в контексте генерации генерирует множество эле-
ментов этой структуры.
Примеры:
L:=[1,2];every writes(" ",!L).#Выход: 1 2
s:="cat";every writes(" ",!s).#Выход: c a t
Бинарные операции, содержащие генераторы:
every writes(" ",5 to 6)+(10 to 20))
напечатает 15 25 16 26
2.3. Оператор & – and
e1&e2
Этот оператор возвращает значение правого операнда и
имеет наинизший приоритет.
every i:=|seq(1,2)\3 & j:=|seq(2,2)\3 & i~= j & writes(" ",i+j)
Выход: 3 5 7 5 7 9 7 9 11
2.4. Backtracking и неуспех
Перебор прекращается, когда
перебирать уже нечего, и
управление переходит к следующему выражению. Например, на-
печать 12345 можно так (не рассматривая очевидный вариант
write("12345")): every writes (1 to 5).
Этот же результат можно получить, если использовать
встроенное в Icon выражение &fail, которое всегда порождает не-
успех.
write (1 to 5) + &fail.
write("\n","O'key")
Знак ‘+’ нужен только для конструирования синтаксически
правильного выражения, т. е. контекст генерции задается "неуспе-
хом".
Тогда мы
можем использовать чисто «прологовский» стиль:
procedure main()
S:="tak pit hochetsa, chto perenochevat negde\n"
(sim:=!S, writes(sim),sim=="\n")
write("O'key")
16
end
Выход: – исходная строка S и O'key с новой строки.
Проверка каждого символа на равенство символу перевода
строки порождает неуспех вплоть до последнего символа, что за-
ставляет первое подвыражение (sim:=!S) генерировать новые сим-
волы. В итоге напечатается строка S, а затем O'key.
2.5. Проверка на &null
Унарный оператор ‘\’ успешен, если его операнд имеет зна-
чение, отличное от &null,
а ‘/’ – в противном случае, т. е. мы мо-
жем написать
if \x & \y then...".
Если x не присвоено значение, мы не можем написать if
~x…, но должны написать if /x … .
2.6. Альтернатива |
Вертикальная черта ‘|’, читаемая как «или», смотрится как
бинарный оператор, но появляется и в ином контексте. Выраже-
ние:
e1 | e2 означает генерацию всех элементов e1, а затемвсех
e2.
procedure main()
local x,y,z
L:=["Vera","Manja","Tanja"]
x:=1
if (\x | \y) then z:=10
(writes(" ",!L) | write(" ",z))
every (writes(" ",!L) | write(" ",z))
#while (writes(" ",!L)) | write(" ",z))
end
Выход: Vera Vera Manja Tanja 10
Если раскомментировать выражение перед end, то получим
бесконечную печать слова Vera.
      2.2. !e – генерация элементов                                          end
                                                                             Выход: – исходная строка S и O'key с новой строки.
     Если e – некоторая структура, то !e берет первый элемент
                                                                             Проверка каждого символа на равенство символу перевода
структуры, а в контексте генерации генерирует множество эле-
                                                                       строки порождает неуспех вплоть до последнего символа, что за-
ментов этой структуры.
                                                                       ставляет первое подвыражение (sim:=!S) генерировать новые сим-
     Примеры:
                                                                       волы. В итоге напечатается строка S, а затем O'key.
     L:=[1,2];every writes(" ",!L).#Выход: 1 2
     s:="cat";every writes(" ",!s).#Выход: c a t
                                                                            2.5. Проверка на &null
     Бинарные операции, содержащие генераторы:
     every writes(" ",5 to 6)+(10 to 20))                                    Унарный оператор ‘\’ успешен, если его операнд имеет зна-
     напечатает 15 25 16 26                                            чение, отличное от &null, а ‘/’ – в противном случае, т. е. мы мо-
                                                                       жем написать
      2.3. Оператор & – and                                                  if \x & \y then...".
                                                                             Если x не присвоено значение, мы не можем написать if
     e1&e2
                                                                       ~x…, но должны написать if /x … .
     Этот оператор возвращает значение правого операнда и
имеет наинизший приоритет.
                                                                            2.6. Альтернатива |
     every i:=|seq(1,2)\3 & j:=|seq(2,2)\3 & i~= j & writes(" ",i+j)
     Выход: 3 5 7 5 7 9 7 9 11                                              Вертикальная черта ‘|’, читаемая как «или», смотрится как
                                                                       бинарный оператор, но появляется и в ином контексте. Выраже-
      2.4. Backtracking и неуспех                                      ние:
                                                                            e1 | e2 означает генерацию всех элементов e1, а затем – всех
       Перебор прекращается, когда перебирать уже нечего, и
                                                                       e2.
управление переходит к следующему выражению. Например, на-
                                                                            procedure main()
печать 12345 можно так (не рассматривая очевидный вариант
                                                                            local x,y,z
write("12345")): every writes (1 to 5).
                                                                            L:=["Vera","Manja","Tanja"]
       Этот же результат можно получить, если использовать
                                                                            x:=1
встроенное в Icon выражение &fail, которое всегда порождает не-
                                                                            if (\x | \y) then z:=10
успех.
                                                                            (writes(" ",!L) | write(" ",z))
       write (1 to 5) + &fail.
                                                                            every (writes(" ",!L) | write(" ",z))
       write("\n","O'key")
                                                                            #while (writes(" ",!L)) | write(" ",z))
       Знак ‘+’ нужен только для конструирования синтаксически
                                                                            end
правильного выражения, т. е. контекст генерции задается "неуспе-
                                                                            Выход: Vera Vera Manja Tanja 10
хом".
                                                                            Если раскомментировать выражение перед end, то получим
       Тогда мы можем использовать чисто «прологовский» стиль:
                                                                       бесконечную печать слова Vera.
       procedure main()
       S:="tak pit hochetsa, chto perenochevat negde\n"
       (sim:=!S, writes(sim),sim=="\n")
       write("O'key")

                                15                                                                    16