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
int: Int32 #Inicializa en 0
int: Int64 #Inicializa en 0
int: Float #Inicializa en 0.0
num: Num #Inicializa en 0.0, tipo DECIMAL y por defecto
name: Str # UTf8
IsTrue: Bool #Inicializa en false
today: Date = 2002-08-10 #Inicializa en 0000-00-00
hour: Hour = 10:00:00 #24 H format #Inicializa en 00:00:00
todayHoue: DateTime = 2002-08-10-10:00:00
path: Path = /root #Inicializa en /
range: [1..2] #Se debe incializar explicitamente
data: Dict = {num:name} #Inicializa en {}
dataTyped: Dict<Number,String> = {num:name}
things: List = [num, name, IsTrue] #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:
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 : Str, Error?
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:
embed: Person
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 transform: Str
return self.raw.toUpper()
def require:Bool,Error?
return assert(len(self.value)>0, Error("[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?