06/Feb/2021

Updated on 13/May/2022

-- Discovered Shine, on github.com/richardhundt/shine
-- Yes I know Wren, I don't like forcefully OOP languages
-- There's also Gravity, it looks neat (it's also OOP but doesn't 
-- force you to write OOP code), though it seems abandoned

-- I really like, or want to like, Lua for many reason, either because it's
-- so simple and concise, so lightweight and lean for a scripting language,
-- or for it being made in Brazil.
-- But it has some small details that individually make me annoyed, and
-- together make me always not like use it after some time.

-- I will mark them with
-- :| for minor stuff
-- :( for quite annoying stuff

-- Comment notation :|
-- the "--" are fine
-- it's the multi line ones ( --[ --] ) that are ugly and weird,
-- specially the levels thing
-- Fix:
-/
    Random stuff -/ can be nested /- here
/-

-- writing 'function' can be long :|
-- function -> fun/c (can be just an alias)

fun something()

end

-- No switch statement :(

switch thing
    case 3 then
    -- ...
    end
    case 7,8 then
        -- multiple case values
    end
    else then
        -- if everything else fails, do this
    end
end

-- no 'continue' for loops :(
-- without it you need to use 'goto' (WHY?)

while true do
    if (x%3) == 0 then continue end
    -- ...
end

-- meh way to write 'for' loops :|
-- also, not having += -= etc operators :(
-- the ~= for inequality :|

for j=2, j<=10, j += 1 do
    if j != 0 then
        -- ...
    end
end

-- 'elseif', a very stylistic choice thing :|
-- 'elif', or a parser case where 'else if' (in the same line) is a single
-- thing if you want to add complexity

-- variables global by default :(

-- have variables be local by default
-- have a keyword to initialize global vars

b = 2      -- outside function: package/file scope, inside function: function scope
pub c = 10 -- global scope

-- no way to diferentiate declaration and assignment :|

d := thing -- yes, go style identifiers

-- can't index strings :(

-- preferably do it based on 'runes' instead of based on byes

stringo = "egg"
if stringo[1] == "e" then
    -- ...
end

-- Or at least a simple way to turn a string into a table
-- (again, split on unicode, not bytes)

if stringo.runes()[2] == "g" then
    --...
end

-- no way to set fixed var/param types :|
-- of course these would be optional,
-- it's simply a bit more of useful detail

someone :num = 2
sometwo :str = false -- give error

fun sus(somegg :num) :num -- also have return type
    --...
end

-- in the same vain, no true constants :|

PI is 3.14
pub PIE is "apple and cinnamon"

pub Dragon :str is "rawr!"

-- 'is' for declaring consts
-- or something, thist just looks neat

-- no *official* structs/classes implementation :|

-- string.char(v) will halt the program if v isn't an ASCII val :(

-- Metatables feeling weird to use :|
-- This is more of a personal thing, as I generally feel most
-- metaprograming in languages is weird do use. So I don't even have
-- a 'fix' for this one, it's simply meh for me, maybe a Rust-like trait system?

-- These were all my nitpicks/wishes that I had in my mind,
-- feel free to tell me how I'm wrong :)