« first day (2220 days earlier)      last day (50 days later) » 

12:25 AM
@abulafia nvidia a sacado GauGan 2
@CandidMoe Mira:
operators = {
    "=":"IGUAL",
    "+":"MAS",
    "-":"MENOS",
    "*":"POR",
    "**":"POW",
    "^":"POW",
    "/":"DIV_F",
    "//":"DIV_I",
    ";":"END"
}

def catalog(value:str):
    value = value.strip().replace("'",'"')
    if value[0] == '"' and value[-1] == '"':
        return "STRING"
    elif value[0].isalpha() and value.isalnum():
        return "IDENTIFICADOR"
    elif value.isnumeric():
        return "NUMERO"
    elif value in operators:
        return operators[value]

def my_tokenizer(stream):
 
12:38 AM
@Christian Un analizador de sintaxis, se ve bien.
 
@ArtEze pues sí, aunque toda la función my_tokenizer me la robé de Candid >_<
claro que le hice pequeñas modificaciones
pero... ahora no sé que hacer
 
@Christian Habrá que esperar.
Hacer un lenguaje de programación es complicado, pero más fácil si se hace con regex.
 
@ArtEze de hecho ya lo hice con regex, pero CandidMoe y abulafia insistieron que era mejor aprender a hacerlo a mano limpia
y aquí me tienes, intentando hacer un Lexer y un tokenizer
 
@Christian Sin regex tiene la ventaja de ser más eficiente, ya que RegEx es lento.
 
@ArtEze eso es verdad, pero tampoco le di mucha importancia, ya que trato de hacer un pseudocódigo ejecutable, un python en español
 
12:53 AM
@Christian Ahora mismo no tengo instalado Python, ¿Pero se quiere hacer exacto o algo parecido?
 
@ArtEze algo parecido, quiere hacer un pseudocódigo que use la linda sintaxis de python
ahora mismo estoy buscando el notebook que hice con expresiones regulares para que lo puedas probar, dame un momento
 
Es que no tengo Python, si fuera así lo probaría.
 
@ArtEze es un cuaderno de google colab, lo único que necesitas es tener un dispositivo e internet
 
@Christian Genial, entonces sí.
 
ya lo encontré pero me aparece un error de función no definida >_<, lo malo de crear un lenguaje es que no sabes donde está el error
 
1:00 AM
@Christian Es verdad, me pasó lo mismo tratando de crear un bash en javascript.
 
gracias por darme la idea de mi prox proyecto ^_^
 
@Christian Eso estaría bueno :D
 
@ArtEze el error era por una expresión regular -_-
no me detectaba la definición de funciones si recibían más de 1 parámetro
 
@Christian Pienso que es fácil solucionarlo.
 
sí, ya lo solucioné, ahora te lo paso
 
1:07 AM
Bueno.
 
las 3 últimas celdas puedes ignorarlas
2 celdas más arriba de esas hay un with open() dentro de eso puedes escribir lo que sea
 
@Christian No pude verlo, tuve un problema con el navegador.
 
@ArtEze :c
cual?
 
Timestamp: 11/27/2021 01:08:15 AM
Error: Content Security Policy: The page’s settings blocked the loading of a resource at data:application/javascript;base64,KGZ1bmN0aW9uKCkgewoJLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vYW5hbHl0aWNzL2Rldmd1aWRlcy9jb2xsZWN0aW9uL2FuYWx5dGljc2pzLwoJY29uc3Qgbm9vcGZuID0gZnVuY3Rpb24oKSB7Cgl9OwoJY29uc3Qgbm9vcG51bGxmbiA9IGZ1bmN0aW9uKCkgewoJCXJldHVybiBudWxsOwoJfTsKCS8vCgljb25zdCBUcmFja2VyID0gZnVuY3Rpb24oKSB7Cgl9OwoJY29uc3QgcCA9IFRyYWNrZXIucHJvdG90eXBlOwoJcC5nZXQgPSBub29wZm47CglwLnNldCA9IG5vb3BmbjsKCXAuc2VuZCA9IG5vb3BmbjsKCS8vCgljb25zdCB3ID0gd2luZG93OwoJY29uc3QgZ2F
Timestamp: 11/27/2021 01:08:15 AM
Error: TypeError: c.classList.values is not a function
Source File: colab.research.google.com/v2/external/…
Line: 1930
 
Mmm.... bastante raro
 
1:11 AM
@Christian Sí, quizás funcione en algún otro emulador de python, el de Google no me funciona.
 
espera lo paso a repl it
 
Ah, acabo de notar algo, creo que lo bloqueaba el uBlock.
 
._.
 
@Christian Con el uBlock desactivado tampoco me funciona.
 
1:14 AM
F
 
espera crep el replit
 
ok
 
debes de modificar la creación del archivo de texto, está por la línea 177
no se permiten diccionarios, sets o tuplas
y aún me falta implementar la forma de acceder a arrays
 
@Christian No pude, necesita registración, toco el botón de registrarme y no pasa nada.
 
Hu
 
1:23 AM
Podría ser con otro.
 
no conozco otro :c
ultima opción, te paso el código y lo ejecutas en un compilador online
 
@Christian Está bien.
 
@ArtEze este es:
import re
from os import getcwd
from ast import literal_eval

 #funciones con o sin argumentos
check_functions = re.compile(r"func\s+([a-zA-Z_][a-zA-Z_0-9]+)\s?\(.+\):\s?")

#functions
def my_print(*args, dict_vars):
    for n in args:
        try:
            n = literal_eval(n)
        except:
            n = dict_vars[n.strip()]
        print(n)

def operar(*sentence, dict_vars):
    if len(sentence)>1:
        return [eval(x.strip(), dict_vars) for x in sentence]
    return eval(sentence[0], dict_vars)
 
@Christian Ahí voy.
@Christian Funciona bien.
 
^_^
 
1:30 AM
El resultado fue esto:
hola mundo
[1, 'b', 'holas']
calc
en funcion
[[1], [2]]
30
 
falta que pongas el input
 
2*3
2*3
1
2
3
x
1
2
3
x
1
@Christian Me salió así.
 
@ArtEze yess
puedes cambiar cosas e ir probando
 
2**3
2**3
1
2
3
x
1
2
3
x
1
@Christian ¿Este está bien?
 
@ArtEze depende de lo que hayas cambiado
 
1:36 AM
@Christian Solo puse dos asteriscos en vez de uno.
 
se supone que es pseudocódigo, así que debes de entender lo que escribies y ver si es lo que realmente esperas
@ArtEze recuerda que es un input y la entrada la recibe y devuelve como texto
es un input() normal de python
 
@Christian Entiendo... La otra vez usé onlinegdb y probé algo en C y bash, pero tiene un límite de 100 kb por código, no se puede hacer cosas demasiado complejas.
 
tampoco digo que te armes una IA a base de pseudocódigo
 
@Christian Mejor cosas simples.
 
pues sí, mi objetivo es ayudar a quienes inician en la programación para que tengan un acercamiento a un código real y puedan experimentar con un "pseudoPython"
 
1:44 AM
@Christian Podría servirme eso en el futuro, se podría hacer que vaya registrando cómo cambia una variable en todo el código.
 
podría implementar una función track("my_var") e ir imprimiendo cuando la variable se modifica
buena idea :D
también quería implementar un mix de python, es decir poder combinar pseudocódigo con python
y que puedas escribir mitad pseudoPython y otra mitad python
 
@Christian Estaría genial.
Yo esa vez quise meter un ejecutable de 5 MB, pero como solo soportaba 100 kb, no pude.
 
Aún no sé como llamarlo al nuevo lenguaje
@ArtEze F
por eso me gusta más Colab
Hasta puedes entrenar una IA y ejecutarla
una IA generadora de imágenes a través de un input
 
hola ya que ustedes son maestros de javascript
necesito su ayuda porfavor
 
@userStack Diga.
 
1:53 AM
tengo esta function
 
@userStack yo a las justas sé algo de python
 
const applyT=()=>{try {
       await unpause()
  } catch (error) {
    console.log('error33344', error.message)
     throw Error(error.message)
  }
ven que estoy agarrando el error con throw
 
@userStack existe un boton llamado fixed font que formatea el código :D
@userStack throw genera un error
 
y lo estoy usando asi
try{
          applyT()
        }catch(error){
          console.log('ERRRRRRROR', error)
        }
aqui si veo el error console.log('error33344', error.message)
pero aqui no llega console.log('ERRRRRRROR', error)
}
 
@userStack Con el código completo creo que se entendería mejor.
 
1:58 AM
Eee... no entendí muy bien la estructura de tu try/catch
 
ya funciona
todo bien probe en otro button
 
Al parecer somos magos!!
 
Sí, es magia.
En lo personal no me gusta nada el throw.
Prefiero console.error
 
@ArtEze yo lo veo en todas partes donde copio y pego un try/catch
siempre me olvido como se escribe y me es más fácil ctrl+c y ctrl+v
 
@Christian Yo igual, veo que aparece mucho.
 
2:05 AM
ayuda otros lo usaen en lugar de if else
 
@userStack Se puede usar las dos cosas, y un if dentro de un try catch,
El try es para intentar, en caso de error, se hace el catch... En el if, si sale error, creo que no se ejecuta el else.
Yo lo uso para declarar variables inexistentes.
 
@Legna tienes el nombre muy parecido al personaje de un anime "Lena" de eigthy six
 
@Christian :P
Me gusta el drama... xP
 
@Legna ves anime o ya te leíste el resumen?
 
@Christian solía ver, muchas decepciones me quitaron el gusto :'s, muchos malos animes, muy pocos buenos
y falta de tiempo XD
y si, ahora me leo el fandom y ya... :|
 
2:21 AM
depende de que tan exigente seas
he visto varios animes buenos ultimamente
 
@Christian en general, los finales. Tienen buen desarrollo (narrativa) pero los cierres te dejan incompleto... como si algo te faltara en la vida...
 
nada que criticar al autor o estudio de animación no arregle
sino preguntale al autor de goutubun no hanayome, que sacó un final distinto para cada chica y así tuvo al fandom contento
 
@Christian creo que eso me causaría más conflicto, entonces si, es exigencia, jajaja.
tengen toppa gurren lagann es uno de los pocos que volvería a ver. Los personajes me parecieron muy bien desarrollados.
 
@Legna aún no lo veo, pero si una persona tan exigente como tu lo menciona pues habrá que verlo
últimamente no he tenido mucho tiempo y de los 4 animes en emisión que estaba viendo, solo continúo con uno "platinum end"
 
2:39 AM
@Christian Me he dado cuenta que es importante que entren al cuerpo cosas buenas. Buenos sentimientos, buen arte ,buena música y sobre todo buenas ganas de seguir. Si algo tiene el aníme es que te mueve mucho las emociones (en mi opinión). La música es genial. No paro de escuchar los soundtracks de cowboy bebop. Pero tambien escuche mucha basura y vi demasiada sangre. Generalmente terminaba o asqueado o con un sentimiento terrible.
Así que preferí ser más exigente con lo que veo. Abandone el fan service. Creo que es solo una manera de relleno económico. Lo mismo ahora con las pelis que veo.
Cuesta, pero vale la pena. Te desvelas con un buen anime, pero también te deja algo bueno para la vida.
 
opino lo mismo, no me gusta los animes harem, ni el fan service. Prefiero animes con algo de buen humo, trama interesante y no repetitiva
No me gusta mucho el romance por el fan service o por que meten muchas cosas sexuales, pero uno que me encantó fue "Horimiya"
 
3:00 AM
@Christian Bueno, me retiro, por que ya es mi hora. Un gusto platicar contigo.
 
@Legna igualmente. Hasta luego :D
 
 
3 hours later…
6:12 AM
0
Q: ¿Es correcto votar las publicaciones de mi usuario borrado?

ArtEze¿Qué puedo decir? Las preguntas que hice anteriormente, algunas me gustan y parecen buenas respuestas, y otras no tanto. ¿Es correcto votarlas las preguntas de mi antiguo usuario eliminado con el usuario nuevo? ¿y a las del Sockpuppet eliminado? Que tampoco me parecen malas respuestas. Dejo el pl...

 
 
9 hours later…
2:45 PM
@christian te recomiendo Kimi ni todoke, ese es un buen anime de romance. Y que yo recuerde no hay fanservice.
 
@MauricioContreras ¿Qué te parece esa pregunta de Meta?
 
Parece que la voy a ver. ¿Es pariente de Meru?
 
No recuerdo! Lo vi hace años! Que lo disfrutes!!!
 
3:43 PM
@DanteS. me suena
creo que también la veré :D
@CandidMoe que hago después de tokenizar todo?
 
Holaaa!!!!!
 
hello!
 
@Christian Haces un parser recursivo descendente. Muestrame un pgma en tu lenguaje.
 
@CandidMoe hice esto:
operators = {
    "=":"IGUAL",
    "+":"MAS",
    "-":"MENOS",
    "*":"POR",
    "**":"POW",
    "^":"POW",
    "/":"DIV_F",
    "//":"DIV_I",
    ";":"END"
}
def catalog(value:str):
    value = value.strip().replace("'",'"')
    if value[0] == '"' and value[-1] == '"':
        return "STRING"
    elif value[0].isalpha() and value.isalnum():
        return "IDENTIFICADOR" if value != "func" else "FUNCTION"
    elif value.isnumeric():
        return "NUMERO"
    elif value in operators:
        return operators[value]
 
4:00 PM
OK. Ya vi tu ejemplo. Esperame un rato.
 
ok
 
4:18 PM
Miremos la línea

`a = imprimir('que hay', 9)+qso`

separado en tokens queda convertida en una lista

`['a', '=', 'imprimir', '(', '"que hay"', ',', '9', ')','+','qso']`

Por simplicidad sólo mostrados el contenido textual, pero también sabemos que es cada cosa gracias a la función `catalog()`.

El parser toma el primer token disponible y lo examina. En este caso, es un IDENTIFICADOR. Esto le dice al parser que viene una asignación (el lenguaje no deja alternativa), por lo que decide llamar a la función `asignacion()`, que se encargará de procesar el resto.
 
osea por cada token se debe llamar a expresión(generador)??
 
4:34 PM
Este sería tu ciclo principal:
pgma = ['abs = "hola mundo";', "a = imprimir('que hay', 9)+' qso';", "func test(a,b):"]
sec = my_tokenizer(pgma)
# sec
while True:
    tipo, texto = next(sec)
    if tipo == 'IDENTIFICADOR':
        tipo, texto = asignacion(texto, sec)
    elif texto == 'END':
        break
Esta sería la función asignación
def asignacion(texto, sec):
    nombre = texto
    tipo, texto = next(sec)
    if texto == '=':
        tipo, texto, valor = expresion(sec)
        variables[nombre] = valor

    return tipo, texto
Todas las funciones deben retornar el último token que leyeron y no procesaron (no era parte de su instrucción).
O mejor, puedes usar una clase que te permite devolver tokens al stream de entrada. Queda mucho más limpio.
 
primero espérate, que tengo que modificar la función my_tokenizer por que según yo era mejor devolver toda la línea tokenizada
y no caracter por caracter
@CandidMoe el último token sería el ;, no?
 
@Christian token por token, no caracter por caracter. Lo ideal es tener una clase que tenga get_token() y unget_token(). Puedes pedir tokens y luego devolverlos si no sirven. Eso te permite explorar interpretaciones alternativas de un mismo fuente: si una función falla en reconocer, puedes intentar con otras desde el mismo punto en el fuente.
@Christian Si, se me escapo.
 
4:54 PM
@CandidMoe sigo sin entender bien eso
 
5:10 PM
No se puede volver a declarar la variable "password" en el bloque. Ese es el error
que me ha surgido
estoy leyendo sobre el error y dice esto.
@La causa es que intentó declarar esta variable en particular en el alcance global, y aquí ....ya está definido por alguna razón técnica,
 
@GimenaPasten lenguaje? y el código?
 
import {Arg, InputType, Mutation, Resolver, Field } from "type-graphql";
import{getRepository, Repository } from "typeorm";
import { User } from "../entity/user.entity";
import { IsEmail, Length } from "class-validator";
import { hash } from "bcrypt";

@InputType()
class UserInput{

@Field()
@Length(3,64)
fullName!:String

@Field()
@IsEmail()
email!:String

@Field()
@Length(8,254)
password!:String

}

@Resolver()
export class AuthResolver{
userRepository: Repository<User>;
constructor(){
this.userRepository = getRepository(User);
 
existe un boton llamado fixed font que formatea el código :D
 
@Christian Intenta implementar el parsing de "a = 1". Escribe una función "expresion()" que reconozca un simple entero y lo devueva.
Trabaja con eso.
 
eso estaba haciendo
pero como reconozco una suma? 1+2 si el 1 ya fue procesado antes de reconocer el operador??
debo implementar cada operador? es decir, escribir una función de suma, otra de resta y así??
 
5:17 PM
me sale en visual code como const password:String
como sugerencia
 
ni idea de typescript :(
 
voy a seguir leyendo
a ver si lo encuentro
encontre ese archivo
que puede resolver mi problema
pero no se como aplicarlo
 
@Christian Arregla tu my_tokenizer para que devuelva en cada next() la clasificación y el texto encontrado. Con eso funcionando te muestro como se hace
 
ya lo había arreglado :D
def my_tokenizer(stream):
    for line in stream:
        linea = line.strip()
        largo = len(linea)
        i = 0
        while True and i < largo:
            inicio = i
            if linea[i] == "(":
                while not linea[i] == ")" and i<largo:
                    i+=1
                yield ("ARGS",linea[inicio+1:i])
                i+=1
                continue
            elif linea[i] in [","]+list(operators.keys()):
                i += 1
            elif linea[i] == "'" or linea[i] == '"':
había hecho esta función expresion
def expresion(generador):
    tipo, token = next(generador)
    val = None
    while tipo != "END":
        if tipo == "IDENTIFICADOR":
            if token in variables:
                val = catalog(variables[token])
            elif tipo in operators.values():
                pass
            else:
                tipo, texto = next(generador)
                if tipo == "ARGS":
                    val = call_function(token, texto)
        else:
            val=(tipo,token)
        tipo,token = next(generador)
se supone que esto es correcto: {'a': ('STRING', "' qso'"), 'abs': ('STRING', '"hola mundo"')}???
 
5:39 PM
@Christian expresion() es llamado para evaluar una expresión. Tan pronto encuentra algo que no es una expresión, retorna.
 
una expresión podría ser ....??
 
Limitemos a expresiones aritméticas simples (a + b). Entonces, cada cosa que lee expresion es: un entero, un operador (+-*/) o un identificador.
Si es un entero, lo evalua. Si es un identificador, saca su valor del diccionario de variables.
 
Aaa.... ahora tiene más sentido
 
@GimenaPasten Esta línea está mal: const hashedPassword = await hash{password, 10};
tienes que usar paréntesis para llamar a una función, no llaves
 
A estas alturas notas lo siguientes: 1) Es conveniente tener una clase Token que contenga la clasificación, el texto y cualquier otro dato del caso. 2) Un par de funciones get_token, unget_token para poder leer y devolver sin drama (y evitar tener que retornar tipo, texto.
 
5:45 PM
Voy a seguir con la diversión ;)
@CandidMoe algo así?
def expresion(generador):
    tipo, token = next(generador)
    val = None
    while tipo != "END":
        if tipo == "IDENTIFICADOR":
            val = variables[token]
        elif tipo in ["STRING","NUMERO"]:
            val= token
        else:
            break
        tipo,token = next(generador)
    return val
 
Bien. Falta evaluar los operadores '+', '-' ... Haz el caso simple, sin precedencia ni paréntesis.
 
me dan ganas de usar eval
 
@Christian Tienes que aprender a evaluar expresiones.
Al menos tienes que aprender a reconocerlas.
Voy a escribir un lenguaje simple. En un rato te aviso.
 
ok, gracias
 
@PabloLozano gracias ya lo cambie
 
6:32 PM
@Christian Aqui te adjunto un pequeño interprete. Reconoce expresiones y asignaciones de enteros. Todo se separa con espacios (para simplificar el parser). Estudialo.
variables = {}


class Token:
    OPERADOR = 1
    ENTERO = 2
    IDENTIFICADOR = 3
    ASIGNACION = 4

    def __init__(self, texto):
        self.texto = texto
        if texto in '+-*/':
            self.tipo = Token.OPERADOR
        elif texto.isnumeric():
            self.tipo = Token.ENTERO
        elif texto == "=":
            self.tipo = Token.ASIGNACION
        else:
            self.tipo = Token.IDENTIFICADOR

    def __int__(self):
        if self.tipo == Token.ENTERO:
            return int(self.texto)
Luego de evaluar el pgma, termina listado las variables.
 
7:09 PM
Esto hecho a la rápida.
 
esto solo clasifica al token, verdad?
 
El código que te pase es un interprete completo. Interpreta el código en pgma y en el diccionario variables queda el resultado de la ejecución. Miralo y agrega código para manejar una instrucción print nombre_variable y print "cadena"
Recuerda que solo reconoce expresiones simples, tipo OP1 OPERADOR OP2.
 
ahora del almuerzo, en un rato lo pruebo
 
 
1 hour later…
8:28 PM
disculpen
pero alguien sabe cuando sale este error
"el valor null para la columna «fullName» viola la restricción not null",
estoy en el playground y me sale ese error
los input de InputUser me salen vacios
cuando cargos los datos en el playground no lo toma y me salta ese error
 
8:40 PM
buenas
alguna herramienta para generar degradados a partir de un color hex en especifico?
algo asi
 

« first day (2220 days earlier)      last day (50 days later) »