« first day (2601 days earlier)      last day (803 days later) » 

02:07
@DanielBriceño no lo creo. Supongo que tiene que ver con la fuente
 
5 hours later…
07:07
A las güenas :-)
Asco de martes :-(
07:38
gud morning
07:51
buenas
 
4 hours later…
11:59
jelou
 
1 hour later…
13:10
Como vienen esas predicciones mundialistas?
13:51
Hola! ¿Puedo hacer una pregunta sobre C# aca?
@Trauma ¿Por? ¿Porque es día de mala suerte?
Bueno, hago la pregunta de todos modos.
@PedroUrday En general, todos los días laborables son un asco :-(
En Javascript existe el método "filter" para arrays. ¿Existe algo parecido en C#?
14:06
103
A: filter an array in C#

Justin NiessnerIf you're using C# 3.0 or better... using System.Linq; public Car[] Filter(Car[] input) { return input.Where(c => c.IsAvailable).ToArray(); } And if you don't have access to LINQ (you're using an older version of .NET)... public Car[] Filter(Car[] input) { List<Car> availableCars = n...

Ok, gracias!
@PedroUrday Where como bien dice trauma
te vale para arrays, listas..cualquier IEnumerable
14:41
Hay un usuario que hizo algunas modificaciones innecesarias en mis publicaciones. Por si quieren tenerlo en cuenta.
Es más grave de lo que creí
Tiene una obsesión con la palabra ARRAY
Pueden ver qué sus últimas ediciones son cambiando la palabra arreglo por ARRAY
malísimo
También he tenido sugerencias de ediciones de varios usuarios (-2k rep) en mis respuestas que editan la palabra "arreglo" por "array" y la verdad no entiendo porque...
y lo peor es que dice ARRAY y no array, no me gusta en lo personal :p
15:00
@Mateo Es muy raro. Solo cambia esa palabra y de forma sistemática tanto en el texto como en el código. Francamente parece un experimento de bot que se ha descontrolado
@Cris223511.dev exactamente eso hace este usuario. Solo que como tiene +2k debe tener el privilegio de edición y ni pasa por cola. Sino no creo que lo hayan votado.
@abulafia por eso sugerí que tiene un TOC jaja
Aparentemente las modificaciones son las 9 de hace 7 horas.
Cachislamar, parece que ChatGPT está petando... Justo le estaba haciendo una pregunta muy larga sobre un aspecto oscuro de tipado en Python y las respuestas que me da tienen buena pinta, e incluyen código que querría probar, pero cuando lleva un rato largo escribiendo de pronto dice "Network error" y lo borra todo antes de que me haya dado tiempo a leerlo/asimilarlo
De hecho sigue. De vez en cuando hace alguna pregunta o respuesta pero está obsesionado con la palabra ARRAY. Es como los que quieren imponer lenguaje inclusivo
@abulafia no sé por qué pero a veces empieza a escribir y de la nada deja de hacerlo y la respuesta queda inconclusa.
@Mateo lo más curioso son las mayúsculas. Incluso los nombres de variables arreglo los cambia por ARRAY, contraviniendo posiblemente las normas de estilo del lenguaje, pues las mayúsculas suelen reservarse para constantes. Es ese detalle el que me hace pensar que se trata de un bot
@Mateo Sí, pero en ese caso basta escribirle "continúa" y sigue. Lo que pasa ahora es ya un fallo técnico de capacidad probablemente. No solo se interrumpe, sino que borra todo lo que había escrito y lo reemplaza por un "Network error" en letras rojas
15:16
@abulafia bien podría haber copiado la pregunta a un editor de texto y reemplazar todas las ocurrencias.
@Mateo También, pero es un comportamiento un tanto inhumano :-)
XDDD
yo no soy partidario de usar hispanismos en el codigo
pero eso de editar arreglo por ARRAY en cada uno de los lugares que lo observa es como dice @Mateo TOC puro
@NicolasOñate para mí se siente raro intentar expresar en español nombres en inglés. Por ejemplo con los operadores de C# "null forgiving" o "null coalescing"
@Mateo vaya cruzada que tiene, me he puesto a mirar y hasta la 5 pagina es todo cambiar arreglo por array
@Mateo me refiero mas a la sintaxis que a la teoria
por ejemplo: private bool EsNulo(){ return true }, todo esta en ingles menos el nombre de la funcion
es a eso a lo que me refiero
15:37
@NicolasOñate Y aún queda más raro en ese tipo de funciones "condición", pues lo normal será que luego las uses como parte de un if o un while, donde suena mucho más natural si su nombre está inglés: if not isNull(x) en vez de if not EsNulo(x)
15:52
@abulafia justo, es por eso que no estoy muy de acuerdo en el uso de arreglo, pero, tanto como para iniciar una cruzada... alguna vez he editado una pregunta y ya de paso he cambiado un arreglo por array
16:08
@NicolasOñate nomenclatura entonces. Estoy acostumbrado a escribir los nombres en inglés
16:23
@Trauma:
Interprete golfScript 0.1 - Dic/2022 - Candid Moe
Esta versión acepta el código en golfscript.com/golfscript/builtin.html
Operadores:  [+, ;, -, *, /, ?, ), (, ~, ., $, \, @, %, !, `, >, ^, &]
>{.}{*}+:square;2 square
[4]
>2 {2*} 5*
[4 64]
>
@CandidMoe ¡¡ Tooooooooomaaaaaaa Yaaaaaaaaaa !!
Has terminado el primero :-)
@Trauma Es solo la 0.1. Todavía falta.
Una pregunta ... ¿ las cadenas, como lo has hecho ?
No se si tokenizarlas en una función genérica, o ponerle código al símbolo "
Lo mismo que los array y los bloques
tokenizarlos en la función genérica, o ponerle cuerpo a [ y {
Defini cuatro clases: Integer, String, List, Block para representar los tipos básicos de golfScript. En el caso de String, es básicamente un wrapper alrededor de str
Si, yo tengo esas también
bueno, tengo solo 1 con esos estados
Ah no, tengo mas :-)
struct Value {
    enum ValueType {
        NONE,
        STRING,
        INTEGER,
        ARRAY,
        BLOCK,
        CFUNCTION
    };
El NONE me lo puedo ahorrar
pero yo tengo CFUNCTION, que son funciones en C++ a las que se puede llamar
16:28
Bueno, ahi va el procesador:
import re

from tipos import Block, Var, Integer, String, List, colon
from operaciones import variables
import types
import typing

patron = re.compile(r"[a-zA-Z_][a-zA-Z0-9_]*|;|'(?:\\.|[^'])*'?|[~@\\%\.{};+]|-?[0-9]+|#[^\n\r]*|\S")
                    #|"(?:\\.|[^"])*"?|-?[0-9]+|)


def lexer(source):
    #   Divide el programa fuente en lexemas
    #   Funcion generadora; marca de fin es None
    for linea in source.split('\n'):
        for parte in patron.findall(linea):
            if parte[0] == "#":  # El resto es comentario
Es muy pequeñito jejeje
el mio ocupa mas ... y aun no está terminado
Bueno, hay otros fuentes con los métodos que implementan los operadores y esas cosas. Lo estoy subiendo a GitHub. Mañana lo podrás usar para probar.
ah, vale. Porque yo tengo 9 .hpp y otros 9 .cpp
... de momento ...
Ojo, que creo que todos los operadores están sobrecargados, y se dan combinaciones de lo más raras.
Es especialito para eso, si. Según sea el tipo, hacen unas cosas u otras
Luego le echo un ojo a tu código, a ver como has implementado los bloques
No me termina de convencer mi manera
16:56
@Trauma yo decidí hacerlo en C# xd
17:30
@Mateo Podría ser peor ... podrías haber decidido hacerlo en J ...
A ver quien es el valiente que lo hace ... ¡ En PHP ! xDD
HAY UN PARTIDO EN UN RATOOOOOO PARENNNNNN DEJEN VIVIRRRRRR
@gbianchi Todo por que vas ganando. Uno que se quedó en casa no más ...
¿ Partido de que ?
@CandidMoe no tengo mas uñas...
pelos me quedan poco
no hay desfibriladores para todos
no hay partido, ninguno, que no lo hayamos sufrido mal...
@Trauma 🔨
Como deporte, solo me interesa el tumbing-en-el-sofá y el levantamiento-de-vidrio-sobre-barra-fija
2
Todos los demás son una pérdida de tiempo y esfuerzo :-/
17:37
para mi, lo esta diciendo porque el tiki tiki resulto un fiasco....
¿ tiki tiki ?
Tuve que ver algún encuentro con la familia, pero miraba el partido y lo analizaba como tablero de ajedrez. Se me armó una confusión mental
@CandidMoe ¿ Eran todos caballos, no ? Porque van por todos lados
Tengo que reiniciar el equipo, kernel actualizado ... ahora vuelvo
@Trauma A unos, como caballos, a otros como peones, las ubicaciones no me cuadraban.
jejeje
No me extraña xD
Oye @CandidMoe, tengo un problema conceptual aquí
Si proceso la entrada y encuentro un bloque, se evalua como un valor de tipo BLOCK
supongamos {1 3+}
no, no es eso ...
no se como explicarlo, copón
Aaaahhhhhh ... ya lo vi ... es al asignar
La asignación no evalúa el bloque
17:45
En el stack hay objetos. Un objeto (una posición en el stack) puede ser un bloque. Es un objeto que contiene un subprograma ya tokenizado. Cuando el evaluador lo encuentra, se invoca recursivamente
pera pera
en el stack hay un bloque. Y yo lo asigno al símbolo b
ahora, ya no puedo volver a poner el bloque original en la pila ¿ no ?
si intento b, se ejecutará el bloque
{5}:b;b da como resultado [5] ¿ correcto ?
Estoy trabajando con el interprete oficial: github.com/darrenks/golfscript
Todas las dudas los voy resolviendo asi
¿ Te has instalado ruby solo para ejecutarlo ? xDD
@Trauma Correcto
... ummmmm ... vale
17:50
@Trauma La documentación es básica e incompleta. Hay que usar el interprete para deducir como funciona.
duda filosófica resuelta :-)
Le falta la no-evaluación ... como era en Lisp ? comilla ?
Vale, ahora si me cuadra todo. Voy a meterle-mano un rato
18:06
@Trauma lo haré en PHP sólo para poder decir que mi vida es muy miserable
@MauricioContreras ¡ HAHAHAHA ! No eres capaz ;-p
@Trauma si el lenguaje lo permite, soy capaz
El original está hecho en Ruby
Por cierto, no van a implementar un banner en SOes para advertir del uso de ChatGPT?
Y @CandidMoe lo está haciendo en python
18:10
Bueno
@gbianchi supongo que hoy casi nadie trabaja por la pampa. XD
A ver si los croatas no le hacen lo que los marroquíes a CR7
@MauricioContreras hasta dentro de 20 minutos seguimos trabajando.. como podemos...
18:45
Comentario del mes:
Buenas tardes, bienvenido a la web de soporte de Youtub...ah no espera, bienvenido a StackOverflow, por un momento pensé que eramos el centro de atención al usuario de youtube. Como deberías entender tras dos años y pico registrado en SOes, aquí damos soporte a problemas de programación, no a cualquier problema mínimamente relacionado con un ordenador. Esta pregunta seguramente acabe cerrada porque no tiene relación alguna con SOes. Te recomiendo que las dudas con la plataforma de google las preguntes en el centro de soporte de dicha plataforma. — Benito-B 33 mins ago
XDDD
Paper, 2ª parte xd
¡¡ Esta tengo que verla !!
19:07
@Trauma la verdad estoy pensando que hacer un Lexer es un tanto innecesario.
Yo solo tengo un Tokenizer. Luego es directo todo, a base de asignar los comportamientos correctos a los símbolos
De hecho, currándomelo un poco, hasta el tokenizado de las cadenas, los block y los array se podría hacer asignado cosas a los símbolos comillas, llaves y corchetes
@gbianchi cuando puedas lo miras. Este usuario tiene TOC con la palabra ARRAY. es.stackoverflow.com/users/108641/…
@Trauma a ver. Que si es necesario. En realidad quise decir que tal vez sea innecesario producir tokens en lugar de producir directamente objetos del lenguaje.
@Mateo Ah,vale. Bueno, es que lo uso para gestionar el fin-de-archivo ... y para los blocks de código
un block es una secuencia de Tokens, que son evaluados a-posteriori
mientras que un array es evaluado en el momento de crearlo
struct Token {
    enum TokenType {
        END_OF_FILE,
        ASSIGN,
        IDENTIFIER,
        STRING,
        INTEGER,
        ARRAY,
        BLOCK
    };
Anoche me puse a leer un sitio sobre lexers. Llegué hasta la parte que usa árboles de sintaxis ya que golfscript no lo necesita. craftinginterpreters.com/representing-code.html
el parseado es bastante sencillo, sobre todo al no tener flotantes
pero si tiene negativos, a cambio :-)
C no tiene negativos
osea, no hay un token en C para entero negativo, sino que es un operador - unario y un entero
ni simbolos de mas de 1 caracter, nada de <<= xDD
el tokenizador que tengo para C++ es bastante mas complejo que este
sin tener en cuenta los 20 tipos de cadenas que te puedes encontrar en C++
Ah, en la documentación de GolfScript dice que lo único que no puedes cambiar es # y :
eso es falso, tampoco puedes cambiar, por ejemplo, {
La versión 0.1 de golfScript en Python: github.com/SantoRemedio/golfScript
@CandidMoe 😱😱😱😱😱😱😱😱😱😱😱
¡ Toma ya !
Te lo has tomado en serio :-)
La obra gruesa está terminada; quedan algunas terminaciones pendientes.
@Trauma Espero que los fuentes te resulten útiles.
@CandidMoe Les echaré un vistazo ... solo para ver como hacemos las cosas de forma distinta :-)
Mi mayor duda era el tema de los blocks ... que ya quedó resuelta
Es un lenguaje incompleto, el GolfScript
Ya me va quedando menos también :-)
jejeje ... hasta hay previsto que tenga test. Está previsto ... algún día xD
La velocidad de desarrollo se la debo a las pruebas unitarias. En software de esta complejidad es de esperar que un pequeño cambio repercuta lejos. Entonces, tras cada cambio, corro el set completo de pruebas, y claro, más de una vez el cambio produce un problema en otra parte. Sin pruebas unitarias, vendría a detectarlos no se cuando.
¿¿ Le has hecho hasta tests ??
😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱😱
@Trauma Hombre, es el secreto de mi éxito. Hago un cambio y algo se cae. En lugar de tontear con el depurador, creo test unitarios para revisar el funcionamiento de los subcomponentes sospechosos.
jejeje ... yo aun no llegué a la parte de depurar xDD
19:44
@CandidMoe conoces el paquete hypothesis?
@abulafia Ni idea
De hecho, me acabo de dar cuenta de que mi IstreamTokenizer está mal, necesito pasarle un token que marque el fin-de-tokens
@Trauma Yo marco el final con None, pues en ocasiones necesito avanzar con next() y no quiero tener un StopIteration.
Tengo un Token con el tipo Token::END_OF_FILE, que uso al tokenizar streams
pero para tokenizar arrays o blocks, necesito un tokenizador hijo
y tiene que saber que caracter marca el fin de su trabajo
bueno, me basta con un caracter, ] o }
class Tokenizer {
public:
    virtual ~Tokenizer( );

    virtual Token nextToken( ) = 0;
};

class IstreamTokenizer : public Tokenizer {
public:
    IstreamTokenizer( std::istream &is ) :
        m_istream( is )
    {
    }

    Token nextToken( ) override;

private:
    std::istream &m_istream;
};

class ChildTokenizer : public Tokenizer {
public:
    ChildTokenizer( Tokenizer &parent, char end ) :
        m_parent( parent ),
        m_end( end )
    {
    }

    Token nextToken( ) override;
jejeje ... 3 Tokenizadores, mas la clase base Tokenizer xDD
No está mal. Y eso que el lenguaje es un churrillo
20:02
@Mateo aja
20:28
Estoy agregando algunas facilidades al REPL para facilitar la depuración:
Interprete golfScript 0.1 - Dic/2022 - Candid Moe
Esta versión acepta el código en golfscript.com/golfscript/builtin.html
REPL sin historia ni editor. CTRL-C para terminar. help para ayuda
Operadores:  [+, ;, -, *, /, ?, ), (, ~, ., $, \, @, %, !, `, >, <, ^, &, if, do, while, until]
>debug
>1 2 3+*
[] 1
[1] 2
[1 2] 3
[1 2 3] +
[1 5] *
[5]
>
Imprime el stack y el token en proceso por cada paso del programa.
21:01
@Trauma por qué 3 y no 1?
@Mateo Al final van a ser 2 (creo). Uno el normal que tokeniza un std::istream, y otro para simular el tokenizado de algo ya previamente hecho. Se usaría el ejecutar los blocks de código.
Mi ejecutor necesita un Tokenizer del que sacar los tokens
@Trauma podrías usar uno solo si te lo propones.
No creo que merezca la pena; el simulado es trivial
trivial de verdad
Token BlockTokenizer::nextToken( ) {
    if( m_index == m_storage.size( ) ) {
        return Token( Token::END_OF_FILE );
    }

    const auto &token = m_storage[m_index];
    ++m_index;

    return Token( token );
}
Y los bloques piensas que sean strings o qué?
No, son std::vector< Token >
21:09
Bueno, pienso dejar los bloques para más adelante así que no sé cómo lo haré todavía.
Tal vez lo puede hacer la misma parte de los operadores
struct Token {
    enum TokenType {
        END_OF_FILE,
        ASSIGN,
        IDENTIFIER,
        STRING,
        INTEGER,
        ARRAY,
        BLOCK
    };

    Token( ) = default;
    Token( TokenType t ) :
        type( t )
    {
    }
    Token( const Token & ) = default;
    Token( Token && ) = default;

    TokenType type;

    std::string vstring;
    int vint;
    std::vector< Token > vsequence;
};
El Token puede contener cualquier cosa, desde elementos simples hasta agrupaciones
@Trauma En qué categoría entran los operadores?
Identificadores
El lenguaje no tiene operadores ... mas allá de :, que es especial
En realidad es muy simple ... no hay argumentos ni valores de retorno, solo un bloque de código y una pila
@Trauma yo lo interpreté cómo que sí. Quizá más adelante lo mejore
¿ y que diferencia hay entre un operador y una función (o bloque de código) ?
21:13
Que en realidad puedes definir los operadores como variables
claro: identificadores :-)
@Trauma ninguna. Si las hay las pongo dentro de la categoría de operadores
ok, yo los he puesto como identificadores :-)
un identificador tiene asociado un valor
y un valor de tipo bloque se evalua como la ejecución del bloque
el resto de valores se evaluan colocandolos en la cima de la pila
Intenté reutilizar algunos componentes de otro interpŕete que tengo ... en proceso
y al final voy a tener que currar mas :-(
@Trauma por cierto. Usas los Token directamente como tipos del lenguaje? Yo no
No, yo tampoco. Los tokens se convierten en Values
Aunque hay poca diferencia, la verdad.
En futuras versiones habrá que refinar eso
21:22
@Trauma por eso me preguntaba si el tokenizador es en vano
De alguna forma tengo que trocear la entrada
Lo empecé a hacer más por el rol que va a ocupar en el código
yo hago diferencias entre Value y Token
Que es el de reconocer lexemas y luego convertir esos lexemas en los valores con los que realmente funciona el programa
Un Value ya está procesado ... por ejemplo, si es un array y algún miembro es una variable, hay que obtener su valor
un Token no. Un token de array con variables internas, no evalua esas variables
Que al final solo se usa en los bloques de código
21:24
O sea, realmente no te interesa saber la línea y la columna donde se encuentra un valor. Solo cuando estás procesando la entrada para saber si hay errores
jejeje ... quité esa parte, ahora mismo no reconozco la fila/columna
En especial si lees el código desde un archivo
@Trauma es lo más fácil de hacer
En el otro lenguaje es así, el Token lleva la línea y columna en la que empieza el token
y entonces necesito un Reader, que añada esa información sobre los datos crudos del stream
@Trauma En mí código los llamé Item y Token. Cómo estamos hablando de un stack.
Aquí, me ahorro el Reader
@Mateo Si, tambien. Yo solo diferencio por su estado-de-evaluación (por llamarlo de alguna manera)
21:27
@Trauma pero si lo puede hacer el Lexer
Es otra opción ... personalmente prefiero el Reader
Cada clase hace lo mínimo
y el lexer recibe Items, que son un char + linea y columna
y el Reader solo lleva la cuenta de eso
O tokenizer, lo que fuese. Me resultan confusos los nombres. Lexer, Tokenizer, Scanner y otros
jejeje ... usa el que mas te guste :-)
yo Tokenizo
Creo que se me quedó del primer interprete de un lenguaje que vi
El lenguaje Letra jejeje
Tantos años ...
Por algo son diferentes nombres. Solo que parecen usarse de forma intercambiable
no sabría decirte ... el lexer da lexemas, el Tokenizador tokens ... que vienen a ser lo mismo, pero con otro nombre
Si estuvieramos con máquinas de estados, tanto uno como otro sería un evento xDD
21:31
@Trauma usas SOLID? Todavía no práctico ningún patrón de diseño. Así que simplemente le doy cierta gama de funciones a mis clases
Lo intento. Pero a mi total y libre albedrío
Uno o separo cosas dependiendo de la facilidad de escribir / mantener
O de la necesidad de lo que este haciendo ...
Bueno, por hoy vamos a dejarlo ya. Mañana hay que madrugar.
jejeje ... creo que tengo que poner comentarios a los commit un pelín mas ... descriptivos xDDD
22:05
@CandidMoe Te decía porque quizás te interese, por lo del testing. Es para property-based testing
@abulafia Si, lo estoy mirando. Se interesante.

« first day (2601 days earlier)      last day (803 days later) »