бесконечная вложенная рекурсия в QSP

бесконечная вложенная рекурсия в QSP

при портировании очередного проекта с QSP на INSTEAD столкнулся с тем, что в QSP допустимы конструкции, когда функция А вызывает функцию Б, которая, в свою очередь, вызывает функцию А.
каким образом QSP относится к бесконечной вложенной рекурсии?

Изменено: v.v.b.
19.Авг.14 12:04:34
v.v.b.
useravatar
Offline
14 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

v.v.b.,
а какого поведения ты ожидаешь?

Nex
useravatar
Offline
4277 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

Nex написал(а):

v.v.b.,
а какого поведения ты ожидаешь?

отвечать вопросом на вопрос -- это и есть случай вызова той самой бесконечной вложенной рекурсии.
потому отвечу так. я не ожидаю никакого. я спрашиваю у специалистов какое поведение сейчас в движке. и спрашиваю ЧТО происходит при подобном случае.

v.v.b.
useravatar
Offline
14 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

Будет вылет плеера.

Ajenta
демиург
useravatar
Offline
1364 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

Ajenta написал(а):

Будет вылет плеера.

странно. но игра с этим кодом прекрасно играет. речь идёт о "Город Туманов"

v.v.b.
useravatar
Offline
14 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

Явная рекурсия типа goto $curloc на текущей локации (равно как и случай, описанный выше) в классике вызывает повисание плеера и вылет. Если добавить команду задержки типа wait 500, и что-нибудь типа pl 'Сообщение', то вы увидите, что плеер работает нормально. Можно сделать вложенную рекурсию, но мне не видится, как при этом игрок сможет взаимодействовать с игрой.

Aleks Versus
воздвигатель башни
useravatar
Онлайн
1481 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

Город туманов под аеру, вероятно там (в аере) предусмотрен какой-то механизм на случай рекурсии. Классик же стабильно вылетает.

Ajenta
демиург
useravatar
Offline
1364 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

фрагмент непонятного мне кода:

 Спойлер Show Spoiler Hide Spoiler
 

Код:


Location: "_check_cuper"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Location's description:

    ! $args[0] - figure name

    if $args[0] = 'circle':
        result = cuper_circle
        if func('_check_gold', 'squre') = 1:
            result = 1
        end
    elseif $args[0] = 'triangle':
        result = (cuper_triangle - 1) * -1
        if func('_check_silber', 'rectangle') = 1 or func('_check_silber', 'triangle') = 1:
            result = 0
        end
    elseif $args[0] = 'square':
        result = (cuper_square - 1) * -1
        if func('_check_silber', 'triangle') = 1 or (func('_check_gold', 'triangle') = 1 and gold_triangle = 0):
            result = 0
        end
    elseif $args[0] = 'rectangle':
        result = (cuper_rectangle - 1) * -1
        if func('_check_silber', 'triangle') = 1 or (func('_check_gold', 'triangle') = 1 and gold_triangle = 1):
            result = 0
        end
    end

------------ End of location: "_check_cuper" ------------

Location: "_check_gold"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Location's description:

    ! $args[0] - figure name


    if $args[0] = 'circle':
        result = (gold_circle - 1) * -1
        if func('_check_gold', 'squre') = 1 or func('_check_cuper', 'squre') = 1:
            result = 0
        end
    elseif $args[0] = 'triangle':
        result = 1
        if func('_check_cuper', 'squre') = 1:
            result = 0
        end
    elseif $args[0] = 'square':
        result = (gold_square - 1) * -1
        if func('_check_silber', 'rectangle') = 1 or func('_check_silber', 'triangle') = 1 or (func('_check_gold', 'triangle') = 1 and gold_triangle = 0) or func('_check_cuper', 'squre') = 1:
            result = 0
        end
    elseif $args[0] = 'rectangle':
        result = 0
    end

------------ End of location: "_check_gold" ------------

непонятно:
func('_check_cuper', 'squre') включает вызов func('_check_gold', 'triangle')
func('_check_gold', 'triangle') включает вызов func('_check_cuper', 'squre')

поясните, плиз

v.v.b.
useravatar
Offline
14 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

а почему squre, а не square, как в условиях. Так в игре сделано?

Aleks Versus
воздвигатель башни
useravatar
Онлайн
1481 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Re: бесконечная вложенная рекурсия в QSP

Aleks Versus написал(а):

а почему squre, а не square, как в условиях. Так в игре сделано?

я скопировал из кода игры
получается, что этот кусок кода из-за опечатки не вызывается, и потому не возникает рекурсии?

v.v.b.
useravatar
Offline
14 Сообщений
Информация о пользователе в сообщениях
Администратор отключил публичную отправку сообщений

Информация

Статистика форума:
 
Всего тем:
970
Всего опросов:
14
Всего сообщений:
16790553
Всего сообщений сегодня:
1
Пользователи форума:
 
Всего пользователей:
2356
Последним зарегистрировался:
Red Dragon