Eu gosto mais das linguagens ditas "acadêmicas", em especial Common Lisp e Haskell. Claro que às vezes apanho para fazer coisa relativamente simples, mas eu gosto. Em especial do Haskell que parece fazer da POG praticamente impossível.
Dependendo do que vou fazer eu gosto de C também.
Uma linguagem interessante é Prolog. Você cria um banco de dados e faz "perguntas" a partir disso.
BANCO DE DADOS:
vizinho(pedro, paulo).
vizinho(pedro, maria).
PROGRAMA:
vizinho(pedro, paulo). # retorna verdadeiro
vizinho(pedro, jose). # retorna falso
vizinho(Pedro, X). #retorna os vizinhos de pedro, ou seja, X = paulo e X = maria.
Não lembro se a sintaxe é exatamente essa, mas esse é o tipo de programa que se faz. Dá para resolver sudoku com relativamente poucas regras e Prolog, é interessante.
Aviso: mini-rant sobre Python
Python é divertido de programar e é bem documentada, mas tem algumas coisas que não fazem sentido ou com que eu discordo. Por exemplo, em C, = é um operador que atribui o valor da direita na variável da esquerda e retorna o valor da direita. A parte do retorna é interessante, porque é possível fazer coisas como
if(!(node = nextNode(&list)) return();
Ou seja, se node for NULL, ele sai da função e pronto. Em Python, você não pode usar '=' no predicado de um if, suponho que eles achem que isso iria "confundir os principiantes" e por isso o código a cima deveria ser algo como:
node = nextNode(list)
if node == None:
return
É claro, não é nenhum problema que se diga "OMG, como vou resolver isso?", mas é a mentalidade do "isso iria confundir os iniciantes" que me incomoda.
Outra coisa estranha no Python é que strings aceitam "argumentos" mais ou menos como o printf em C, mas você pode usar em qualquer string, não só em uma que será impressa (de qualquer forma, para o exemplo abaixo eu vou usar o print). A idéia é interessante, já que não é necessária criar uma string com sprintf antes de passar como argumento para outra função, mas os dois exemplos abaixo são válidos:
print "valor: %f" 3.15
print "valor: %s" 3.15
Só que teoricamente o %s deveria aceitar apenas strings. Se ele não está nem aí se a flag usada é %f ou %s, porque não usar simplesmente algo como o {0}, {1}, ... do Java?