пятница, 3 января 2020 г.

Циклы


    Цикл - повторение одного и того же кода несколько раз. Для реализации цикла в cine используется два оператора - for и parse.

Оператор for

    for имеет три варианта:
  1. for выражение 1; выражение 2; выражение 3
        код

    Алгоритм работы такого варианта следующий:
    1. выполняется выражение 1
    2. выполняется выражение 2 и если оно возвращает true, то выполняется код принадлежащий for, иначе for завершает свою работу
    3. выполняется выражение 3
    4. ход выполнения возвращается к пункту 2 (так происходит до тех пор пока выражение 2 не вернет false)

    Выражения 1 и 3 не должны возвращать значения, а так же в них можно присваивать значения перемеренным.
    В выражении 1 можно создать новую переменную или константу, которая будет существовать только во время работы for.
    Выражение 2 должно возвращать значение типа Bool.
    Любое из 3 выражений не является обязательным, если отсутствует выражение 2, то считается что оно возвращает true.
    Код не является обязательным.

  2. for выражение
        код

    Алгоритм работы такой же как и у варианта 1, но отсутствуют выражения 1 и 3, а так же нет разделителей ";".

  3. for
        код

    Алгоритм работы такой же как и у варианта 2, но отсутствует выражение. Считается, что это выражение всегда возвращает true. Как выйти из такого цикла будет рассказано в следующей статье.
Оператор parse

    parse используется для разбора по частям каких либо данных (например разбор строки по символу). Синтаксис parse:


parse константа 1, константа 2 <- выражение
    код

По принципу работы parse схож со следующей конструкцией:

константа 3 .= выражение
for переменная := parse_first(константа 3); parse_haveItem?(константа 3, переменная); parse_next(константа 3, переменная)
    константа 1 .= parse_key(константа 3, переменная)
    константа 2 .= parse_item(константа 3, переменная)
    код

но есть отличия:
  1. константа 3 на самом деле не создаётся 
  2. переменная не получает имени и к ней никак нельзя обратиться
  3. вместо имен констант 1 или 2 можно указать знак подчёркивания, это будет означать что константу не нужно создавать
  4. если в качестве выражения для parse была передана переменная, то её значения во время работы  parse нельзя менять
    Давайте для примера создадим с помощью fei новую программу и дадим ей имя for-parse-cine и заменим содержимое main.cine на следующий код:


//удаляет пробелы и табуляции в начале строки
//заменяет последовательности из пробелов и табуляций на один пробел
func trim(string)
    rules
        final = string == [UInt8]
        result = [UInt8]
    result = ""
    for index := 0; index < string.getLength(); index++
    //в начале переменная index будет равна 0 (index := 0)
    //каждое повторение index будет увеличиваться на 1 (index++)
    //цикл продолжается до тех пор, пока index меньше длинны строки
        if char := string[index]; char == ' ' || char == '\t'
            then
                startIndex .= index
                for index++; index < string.getLength(); index++
                    if char = string[index]; char != ' ' && char != '\t'
                        then
                            index--
                            break //о break подробней в следующей статье
                if index < string.getLength() && startIndex != 0
                    then result += ' '
            else result += char

//удаляет пробелы и табуляции
func removeSpaces(string)
    rules
        final = string == [UInt8]
        result = [UInt8]
    result = ""
    parse _, char <- string
    //при разборе слайса, первая константа - индекс элемента
    //а вторая - элемент
    //в данном случае нам не нужен индекс, поэтому мы указали символ _
        if char != ' ' && char != '\t'
            then result += char

proc main()
    "   \tHello \t user ! !!!    !  ".trim().printLn()
    "   \tHello \t user ! !!!    !  ".removeSpaces().printLn()

    В результате работы программы на экран выведется следующие 2 строки:
Hello user ! !!! !
Hellouser!!!!!

Комментариев нет:

Отправить комментарий

Пожалуйста без мата и оскорблений. Если хотите сообщить об ошибках, для этого есть форма обратной связи.