ВУЗ:
Составители:
Рубрика:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 6
- 7
- 8
- 9
- 10
- …
- следующая ›
- последняя »