# How are the methods goto, execute and transfer different? SWML offers a lot of flexibility in how you control program flow with its control methods. Of these, [goto], [execute], and [transfer] allow you to unconditionally control program flow. ## goto The [goto] method is designed to allow you to jump to particular labels within a section. Use this method to simulate more complex loops like while and for loops. :::warning you can not jump to sections using goto. Use [execute] described further below to jump sections. ::: yaml version: 1.0.0 sections: main: - play: say:Entering infinite loop - label: loop - play: say:Looping ... - goto: loop mermaid graph LR; loop[loop] main --> loop loop -- goto --> loop ## execute The [execute] method allows you to invoke a subsection as a function. You can pass parameters to the function and receive a return value. yaml andJson version: 1.0.0 sections: main: - play: say:Transferring you to another section - execute: subsection - play: say: %{return_value} subsection: - play: say:inside a subsection - return: back! Output transcript: Transferring you to another section inside a subsection back! mermaid graph LR; main --> subsection subsection --back!--> main Or in a more complex example: yaml andJson version: 1.0.0 sections: main: - play: say:Transferring you to another section - execute: dest: subsection params: a: 1 b: 2 - play: say: %{return_value} subsection: - return: %{params.a+params.b} mermaid graph LR; main -- a:1, b:2 --> subsection subsection -- 12 --> main ## transfer yaml andJson version: 1.0.0 sections: main: - play: say:Transferring you to another section - transfer: subsection - play: say:Back! subsection: - play: say:inside a subsection Output transcript: Transferring you to another section inside a subsection :::info Notice how we arent going back to the calling section at all. ::: mermaid graph LR; main -- params, vars, etc --> subsection ## Conclusion | | [goto] | [execute] | [transfer] | |:|:-|:--|:--| | Use | Jump between labels within a section | Invoke a subsection with params, then return | Invoke a subsection with params | | Scope | within a section | From one section to another, or to another SWML file | From one section to another, or to another SWML file | [goto]: ../../../methods/goto.mdx [transfer]: ../../../methods/transfer.mdx [execute]: ../../../methods/execute.mdx