É um pouco subjetivo, mas espero ter uma compreensão mais clara de quais fatores tornam um operador claro para usar vs obtuso e difícil. Eu estive pensando em designs de idiomas recentemente, e um problema em que sempre volto é quando fazer uma operação importante no idioma como operador e quando usar uma palavra-chave ou função.
Haskell é um pouco notório por isso, pois os operadores personalizados são fáceis de criar e, muitas vezes, um novo tipo de dados é fornecido com vários operadores para uso nele. A biblioteca Parsec, por exemplo, vem com uma tonelada de operadores para combinar analisadores, com gemas como >.
e .>
nem me lembro o que elas significam agora, mas lembro que elas eram muito fáceis de trabalhar depois de memorizar o que eles realmente querem dizer. Uma chamada de função como leftCompose(parser1, parser2)
teria sido melhor? Certamente mais detalhado, mas mais claro em alguns aspectos.
As sobrecargas de operadores em linguagens do tipo C são um problema semelhante, mas conflitadas pelo problema adicional de sobrecarregar o significado de operadores familiares, como +
com novos significados incomuns.
Em qualquer novo idioma, isso parece uma questão bastante difícil. No F #, por exemplo, a conversão usa um operador de conversão de tipo derivado matematicamente, em vez da sintaxe de conversão do estilo C # ou do estilo VB detalhado. C #: (int32) x
VB: CType(x, int32)
F #:x :> int32
Em teoria, uma nova linguagem poderia ter operadores para a maioria das funcionalidades internas. Em vez de def
ou dec
ou var
para declaração de variável, por que não ! name
ou @ name
ou algo semelhante. Certamente reduz a declaração seguida pela ligação: em @x := 5
vez de declare x = 5
ou let x = 5
A maioria dos códigos exigirá muitas definições de variáveis, então por que não?
Quando um operador é claro e útil e quando está obscurecendo?
+
para concatenação de strings ou <<
fluxos). Com Haskell, por outro lado, um operador é apenas uma função com um nome personalizado (ou seja, sem sobrecarga) ou parte de uma classe de tipo, o que significa que, embora seja polimórfico, faz a mesma coisa lógica para cada tipo e tem até o mesmo tipo de assinatura. O mesmo >>
vale >>
para todos os tipos e nunca será uma pequena mudança.