CamelCase в Icon
Прежде всего программа читает строку для обработки в переменную text
и добавляет в конец пробел (||
— оператор конкатенации). Затем переменная text
сканируется (?
— оператор сканирования, позволяющий привязать все операции поиска в строке к определенной переменной) следующим образом.
Команды ReFind
и ReMatch
из библиотеки регулярных выражений regexp
находят все последовательности символов, соответствующие регулярному выражению, но ReFind
возвращает индекс начала последовательности, а ReMatch
— первого символа после последовательности. За одну итерацию цикла ReFind
находит начало следующей последовательности не-букв. Команда tab
перемещает указатель на текущую позицию в сканируемой строке на это начало и возвращает подстроку от предыдущей позиции до новой — слово. Затем слово преобразуется к нужному формату и добавляется к результату. *word
— функция, возвращающая длину строки word
. map
заменяет символы первого аргумента, которые есть во втором, на их соответствия из третьего (в данном случае — заменяет друг на друга символы из &lcase
и &ucase
, встроенных переменных, содержащих алфавит в нижнем и верхнем регистре, соответственно). Наконец, еще одно обращение к tab
перемещает указатель на начало следующего слова (конец последовательности не-букв).
link regexp
procedure main ()
text := read() || " ";
cc := "";
text ? {
while j := ReFind("[^a-zA-Z]+") do {
word := tab(j);
cc ||:= map(word[1],&lcase,&ucase) || map(word[2:*word+1],&ucase,&lcase);
tab(ReMatch("[^a-zA-Z]+"));
}
}
write (cc);
end
Комментарии
]]>blog comments powered by Disqus
]]>