GOTO y GOSUB - Versión para impresión +- Comunidad Gambas-es (https://gambas-es.org) +-- Foro: Gambas (https://gambas-es.org/forum-3.html) +--- Foro: General (https://gambas-es.org/forum-4.html) +--- Tema: GOTO y GOSUB (/thread-1356.html) |
GOTO y GOSUB - guizans - 09-05-2023 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. RE: GOTO y GOSUB - tincho - 10-05-2023 (09-05-2023, 23:21)guizans escribió: ¿Alguien usa las sentencias GOTO, GOSUB, ON GOTO y ON GOSUB? yo no las uso nunca RE: GOTO y GOSUB - Shordi - 10-05-2023 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.modulerivate 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.ctatic 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... RE: GOTO y GOSUB - Shell - 10-05-2023 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 RE: GOTO y GOSUB - guizans - 10-05-2023 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. RE: GOTO y GOSUB - Shell - 12-05-2023 (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. RE: GOTO y GOSUB - guizans - 13-05-2023 (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. |