Parabéns pela iniciativa. Eu comecei criar uma linguagem com essa idade. Na época era muito difícil porque eu tinha 16KB de memória e quase nada de material para estudar sobre o assunto, eu fui na intuição.
Faça como achar melhor. O ideal é você poder justificar cada decisão, mais que o resultado é o pensamento crítico que vai te evoluir corretamente. Documente tudo. Se precisar, faça uma pergunta que eu tento responder. Eu não participarei no Github mas se perguntar aqui tem chance de eu responder, se eu for capaz.
Eu não gosto de algumas decisões, mas e daí? A linguagem é sua. Odeio begin e end, especialmente o begin, mas é só a minha opinião, meu gosto.
Não há problema algum em usar + para concatenação, apenas tome cuidado para a conversão automática, que parece ser a ação que escolheu para a linguagem, não vi nada documentado sobre isso. A questão do "mais" entre duas strings é bem ok, o problema é quando concatena outros tipos, isso pode virar uma bagunça, cabe a você não deixar isso acontecer. Ou deixe, afinal a linguagem é sua.
Me parece que a escolha óbvia é que sempre que tiver uma string, até mesmo uma vazia (provável com "") o que vem a seguir é convertido para string. E é provável que todos os tipos devam poder ser convertidos para string. Ou não? Pode ter algum argumento contra em algum caso.
Acho um pouco estranho obrigar parênteses (pelo menos pareceu obrigatório) while, if, etc. Você parece ter optado por não colocar caracteres especiais, a não ser nos operadores óbvios, na estruturação da tupla de parâmetros/argumentos de funções. Então isso parece ruído e é desnecessário, especialmente por causa do begin.
Pode ser apenas um lapso, o seu último código indica algo errado baseado no segundo código (um dos dois está errado). Dado o estilo que parece que você adotou, faz sentido usar uma palavra-chave para declarar variáveis, mas é um pouco estranho para mim, usar isso em cada operação com a variável, mas você decide o que é bom para sua linguagem. É mais estranho ainda quando a chamada de função não exige nenhuma palavra-chave. A chamada de função é uma operação a ser realizada, assim como a atribuição de variável, só fica consistente se ambos tiverem uma palavra-chave ou ambos não terem. Você escolhe, até mesmo deixar como está, a inconsistência não é grave, estou falando para você refletir mais sobre isso e outros aspectos da linguagem.
Mas use a palavra que achar melhor, você dá a semântica que quiser para o let, não precisa copiar de outras linguagens.
No momento certo veja o que acontece com erros, que passará ser mais importante que o que funciona.
Novamente, o que eu acho um erro, mas você decide o que fazer, é não ter toda decisão documentada formalmente, de um jeito estruturado. Ainda dá tempo, pode fazer retroativo.
https://www.tabnews.com.br/maniero/faq-do-programador-perdidao.
S2
Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente (não vendo nada, é retribuição na minha aposentadoria) (links aqui).