elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Tutorial básico de Quickjs


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Explicación de estas líneas (Flash) y simplificar el código.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Explicación de estas líneas (Flash) y simplificar el código.  (Leído 1,239 veces)
Tachikomaia


Desconectado Desconectado

Mensajes: 1.382


Hackentifiko!


Ver Perfil
Explicación de estas líneas (Flash) y simplificar el código.
« en: 9 Junio 2024, 04:02 am »

Quiero llamar a una función variable de la raíz (level0) desde una película.

Si fuese una función fija sería: _level0.NombreDeLaFuncion();

Llamar a una función variable de la raíz, desde la raíz, creo que sería:
FuncionALlamar = "Funcion1";
eval(FuncionALlamar)();

Si fuese FuncionALlamar = "_level0.Funcion1";
quizá funcionaría desde una película, se me acaba de ocurrir, pero he estado probando cosas y nada funciona. ¿Cómo sería?
"_level0."+eval(_level0.FuncionALlamar)();
o
eval("_level0."+_level0.FuncionALlamar)();

No recuerdo qué cosas probé, la solución que puse funcionó (no me gustaba porque me parecía inconveniente extender innecesariamente el valor de la variable), pero estoy liado en cuanto a qué hacen esas líneas. eval usa texto y variables para indicar el nombre de una variable y si existe devuelve su valor, pero si luego hay un () entonces ese nombre es de una función a la cual llama. Hasta ahí entiendo ¿está bien, no? Pero con lo del _level0. me lié.

---------------------------------------------------------------------------------------------------------

Otra pregunta.

Tengo por ahí:
PosiblesSignos = ["==", "!=", "<=", ">=", "<", ">"];

Y uso esta función luego:
Código
  1. function ModificarP2() {
  2. if (P2Valor<6) {
  3. P2Valor++;
  4. P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)];
  5. } else {
  6. Continuar = "No";
  7. }
  8. }

La idea es que P2 cambie a "!=", luego a "<=", y así sucesivamente pero no funciona. Es que esto:
P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)];
lo hice basado en algo que me dijeron pero no entiendo qué hace. Obtiene la parte [a definir] del array llamado PosiblesSignos ¿no? Ahora creo que alcanza con decir:
P2 = PosiblesSignos[P2Valor];
Sí, ahora me funcionó. ¿Pero qué es esto:
P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)];
? Debo haber copiado mal  :xD

---------------------------------------------------------------------------------------------------------

Finalmente: ¿Es posible simplificar este código, cómo?
Código
  1. // Este programa genera una comparación simple y su evaluación, pero:
  2. // Debe haber alguna parte cuyo contenido no está definido.
  3. // Ejemplo: 1 < ... : true
  4. // Luego intenta asignar el contenido faltante,
  5. // pero por ahora sólo si falta sólo 1.
  6. // Las siguientes funciones se usan en Resolvedor1, etc:
  7. function Comparacion() {
  8. if (P2 == "==") {
  9. Resultado = P1 == P3;
  10. } else if (P2 == "!=") {
  11. Resultado = P1 != P3;
  12. } else if (P2 == "<=") {
  13. Resultado = P1 <= P3;
  14. } else if (P2 == ">=") {
  15. Resultado = P1 >= P3;
  16. } else if (P2 == "<") {
  17. Resultado = P1 < P3;
  18. } else {
  19. Resultado = P1 > P3;
  20. }
  21. return Resultado+"" == P4;
  22. }
  23. function ModificarP1() {
  24. if (P1<10) {
  25. P1++;
  26. } else {
  27. Continuar = "No";
  28. }
  29. }
  30. function ModificarP2() {
  31. if (P2Valor<6) {
  32. P2Valor++;
  33. P2 = PosiblesSignos[P2Valor];
  34. } else {
  35. Continuar = "No";
  36. }
  37. }
  38. function ModificarP3() {
  39. if (P3<10) {
  40. P3++;
  41. } else {
  42. Continuar = "No";
  43. }
  44. }
  45. function ModificarP4() {
  46. if (P4 == "true") {
  47. P4 = "false";
  48. } else {
  49. Continuar = "No";
  50. }
  51. }
  52. // Se repite en F2, cuando hay 1 contenido indefinido y es el 1:
  53. function Resolvedor1 () {
  54. trace("Se probará el Candidato "+eval("P"+Indefinido));
  55. if (Comparacion()) {
  56. trace ("Solución hallada, ver respuesta.");
  57. Mensaje = Mensaje+"\n"+P1+" "+P2+" "+P3+": "+P4;
  58. gotoAndStop (3);
  59. } else if (Continuar == "Sí") {
  60. // Se modificará el candidato:
  61. eval(ModificadoraUsar)();
  62. } else {
  63. trace ("No se pudo hallar una solución.");
  64. gotoAndStop (3);
  65. }
  66. }
  67. PosiblesTiposDeContenido = ["Normal", "Indefinido"];
  68. PosiblesSignos = ["==", "!=", "<=", ">=", "<", ">"];
  69. // Generar las 4 partes hasta que se cumpla la condición:
  70. do {
  71. Indefinidos = 0;
  72. // Parte 1 (cosa 1 a comparar):
  73. TipoDelParte1 = PosiblesTiposDeContenido[random(PosiblesTiposDeContenido.length)];
  74. if (TipoDelParte1 == "Normal") {
  75. Parte1 = random(10);
  76. } else {
  77. Parte1 = "...";
  78. Indefinidos++;
  79. Indefinido = 1;
  80. // set("Indefinido"+Indefinidos, 1);
  81. }
  82. // Parte 2 (símbolo comparador):
  83. TipoDelParte2 = PosiblesTiposDeContenido[random(PosiblesTiposDeContenido.length)];
  84. if (TipoDelParte2 == "Normal") {
  85. Parte2 = PosiblesSignos[random(6)];
  86. } else {
  87. Parte2 = "...";
  88. Indefinidos++;
  89. Indefinido = 2;
  90. // set("Indefinido"+Indefinidos, 2);
  91. }
  92. // Parte 3 (cosa 2 a comparar):
  93. TipoDelParte3 = PosiblesTiposDeContenido[random(PosiblesTiposDeContenido.length)];
  94. if (TipoDelParte3 == "Normal") {
  95. Parte3 = random(10);
  96. } else {
  97. Parte3 = "...";
  98. Indefinidos++;
  99. Indefinido = 3;
  100. // set("Indefinido"+Indefinidos, 3);
  101. }
  102. // Parte 4 (evaluación):
  103. TipoDelParte4 = PosiblesTiposDeContenido[random(PosiblesTiposDeContenido.length)];
  104. if (TipoDelParte4 == "Normal") {
  105. // Definir esta parte según las anteriores:
  106. // ¿Fueron definidas?
  107. if (Parte1 != "..." && Parte2 != "..." && Parte3 != "...") {
  108. // Sí, ver qué definición corresponde:
  109. if (Parte2 == "==") {
  110. Parte4 = Parte1 == Parte3;
  111. } else if (Parte2 == "!=") {
  112. Parte4 = Parte1 != Parte3;
  113. } else if (Parte2 == "<=") {
  114. Parte4 = Parte1 <= Parte3;
  115. } else if (Parte2 == ">=") {
  116. Parte4 = Parte1 >= Parte3;
  117. } else if (Parte2 == "<") {
  118. Parte4 = Parte1 < Parte3;
  119. } else {
  120. Parte4 = Parte1 > Parte3;
  121. }
  122. } else {
  123. // No toda parte fue definida,
  124. // definir esta al azar:
  125. Parte4 = random(2);
  126. if (Parte4 == 0) {
  127. Parte4 = "true";
  128. } else {
  129. Parte4 = "false";
  130. }
  131. }
  132. } else {
  133. Parte4 = "...";
  134. Indefinidos++;
  135. Indefinido = 4;
  136. // set("Indefinido"+Indefinidos, 4);
  137. }
  138. } while (Indefinidos == 0);
  139. Mensaje = Parte1+" "+Parte2+" "+Parte3+": "+Parte4;
  140. // Marca si algún canditato puede modificarse:
  141. Continuar = "Sí";
  142. // Decidir qué resolvedor usar y preparar variables:
  143. if (Indefinidos == 1) {
  144. P1 = Parte1;
  145. P2 = Parte2;
  146. P3 = Parte3;
  147. P4 = Parte4;
  148. // Asignar un valor al contenido indefinido:
  149. if (Indefinido == 1) {
  150. P1 = 0;
  151. } else if (Indefinido == 2) {
  152. P2Valor = 0;
  153. P2 = "==";
  154. } else if (Indefinido == 3) {
  155. P3 = 0;
  156. } else {
  157. P4 = "true";
  158. }
  159. ResolvedoraUsar = "_level0.Resolvedor"+Indefinidos;
  160. ModificadoraUsar = "ModificarP"+Indefinido;
  161. } else {
  162. Mensaje = Mensaje+"\nAún no hay resolvedor para esta duda.";
  163. stop();
  164. }

La idea es solucionar problemas así cada vez más complejos. Esto es sólo el comienzo...


« Última modificación: 9 Junio 2024, 04:09 am por Tachikomaia » En línea

EdePC
Moderador Global
***
Desconectado Desconectado

Mensajes: 2.156



Ver Perfil
Re: Explicación de estas líneas (Flash) y simplificar el código.
« Respuesta #1 en: 9 Junio 2024, 18:51 pm »

Quiero llamar a una función variable de la raíz (level0) desde una película.

Si fuese una función fija sería: _level0.NombreDeLaFuncion();

Llamar a una función variable de la raíz, desde la raíz, creo que sería:
FuncionALlamar = "Funcion1";
eval(FuncionALlamar)();

Si fuese FuncionALlamar = "_level0.Funcion1";
quizá funcionaría desde una película, se me acaba de ocurrir, pero he estado probando cosas y nada funciona. ¿Cómo sería?
"_level0."+eval(_level0.FuncionALlamar)();
o
eval("_level0."+_level0.FuncionALlamar)();

No recuerdo qué cosas probé, la solución que puse funcionó (no me gustaba porque me parecía inconveniente extender innecesariamente el valor de la variable), pero estoy liado en cuanto a qué hacen esas líneas. eval usa texto y variables para indicar el nombre de una variable y si existe devuelve su valor, pero si luego hay un () entonces ese nombre es de una función a la cual llama. Hasta ahí entiendo ¿está bien, no? Pero con lo del _level0. me lié

Es tal cual como dices al final, no veo porque tienes problemas si tienes bien entendida la teoría, eval evalúa lo que le des y devuelve una referencia a ese objeto (variable, objeto o función), las rutas absolutas de los objetos los ves al probar la Película, vi que ya sabes ir a Depurar > Mostrar variables, ahí aparece la ruta absoluta de las variables, funciones, objetos. Deberías encotrar: Variable _level0.FuncionALlamar = [function]. pues eso le entregas a eval de cualquier manera que lo pueda evaluar:

Código
  1. eval("_level0." + "FuncionALlamar")();
  2.  
  3. eval("_level0." + "Funcion" + "ALlamar")();
  4.  
  5. var f = "FuncionAL";
  6. eval("_level0." + f + "lamar")();

- En todos los casos a eval le estás entregando: "_level0.FuncionALlamar"


Citar
Otra pregunta.

Tengo por ahí:
PosiblesSignos = ["==", "!=", "<=", ">=", "<", ">"];

Y uso esta función luego:

Código
  1. function ModificarP2() {
  2. if (P2Valor<6) {
  3. P2Valor++;
  4. P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)];
  5. } else {
  6. Continuar = "No";
  7. }
  8. }

La idea es que P2 cambie a "!=", luego a "<=", y así sucesivamente pero no funciona. Es que esto:
P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)];
lo hice basado en algo que me dijeron pero no entiendo qué hace. Obtiene la parte [a definir] del array llamado PosiblesSignos ¿no? Ahora creo que alcanza con decir:
P2 = PosiblesSignos[P2Valor];
Sí, ahora me funcionó. ¿Pero qué es esto:
P2 = PosiblesSignos[P2Valor(PosiblesSignos.length)];
? Debo haber copiado mal  :xD

Pues sí, quizá eso es la parte para evitar poner el valor fijo 6, con P2 = PosiblesSignos[P2Valor]; debería bastar, para no tener 6 fijo:

Código
  1. PosiblesSignos = ["==", "!=", "<=", ">=", "<", ">"];
  2. P2Valor = 1;
  3. P2 = PosiblesSignos[P2Valor];
  4.  
  5. trace(P2);
  6. ModificarP2();
  7. trace(P2);
  8.  
  9. function ModificarP2() {
  10.  if (P2Valor < PosiblesSignos.length) {
  11.    P2Valor++;
  12.    P2 = PosiblesSignos[P2Valor];
  13.  } else {
  14.    Continuar = "No";
  15.  }
  16. }


En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Que hace estas lineas de codigo (solo 2)
Scripting
Darksythe 1 2,343 Último mensaje 3 Julio 2012, 19:42 pm
por overxfl0w13
Simplificar codigo « 1 2 »
.NET (C#, VB.NET, ASP)
matiasramos 10 5,880 Último mensaje 24 Junio 2013, 21:09 pm
por Novlucker
¿Se puede simplificar el código del Checkbutton en tkinter? [SOLUCIONADO] :)
Scripting
Yidu 2 3,631 Último mensaje 10 Julio 2017, 19:03 pm
por Yidu
Como ejecuto estas lineas en mi PC.
Scripting
Buda21 7 3,289 Último mensaje 4 Febrero 2019, 04:18 am
por EdePC
(Borrar) ¿Por qué estas 4 líneas dan resultados tan distintos?
Programación General
Tachikomaia 0 2,303 Último mensaje 29 Mayo 2020, 00:23 am
por Tachikomaia
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines