Duda cuando usar Macro o Gosub

608 views
Skip to first unread message

Gonzalo Marcote

unread,
Jul 8, 2009, 7:22:00 AM7/8/09
to asterisk-es
Hoy programando un dialplan me asaltó una duda sobre si usar la App
Macro o Gosub.
La verdad es que los dos van a otro contexto a hacer una subrutina y
vuleven al contexto principal (uno con Return y el otro con
MacroExit).

Yo siempre uso Gosub, en parte por el warning que sale al hacer en el
CLI un 'core show application macro' de que esta limitado a 7 niveles.

Además con Gosub heredas las variables del contexto principal ¿no?,
pero con Macro esta el coñazo de que las tienes que pasar como
argumentos.

Entonces, en que casos convedría usar una u otra?

Gracias.

Gonzalo

unread,
Jul 8, 2009, 7:25:36 AM7/8/09
to asterisk-es
Vale, ya acabo de ver buscando por la web que desde la version 1.6
recomiendan usar Gosub en vez de Macro...

Elio Rojano

unread,
Jul 8, 2009, 7:28:22 AM7/8/09
to aster...@googlegroups.com
La principal diferencia es que en una Macro, aunque tienes variables como MACRO_EXTENSION y tal, siempre tienes que definir la 's', mientras que con GoSub tú le dices a qué extension y prioridad quieres ir.

A nivel de memoria creo que es bastante mejor el Gosub que Macro.

Por otro lado, las variables de canal se mantienen al ejecutar el gosub mientras que con Macro, estas se quedan fuera.

:)
--
http://www.sinologic.net/

Saúl Ibarra

unread,
Jul 8, 2009, 7:31:29 AM7/8/09
to aster...@googlegroups.com
> Por otro lado, las variables de canal se mantienen al ejecutar el gosub
> mientras que con Macro, estas se quedan fuera.
>

Ein?! Dentro de una Macro tienes acceso a todas las variables de tu canal!

Realmente macro está implementado encima de GoSub, pero la nueva moda
es usar Gosub diréctamente y en algún momento Macro pasará a
'deprecated'...


--
Saúl -- "Nunca subestimes el ancho de banda de un camión lleno de disketes."
----------------------------------------------------------------
http://www.saghul.net/

Elio Rojano

unread,
Jul 8, 2009, 7:38:58 AM7/8/09
to aster...@googlegroups.com
El 8 de julio de 2009 13:31, Saúl Ibarra <sag...@gmail.com> escribió:

> Por otro lado, las variables de canal se mantienen al ejecutar el gosub
> mientras que con Macro, estas se quedan fuera.
>

Ein?! Dentro de una Macro tienes acceso a todas las variables de tu canal!

Cierto... recordaba que no era así hace algún tiempo y había que pasar las variables por parámetro para poder meterlas en la macro.

exten=>123,1,Set(VALOR="1234")
exten=>123,2,Macro(calculavalor)
exten=>123,3,GoSub(gosub-calculavalor,s,1)
exten=>123,4,NoOp(Fin)

[macro-calculavalor]
exten=>s,1,NoOp(VALOR ES: ${VALOR})

[gosub-calculavalor]
exten=>s,1,NoOp(VALOR ES: ${VALOR})
exten=>s,2,Return()


-- Executing [123@outgoing:1] Set("OSS/dsp", "VALOR="1234"") in new stack
-- Executing [123@outgoing:2] Macro("OSS/dsp", "calculavalor") in new stack
-- Executing [s@macro-calculavalor:1] NoOp("OSS/dsp", "VALOR ES: 1234") in new stack
-- Executing [123@outgoing:3] Gosub("OSS/dsp", "gosub-calculavalor|s|1") in new stack
-- Executing [s@gosub-calculavalor:1] NoOp("OSS/dsp", "VALOR ES: 1234") in new stack
-- Executing [s@gosub-calculavalor:2] Return("OSS/dsp", "") in new stack
-- Executing [123@outgoing:4] NoOp("OSS/dsp", "Fin") in new stack




Realmente macro está implementado encima de GoSub, pero la nueva moda
es usar Gosub diréctamente y en algún momento Macro pasará a
'deprecated'...


--
Saúl -- "Nunca subestimes el ancho de banda de un camión lleno de disketes."
----------------------------------------------------------------
http://www.saghul.net/





--
http://www.sinologic.net/

Gonzalo

unread,
Jul 8, 2009, 10:59:48 AM7/8/09
to asterisk-es
Es cierto, yo también le pasaba las variables. No sabía que ya las
heredaba de contexto desde donde era llamado (por lo menos antes no
era así).
Para lo único que si usaba Macro era para volver al contexto principal
a una priority diferente de la +1 con la variable $
{MACRO_OFFSET}...pero me he dado cuenta de que hasta eso da problemas,
ya que si en un futuro metes una línea nueva se te va todo al traste.
Y luego en un dialplan largo es un coñazo debuguearlo.
Para eso ahora lo que hago es devolver una variable y en el principal
hacer un branching para mandarlo a esa priority (difernte a la +1), si
procede...
En definitiva = Gosub
Reply all
Reply to author
Forward
0 new messages