Ver Mensaje Individual
  #1  
Antiguo 21-09-2012
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Reputación: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cool Creando mi propio lenguaje: Ideas

Me pico el bicho de crear un lenguaje de programacion. No he podido sacarme de la cabeza la idea a pesar de que:

1- Ya hay demasiados
2- Es una tarea titanica
3- Es casi imposible que resulte exitoso
4- No tengo el tiempo ni los recursos

Pero en fin. No es secreto que me encanta python, asi que no es sopresa que esta basado en el. Pero estas son un conjunto de ideas que me *fastidian enormemente* cuando programo, y me gustaria que existiera el lenguaje que propongo.

Filosofia (ideas en desorden)

100% de acuerdo con Zen de Python.

Muerte al NULL. Me da rabia de la mala (en especial con Ojb-c) que un objeto puede ser NULL en cualquier momento y que cause un error de excepcion. Por ende, mi lenguaje no considera que el valor de inicializacion de todo es un NULL. Todo se inicializa y existe legalmente, y no se puede nulificar (a menos que se use un tipo nullable). El NULL es un caso excepcional, pero casi todos los lenguajes lo consideran el estado por defecto. NULL es como tener que manejar la memoria manualmente...

Dentro del programa, solo existe UNA y SOLO una forma de formato de datos. No veo porque deba usarse "\" o "/" en un lenguaje para manejar el separador de carpetas, porque existe simultaneamente cadenas ASCII, utf(8, 16, 32) y demas a la vez. O que haya la posibilidad de tener varios formatos de fecha, basados en la configuracion regional.

En mi opinion, el mundo exterior no debe alterar el comportamiento del interior del programa. El programa lee y transforma en los datos para ser compatible con el mundo exterior (ej: Para mostrarle al usuario, o al leer campos de tablas, configuracion del sistema) pero una vez esta dentro del sistema, no existe variacion en la estructura de datos.

La unidad basica es la funcion, no el objeto. Esto combina con:

No hay necesidad de usar herencia para la OO. 100% de acuerdo con GO.

Los numeros se hace con tipos de datos DECIMAL, no integrales o flotantes. Es toda una patada que las operaciones de +,-.* funcionen bien pero las / salgan incorrectas. La matematica DECIMAL no tiene problemas de errores de precision. El uso de INT y FLOAT se debe relegar a los casos donde tiene sentido.

Los string deben ser internamente por defecto UTF8.

Los mensajes de error deben tener los datos!!! Me *mata" cuando hay un mensaje del tipo " El registro esta duplicado". Y no me dice: En que tabla de que BD, de que campo, y lo mas importante, que VALOR lanzo el problema! Deberia ser: "El registro en Clientes.Id = 1 esta duplicado"

Todo esto se puede resumir en: por defecto, lo correcto/obvio no lo mas eficiente. Usar el principio de la menor sorpresa.

Como se veria el lenguaje?

Variables. Seria un lenguaje tipado, como PASCAL
Código PHP:
# Comentario
intInt32 #Inicializa en 0
intInt64 #Inicializa en 0
intFloat #Inicializa en 0.0
numNum #Inicializa en 0.0, tipo DECIMAL y por defecto
nameStr # UTf8
IsTrueBool #Inicializa en false
todayDate 2002-08-10  #Inicializa en 0000-00-00
hourHour 10:00:00 #24 H format  #Inicializa en 00:00:00
todayHoueDateTime 2002-08-10-10:00:00
path
Path = /root  #Inicializa en /
range: [1..2]  #Se debe incializar explicitamente

dataDict = {num:name}  #Inicializa en {}
dataTypedDict<Number,String> = {num:name}
things: List = [numnameIsTrue#Inicializa en []
thingsTyped: List<String> = [name]
error?: ERROR #Marca con ? que la vble es nullable. Inicializa en NULL 
Constantes se diferencian porque estan todo en mayuscula:
Código PHP:
PI 3.1416 
Control:
Código PHP:
for thing in things:
    print(
thing)

for 
i in range(1,10):
    print(
i)

for 
IsTrue#Reemplaza while.
    
print("Yep forever!")

    break

for: 
#While forecer
    
print("Infinite!")

if 
IsTrue:
    print(
"Yep"
Al igual que GO, creo que while es un caso poco usual si las clases se trabajan como enumeradores, asi que no justifica tener un comando aparte.

Texto largo. Soporte a closure, asi que captura las vbles/funciones de su entorno. No hay comillas!
Código PHP:
"""
    Just text [IsTrue]. LLama [funcion()]
""" 
Funciones. Si empieza por "_" es privado, de lo contrario publico. Bloque para declarar vbles y parametros. Me parece mas legible que con (param1:Str,param1:Str,param1:Str,param1:Str,param1:Str,param1:Str,)

Código PHP:
#Private function
def _sample:
    print(
"hi")

#Public function with return value
def sample String
var:
    
IsOk:Bool
body

    return 
"hi"

#Public function with multiple return values
def sample StrError?
input:
    
param1:Str
    param2
:Number
    params
: *List
body:
    return 
text:
        
Hola [param1] [param2] [params]
    
None 
Clases:
Código PHP:
class Person:
    
name:Str

    def 
print: Str
    text
:
        
Documentacion
    input
:
        
times:Int32
    body
:
        for 
i in range(1,times):
            print(
self.name)
#Herencia
class Moderator:
    
embedPerson

mamcx 
Moderator()

mamcx.print() #Los metodos de Person se invocan. Pero no existe herencia 
Una de las ideas que me dan vueltas y vueltas, y que tiene que ver con el concepto de mantener integridad en los datos una vez estan en el universo interior, lo llamo PowerType y esta basado en como se define un campo en una tabla.

Por ejemplo:

Código SQL [-]
CREATE TABLE products (
    product_no integer,
    name text,
    price numeric CHECK (price > 0)
);

La idea es que el tipo de datos hace la transformacion y el validado del dato en el mismo tipo.

Esto es lo que tengo por ahora:

Código PHP:
#PowerType

type Mayuscula:Str
    
#Ejecuta al asignar el valor
    
def transformStr
        
return self.raw.toUpper()

    
def require:Bool,Error?
        return 
assert(len(self.value)>0Error("[self.name] no puede estar vacio")

miNombre:Mayuscula "mario"
print(miNombre)
>> 
MARIO

miNombre 
"" #Genera error: miNombre no puede estar vacio 

#Funcion con PowerType

def sample:
input:
    
nombre:Mayuscula
body

    print(
nombre)

sample(""#Genera error: nombre no puede estar vacio 
P.D: Esto todavia no esta MUY bien pensado. Criticas, sugerencias?
__________________
El malabarista.
Responder Con Cita