# 00013. Редактирование main.scm. Потоки и опкоды (Часть 3)

Редактирование main.scm. Потоки и опкоды (Часть 3)|В этом уроке мы продолжим изучать потоки. На этот раз мы познакомимся с командами gosub и return|wmysterio|wmysterio||||Если вы владеете какими то языками программирования, то для Вас это может показаться знакомой вешью. Итак, ознакомимся с тем, как пишется команда **gosub**:

```
gosub @POTOK_1
```

Эта команда переходит на метку "POTOK\_1" так же само, как и "jump", только разница том, что шарик будет возвращаться к месту, где этот переход состоялся. Возвращаться он будет когда встретит ближайший **return**. Следовательно **return** - команда возврата. Давайте напишем небольшой скрипт, что бы вы поняли как он работает:

```
:POTOK
thread 'POTOK'
wait 0
gosub @POTOK_1
end_thread

:POTOK_1
wait 0
return
```

Графически можно представить так:

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/0/84529523.png)

Давайте проследим за тем, так будет двигаться шарик. Сначала он пройдёт 3 строчки. На 4-й он встретит "gosub", дальше идёт прыжок на 7 строку, так как именно там находится метка "@POTOK\_1". Проходит дальше 2 строки и встречает "return". Дальше шарик прыгает обратно на строку, где был "gosub" и продолжает путь, то есть переходит на 5 строку и "уходит на пенсию" =)

Напишем более сложный скрипт, где есть несколько "gosub", и посмотрим на движение шарика:

![](https://github.com/wmysterio/scm-scripting-lessons/blob/main/_pu/0/52091111.png)

Что бы вам было легче представить как работают эти 2 опкода, я наведу пример в реальной жизни:

Папа Васе:\
\- Сын, пойди в магазин.\
Вася идёт.\
По дороге ему девочка Рита:\
\- Вася, сорви для меня цветок.\
Вася идёт рвать цветы. Возвращается. Девочка благодарит. Вася идёт в магазин, покупает там, и приходит домой. Папа даёт Васе 5 рублей.

Теперь давайте рассмотрим картинку, которая "транслирует" эту историю в Sanny Builder:

![](https://github.com/wmysterio/scm-scripting-lessons/raw/resources/_pu/0/80340610.png)

Таким образом можно сказать, что поток существует, что бы выполнять одну конкретную задачу, а "gosub" - что бы выполнять вторичные. В нашем примере главная цель - заработать 5 рублей, вторичные цели - купить товар, сорвать цветок. Две вторичные задачи - два "gosub".

И, конечно, не забываем о правилах переходов, которые я написал в предыдущем уроке. Думаю основы работы с потоками и метками вы научились. Пора переходить к новому материалу. Если у вас возникли вопросы, задайте их на форуме.

× \*\*ВАЖНО:\*\* Любой "gosub" требует обязательного возврата командой "ruturn".× \*\*Примечание:\*\* В SCM скриптинге есть лимит на количество вложенных "gosub" - 8 штук. Под "вложенными" имеется ввиду те "gosub", которые вызываются внутри существующего "gosub". В последнем примере таких вложенных "gosub" было 2 ( "@POTOK\_1" и "@POTOK\_2" ). Остальные находились на одном уровне вложенности.|1360|1|0|84529523\`png\`285\`183 \`\`\`

`\|52091111`png`290`343

```
`\|80340610`png`574`379`400`264``\||redaktirovanie_main_scm_potoki_i_opkody_chast_3|1498207216
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://lessons.sannybuilder.com/00100/00300/00013.-redaktirovanie-main.scm.-potoki-i-opkody-chast-3.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
