guizans   09-05-2023, 23:21
#1
Hola.

¿Alguien usa las sentencias GOTO, GOSUB, ON GOTO y ON GOSUB? Entiendo el funcionamiento, o eso creo, pero no le veo ninguna ventaja,  en vez de usar funciones o métodos. ¿O es por mantener esas palabras del Basic original que tanto dolor de cabeza provocaron?

Un saludo.
tincho   10-05-2023, 00:39
#2
(09-05-2023, 23:21)guizans escribió: ¿Alguien usa las sentencias GOTO, GOSUB, ON GOTO y ON GOSUB?

yo no las uso nunca

1 Saludo.
Shordi   10-05-2023, 08:58
#3
Yo nunca las he usado, pero escarbando en el código fuente de Gambas a veces me las he encontrado por ahí. Por ejemplo en el código de Gridview... de hace algunas versiones. Creo que se actualizó y no sé si ahora mismo lo conserva, pero lo tenía.

Son un dolor de culo, que dicen los anglos, pero también son herramientas parte del lenguaje. Si hay quien los usa y le valen... pues bendito sea.


Saludos

Este el el resultado del comando "grep -R GO\ TO" en el raíz de los fuentes de gambas 3.18.2

gb.form.htmlview/src/gumbo/parser.c:// GOTOs in the spec to reasonably structured programming.
comp/src/gb.eval.highlight/sql/keywords:GOTO
comp/src/gb.web/.src/FileSessionManager.class:  'IF ReadValue() = 1 THEN GOTO _ABANDON
comp/src/gb.web/.hidden/Session_opt:  'IF ReadValue() = 1 THEN GOTO _ABANDON
app/src/gambas3-selftest/SearchList:GOTO
app/src/gambas3/.src/Editor/Form/FProperty.class~:  'IF NOT $hForm THEN RETURN 'GOTO _HIDE
app/src/gambas3/.src/Editor/Form/CControl.class:    '    GOTO _SUIVANT
app/src/gambas3/.src/Editor/Form/CControl.class~:    '    GOTO _SUIVANT
app/src/gambas3/.src/Editor/Form/FProperty.class:  'IF NOT $hForm THEN RETURN 'GOTO _HIDE
app/src/gambas3/.src/Editor/Code/FEditor.class:  '  GOTO RETURN_FUNCTION
app/src/gambas3/.src/Editor/Code/FEditor.class:      If aSymbols[iCpt - 1] == "GOTO" Or If aSymbols[iCpt - 1] == "GOSUB" Then
app/src/gambas3/.src/FMain.class:      If Key.Control Then GoSub GOTO_TOP
app/src/gambas3/.src/FMain.class:      If Key.Control Then GoSub GOTO_BOTTOM
app/src/gambas3/.src/FMain.class:GOTO_TOP:
app/src/gambas3/.src/FMain.class:GOTO_BOTTOM:
app/src/gambas3/.src/FMain.class~:      If Key.Control Then GoSub GOTO_TOP
app/src/gambas3/.src/FMain.class~:      If Key.Control Then GoSub GOTO_BOTTOM
app/src/gambas3/.src/FMain.class~:GOTO_TOP:
app/src/gambas3/.src/FMain.class~:GOTO_BOTTOM:
app/src/gambas3/.src/Util/MErrorMessage.moduleTonguerivate Const ERR_101 As String = ("Forbidden GOTO")
grep: app/src/gambas3/.gambas/MERRORMESSAGE: coincidencia en fichero binario
grep: app/src/gambas3/.gambas/FEDITOR: coincidencia en fichero binario
app/src/gambas3/.lang/ar.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/ca.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/ca.po:msgstr "GOTO prohibit"
grep: app/src/gambas3/.lang/zh_TW.mo: coincidencia en fichero binario
grep: app/src/gambas3/.lang/el.mo: coincidencia en fichero binario
grep: app/src/gambas3/.lang/ru.mo: coincidencia en fichero binario
app/src/gambas3/.lang/it.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/it.po:msgstr "Proibito GOTO"
app/src/gambas3/.lang/fr.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/fr.po:msgstr "GOTO interdit"
grep: app/src/gambas3/.lang/it.mo: coincidencia en fichero binario
app/src/gambas3/.lang/gl_ES.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/zh.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/zh.po:msgstr "禁止GOTO"
app/src/gambas3/.lang/id.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/hu.po:msgid "Forbidden GOTO"
grep: app/src/gambas3/.lang/nl.mo: coincidencia en fichero binario
app/src/gambas3/.lang/ru.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/ru.po:msgstr "GOTO запрещён"
app/src/gambas3/.lang/MErrorMessage.pot:msgid "Forbidden GOTO"
app/src/gambas3/.lang/sl.po:msgid "Forbidden GOTO"
grep: app/src/gambas3/.lang/ca.mo: coincidencia en fichero binario
grep: app/src/gambas3/.lang/sv.mo: coincidencia en fichero binario
app/src/gambas3/.lang/ko.po:msgid "Forbidden GOTO"
grep: app/src/gambas3/.lang/de.mo: coincidencia en fichero binario
app/src/gambas3/.lang/tr.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/es.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/es.po:msgstr "GOTO no permitido"
app/src/gambas3/.lang/hr.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/cs.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/cs.po:msgstr "Zakázané GOTO"
app/src/gambas3/.lang/el.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/el.po:msgstr "Απαγορευμένο GOTO"
app/src/gambas3/.lang/pt_BR.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/pt_BR.po:msgstr "GOTO proibido"
app/src/gambas3/.lang/pt.po:msgid "Forbidden GOTO"
grep: app/src/gambas3/.lang/es_ES.mo: coincidencia en fichero binario
app/src/gambas3/.lang/de.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/de.po:msgstr "Unzulässiges GOTO"
app/src/gambas3/.lang/sv.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/sv.po:msgstr "Förbjudet GOTO"
app/src/gambas3/.lang/lt.po:msgid "Forbidden GOTO"
grep: app/src/gambas3/.lang/es.mo: coincidencia en fichero binario
app/src/gambas3/.lang/.pot:msgid "Forbidden GOTO"
app/src/gambas3/.lang/nl.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/nl.po:msgstr "Verboden GOTO"
app/src/gambas3/.lang/cy.po:msgid "Forbidden GOTO"
grep: app/src/gambas3/.lang/fr.mo: coincidencia en fichero binario
grep: app/src/gambas3/.lang/cs.mo: coincidencia en fichero binario
grep: app/src/gambas3/.lang/pt_BR.mo: coincidencia en fichero binario
grep: app/src/gambas3/.lang/zh.mo: coincidencia en fichero binario
app/src/gambas3/.lang/pl.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/no.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/es_ES.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/es_ES.po:msgstr "GOTO no permitido"
app/src/gambas3/.lang/ro.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/zh_TW.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/zh_TW.po:msgstr "這裡不能使用 GOTO"
app/src/gambas3/.lang/ja.po:msgid "Forbidden GOTO"
app/src/gambas3/.lang/fa.po:msgid "Forbidden GOTO"
main/lib/jit/jit_body.c:        /* 1F ON              */  &&_ON_GOTO_GOSUB,
main/lib/jit/jit_body.c:_ON_GOTO_GOSUB:
main/lib/eval/eval_analyze.c:                else if (old_type == RT_RESERVED && (PATTERN_is(get_last_pattern(pattern), RS_GOTO) || PATTERN_is(get_last_pattern(pattern), RS_GOSUB)))
main/lib/eval/eval_read.c:    GOTO_BREAK,
main/lib/eval/eval_read.c:    GOTO_SPACE,
main/lib/eval/eval_read.c:    GOTO_NEWLINE,
main/lib/eval/eval_read.c:    GOTO_COMMENT,
main/lib/eval/eval_read.c:    GOTO_STRING,
main/lib/eval/eval_read.c:    GOTO_IDENT,
main/lib/eval/eval_read.c:    GOTO_QUOTED_IDENT,
main/lib/eval/eval_read.c:    GOTO_ERROR,
main/lib/eval/eval_read.c:    GOTO_SHARP,
main/lib/eval/eval_read.c:    GOTO_NUMBER,
main/lib/eval/eval_read.c:    GOTO_NUMBER_OR_OPERATOR,
main/lib/eval/eval_read.c:    GOTO_OPERATOR
main/lib/eval/eval_read.c:                first_car[i] = GOTO_BREAK;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_NEWLINE;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_SPACE;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_COMMENT;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_STRING;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_SHARP;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_IDENT;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_QUOTED_IDENT;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_NUMBER;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_ERROR;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_NUMBER_OR_OPERATOR;
main/lib/eval/eval_read.c:                first_car[i] = GOTO_OPERATOR;
main/share/gbc_trans_common.h:    TRANS_GOTO;
main/share/gb_reserved.h:        RS_GOTO,
main/share/gbc_read_temp.h:    else if (first_car[car] == GOTO_IDENT)
main/share/gb_type_common.h:  TK_LABEL       = 4,   /* GOTO label */
main/gbc/gbc_trans_ctrl.c:/*#define DEBUG_GOTO*/
main/gbc/gbc_trans_ctrl.cConfusedtatic TRANS_GOTO *goto_info;
main/gbc/gbc_trans_ctrl.c:    TRANS_GOTO *info;
main/gbc/gbc_trans_ctrl.c:    #ifdef DEBUG_GOTO
main/gbc/gbc_trans_ctrl.c:    else if (mode == RS_GOTO)
main/gbc/gbc_trans_ctrl.c:    // Resolve GOTOs
main/gbc/gbc_trans_ctrl.c:                        THROW("Forbidden GOTO");
main/gbc/gbc_trans_ctrl.c:                    #ifdef DEBUG_GOTO
main/gbc/gbc_trans_ctrl.c:    check_try("GOTO");
main/gbc/gbc_trans_ctrl.c:    add_goto(index, RS_GOTO);
main/gbc/gbc_trans_ctrl.c:    if (TRANS_is(RS_GOTO))
main/gbc/gbc_trans_ctrl.c:    check_try(gosub ? "ON GOSUB" : "ON GOTO");
main/gbc/gbc_trans_ctrl.c:    #ifdef DEBUG_GOTO
main/gbc/gbc_trans_code.c:        { RS_GOTO, TRANS_goto },
main/gbc/gbc_read.c:    GOTO_BREAK,
main/gbc/gbc_read.c:    GOTO_SPACE,
main/gbc/gbc_read.c:    GOTO_NEWLINE,
main/gbc/gbc_read.c:    GOTO_COMMENT,
main/gbc/gbc_read.c:    GOTO_STRING,
main/gbc/gbc_read.c:    GOTO_IDENT,
main/gbc/gbc_read.c:    GOTO_QUOTED_IDENT,
main/gbc/gbc_read.c:    GOTO_ERROR,
main/gbc/gbc_read.c:    GOTO_SHARP,
main/gbc/gbc_read.c:    GOTO_NUMBER,
main/gbc/gbc_read.c:    GOTO_NUMBER_OR_OPERATOR,
main/gbc/gbc_read.c:    GOTO_OPERATOR
main/gbc/gbc_read.c:                first_car[i] = GOTO_BREAK;
main/gbc/gbc_read.c:                first_car[i] = GOTO_NEWLINE;
main/gbc/gbc_read.c:                first_car[i] = GOTO_SPACE;
main/gbc/gbc_read.c:                first_car[i] = GOTO_COMMENT;
main/gbc/gbc_read.c:                first_car[i] = GOTO_STRING;
main/gbc/gbc_read.c:                first_car[i] = GOTO_SHARP;
main/gbc/gbc_read.c:                first_car[i] = GOTO_IDENT;
main/gbc/gbc_read.c:                first_car[i] = GOTO_QUOTED_IDENT;
main/gbc/gbc_read.c:                first_car[i] = GOTO_NUMBER;
main/gbc/gbc_read.c:                first_car[i] = GOTO_ERROR;
main/gbc/gbc_read.c:                first_car[i] = GOTO_NUMBER_OR_OPERATOR;
main/gbc/gbc_read.c:                first_car[i] = GOTO_OPERATOR;
main/gbx/gbx_exec_loop.c:        /* 1F ON              */  &&_ON_GOTO_GOSUB,
main/gbx/gbx_exec_loop.c:_ON_GOTO_GOSUB:
gb.poppler/src/c_pdf_document.cpp:        case POPPLER_ACTION_GOTO_DEST: type = "GotoDest"; break;
gb.poppler/src/c_pdf_document.cpp:        case POPPLER_ACTION_GOTO_REMOTE: type = "GotoRemote"; break;
gb.poppler/src/c_pdf_document.cpp:        case POPPLER_ACTION_GOTO_DEST: return action->goto_dest.dest;
gb.poppler/src/c_pdf_document.cpp:        case POPPLER_ACTION_GOTO_REMOTE: return action->goto_remote.dest;
gb.poppler/src/c_pdf_document.cpp:        case POPPLER_ACTION_GOTO_REMOTE: target = ACTION->goto_remote.file_name; break;


La mayoría de las coincidencias no son de código fuente de gambas, pero haberlas haylas.
O sea, que siguen vivitos y coleando...
Última modificación: 10-05-2023, 09:03 por Shordi.

No podemos regresar
Shell   10-05-2023, 21:51
#4
Goto creo que es soportado por gambas. Otra cosa es que lo usemos, en la actualidad, no creo que la usemos ninguno.

Go sub no tendría sentido ya que es una llamada a una "subrutina" (podemos llamarla procedimiento ),
finaliza el procedimiento y luego continúa en la linea siguiente donde se uso Go sub .

Digo que no tiene sentido hacerlo con Go Sub ya que lo hacemos directamente usando el nombre del procedimiento.

En su día se añadiría por compatibilidad, por recordar. Pero desde luego hoy veo un código de aquellos basic de los años 80
de micro ordenadores y no sé como se apañaban. ( Y eso que todos los hemos usado ). Gosub puede tener un pase, pero goto
es volverse loco. Recordemos que teníamos sentencias concretas para los comentarios y ahí describíamos lo que hacía,
con lo que el salto podía explicarse.

Saludos

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
guizans   10-05-2023, 22:17
#5
Yo recuerdo haber usado ON GOSUB ya que era muy útil en caso de tener un menú con varias opciones.Y si, GOTO era un auténtico suplicio como el código fuese un poco largo.
Shell   12-05-2023, 15:05
#6
(10-05-2023, 22:17)guizans escribió: Yo recuerdo haber usado ON GOSUB ya que era muy útil en caso de tener un menú con varias opciones

ON GOSUB era imitable con un juego de sentencias.

"El conocimiento es la mejor inversión que se puede hacer" - Abraham Lincoln
guizans   13-05-2023, 21:09
#7
(12-05-2023, 15:05)Shell escribió: ON GOSUB era imitable con un juego de sentencias.

Si, lo se. Pero usar ON GOSUB era muy cómodo y ocupaba poco espacio.
  
Usuarios navegando en este tema: 4 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.