Uma linguagem de programação pode te tornar estúpido?

77 respostas
K

Finalmente consegui externalizar algo que há um bom tempo já havia percebido: uma linguagem de programação (inclua ambiente de desenvolvimento aí) pode tornar uma pessoa estúpida.

Postei no meu blog o argumento: http://www.itexto.net/devkico/?p=172

O que acham?

77 Respostas

P

Legal a exposição de tuas idéias. Uma pergunta:

Você colocou três figuras conhecidas lá do seu post (Wittgenstein, Dijkstra e Hegel)…fiquei curioso, porque críticos de cada um desses caras já os chamaram de estúpidos em algum momento de suas vidas

  • Wittgenstein por achar que seu Tractatus iria resolver os problemas da filosofia;

  • Dijkstra por ter intolerante em demasia com erros e coisas absurdas

  • Hegel, er…por ter sido considerado um ‘assassino de mentes criativas por mais de um século’ por conta da influência dos seus escritos, colocados por muitas vezes como textos incompreensíveis.

Eles estão lá no seu texto de propósito ou tô viajando? :wink:

Abraço

T+

K

Proteu Alcebidiano:
Legal a exposição de tuas idéias. Uma pergunta:

Você colocou três figuras conhecidas lá do seu post (Wittgenstein, Dijkstra e Hegel)…fiquei curioso, porque críticos de cada um desses caras já os chamaram de estúpidos em algum momento de suas vidas

  • Wittgenstein por achar que seu Tractatus iria resolver os problemas da filosofia;

  • Dijkstra por ter intolerante em demasia com erros e coisas absurdas

  • Hegel, er…por ter sido considerado um ‘assassino de mentes criativas por mais de um século’ por conta da influência dos seus escritos, colocados por muitas vezes como textos incompreensíveis.

Eles estão lá no seu texto de propósito ou tô viajando? :wink:

Abraço

T+

Opa, que bom que gostou. Na realidade, estão de propósito mesmo (como eu os colocaria sem querer? :slight_smile: ).

No caso, ainda bem que os três foram criticados. Aliás, isto não tira em nada o valor de cada um deles (na realidade, a crítica só aumenta). Se para ter valor, alguém tivesse de ser 100% aceito e jamais criticado ou chamado de estupido, possívelmente teriamos hoje como base teórica bem… nada!

Bem, mas vamos então por etapas: por que escolhi cada um deles (o próprio texto já diz, mas se for pra deixar mais claro, vamos lá!)

Wittgenstein (na realidade, foi o próprio Wittgenstein que criticou o Tractactus Logico Philosophicus. É por isto que dizemos existir dois Wittgensteins. O autor do Tractactus é o primeiro e o autor das Investigações Filosóficas é o segundo. Inclusive, o segundo vive detonando o primeiro e ESTE é o maior crítico do primeiro Wittgenstein) foi escolhido por ser o principal expoente da idéia por trás do determinismo linguístico ao extremo, ou seja, na linguagem como delimitação do mundo de um indivíduo.

Dijkstra: apenas por causa de sua citação sobre o BASIC. E também porque esta citação tem muito a ver com o conteúdo do texto. No final das contas, é uma crítica ao modo como iniciamos a nossa carreira de desenvolvedores, ou seja, uma crítica à educação, assim como a palestra da qual a citação foi extraída.

Hegel: por causa do método fenomenológico. Tentei reproduzir a mesma descrição fenomenológica que Hegel fez na “Fenomenologia do Espírito”.
Com relação a Hegel ser considerado fonte de atrasos por mais de um século, gostaria de saber sua fonte (fiquei realmente curioso), uma vez que ele é a base teórica por trás do Marxismo, Fenomenologia, Sociologia e boa parte da filosofia alemã após sua morte. Com relação a ser difícil de ler, bem: o próprio dizia que somente uma pessoa havia compreendido seus textos de verdade além de si próprio. Outro crítico forte do Hegel seria o Schopenhauer que, também, irônicamente, também possui sua influência hegeliana

No final das contas, os filósofos nunca estão 100% corretos ou 100% errados. Pessoalmente, os utilizo como pequenos “softwares” que me ajudam a compor meus raciocínios. Este texto é um bom exemplo. Aliás, repare que em momento algum uso o argumento da autoridade, isto é, em momento algum digo “isto é certo porque X disse isto”.

Usei o “software” Wittgenstein para ilustrar o conceito de determinismo linguistico (no caso, tanto o primeiro quanto o segundo Wittgenstein tratam do assunto).

O “software” Dijkstra (seria Dijkstra um filosofo?) para expor o problema da educação

E, finalmente, o “software” Hegel para expor um fato fenomenológico.

P

Olá :slight_smile:

A crítica ao pensamento Hegeliano é atribuída ao Schopenhauer mesmo.

:wink:

T+

K

No caso do Schopenhauer tem de dar um desconto. Ele morria de inveja do Hegel, e passou a maior parte da sua vida difamando o coitado.
E o mais engraçado é que, com a morte de Hegel (morreu na merda coitado, de colera :slight_smile: ), Schopenhauer simplesmente ficou sem assunto e sua produção caiu demais.

Ou seja, neste caso ai rolava uma paixão reprimida coitado, he he he.

D

Programar em uma linguagem que tenha limitações (me diga uma que não tem) não torna ninguém estúpido, desde que a pessoa que usa esta linguagem seja consciente dessas limitações e conheça outras linguagens e paradigmas. O importante é que se conheça formas diferentes de lidar com os problemas, aprender com a diversidade.

Geralmente que se fecha em uma linguagem já é estúpido por natureza, não é culpa da linguagem. :slight_smile:

K

dlt:
Programar em uma linguagem que tenha limitações (me diga uma que não tem) não torna ninguém estúpido, desde que a pessoa que usa esta linguagem seja consciente dessas limitações e conheça outras linguagens e paradigmas. O importante é que se conheça formas diferentes de lidar com os problemas, aprender com a diversidade.

Geralmente que se fecha em uma linguagem já é estúpido por natureza, não é culpa da linguagem. :)

Pois é, a culpa não é DA linguagem, mas da formação que eu expus no artigo, que, infelizmente, é extremamente comum.

V

Eu comecei no GWBasic, com 9 anos de idade, tentando criar aqueles joguinhos toscos DOS em modo texto 80 colunas por 25 linhas.

Um belo dia, fui ver como funcionava no Windows, e descobri o Visual Basic 1.0 (acho que eu tinha 10 ou 11 anos). Foi um choque. Todo o conhecimento de programação que tinha desabou com uma mudança radical.

Mas me adaptei rápido ao VB 1. Depois consegui o VB 3, 4, 5 e 6.

Depois de algum tempo no VB 6 eu estava insatisfeito. Conheci o Pascal na faculdade mas não gostei. Peguei o C e gostei. Vi Java pela primeira vez em 2003 e achei muito fresco, no C era tudo mais simples.
Mas com o tempo aprendi a gostar do Java e render com ele.

Hoje estou insatisfeito com o Java da mesma forma que estava com o VB 6. Hora de achar uma linguagem melhor…

B

Cara, excelente seu artigo. Muito legal seu ponto de vista. Acho que por isso c++ deve continuar a ser ensinado nas faculdades e não começar ensinando de cara Java ou .Net. Como vc falou no artigo é importante criar no desenvolvedor iniciante a “visão de baixo para cima”.

T

As pessoas focam tanto em “linguagens” que se esquecem que o fundamental é entender os conceitos por trás de como o computador e algums softwares (como SOs, compiladores, etc) funcionam.

Ensinar C++ na faculdade não fará nada além de criar um xiita de C++ (que odeia tudo o que não é C++, porque programadores de verdade programam seus próprios ponteiros) ao invés de um xiita de Java.

V

Thiagosc:
As pessoas focam tanto em “linguagens” que se esquecem que o fundamental é entender os conceitos por trás de como o computador e algums softwares (como SOs, compiladores, etc) funcionam.

Ensinar C++ na faculdade não fará nada além de criar um xiita de C++ (que odeia tudo o que não é C++, porque programadores de verdade programam seus próprios ponteiros) ao invés de um xiita de Java.

Bem, faculdades mais sérias têm disciplinas de sistemas operacionais, compiladores, inteligência artificial, e outras coisas que simples programadores de CRUDs nem sonham em como é que funciona.

M

Acredito que o fato de alguém se focar tremendamente em uma tecnologia limitará seu horizonte, pois se ocorrer alguma mudança no decorrer do projeto e aquela tecnologia for posta de lado, este profissional não saberá o que fazer. :wink:

B

Thiagosc:
As pessoas focam tanto em “linguagens” que se esquecem que o fundamental é entender os conceitos por trás de como o computador e algums softwares (como SOs, compiladores, etc) funcionam.

Ensinar C++ na faculdade não fará nada além de criar um xiita de C++ (que odeia tudo o que não é C++, porque programadores de verdade programam seus próprios ponteiros) ao invés de um xiita de Java.

Sim, exatamente por isso sou a favor de COMEÇAR ensinando C++, pois as caras entenderão muitos conceitos que em outras linguagens de mais alto nível, como java, são abstraídos. Se o cara começar a aprender programação a partir do Java, ponteiro para ele, será apenas uma peça do relógio.

Acho que não entendeu minha opinião. Sou a favor de começar a ensinar com C++, o que não impede que outras lingugens sejam introduzidas e EXIGIDAS, abrindo os horizontes do futuro profissional.

K

O usuário maquiavelbona deve ter tido uma formação parecida com a minha, já que tanto eu como ele nos formamos técnicos em “técnico de informática com habilitação em programação e desenvolvimento de sistemas” pelo CEFET-SP.
Lá, no mesmo semestre acabei tendo de uma vez COBOL, C e VB, mas um semestre antes tive os primórdios de lógica de programação aprendendo “português estruturado” com um professor deficiente visual.
Eu achava VB fácil de mexer, mas preferia o C que para mim sempre me deu BEM MAIS PODER que o VB, diferente da visão do post no blog do kicolobo, ainda que fosse bem mais “osso” desenvolver em C.
COBOL eu rejeitava e achava que a sintaxe era excessivamente carregada e a linguagem em si me parecia muito regrada e limitada, mas hoje eu respeito.
Acabei tendo contato com programação orientada a objetos pelo Java e ir de programação estruturada para orientada a objetos pelo menos no meu caso foi um parto e tanto.
Hoje vejo que começar com um “português estruturado” pode ser melhor que sair enfiando ASM/COBOL/C/VB/Pascal/Java goela abaixo no pessoal que está começando do zero.

Inté.

P

Sobre o aprendizado em linguagens de programação, normalmente o que ocorre com boa parte dos alunos é querer pular etapas que são importantes para que o entendimento em linguagens se firme do modo mais acertado. Normalmente pulam etapas porque ou as desconhecem (falta de educação formal) ou as ignoram porque querem atingir outros objetivos, como o de arrumar um estágio ou emprego o mais rápido possível.

Tem gente que sai aprendendo a programar e mal conhece sobre a lógica aristotélica do verdadeiro ou falso.

T+

A

Gostei da parte de conhecer vários paradigmas, mas achei o relato do programador visual basic fraco, este programador já era estúpido, não foi a linguagem ou ferramenta que o tornou assim.

O pessoal mais experiente sabe que não importa se vc veio do cobol, clipper, vb ou do C, o caminho é sempre dificil de se percorrer.

C

A nao ser que a linguagem em questao seja Lisp, que permite novas lingugaens serem introduzidas pelo programador.

Proteu Alcebidiano:
Tem gente que sai aprendendo a programar e mal conhece sobre a lógica aristotélica do verdadeiro ou falso.

:shock:

J

Vestir camisa de linguagem de programação é realmente estupidez. O que importa é domínio de algoritmos.

T

Quem falou de faculdade? A linguagem é o de menos. É perfeitamente possível aprender conceitos de SO por exemplo em linguagems de alto nível, simulando algoritmos e tal.

T

Bruno_Leonardo:
Sim, exatamente por isso sou a favor de COMEÇAR ensinando C++, pois as caras entenderão muitos conceitos que em outras linguagens de mais alto nível, como java, são abstraídos. Se o cara começar a aprender programação a partir do Java, ponteiro para ele, será apenas uma peça do relógio.

Acho que não entendeu minha opinião. Sou a favor de começar a ensinar com C++, o que não impede que outras lingugens sejam introduzidas e EXIGIDAS, abrindo os horizontes do futuro profissional.

Acho que o melhor seria começar com C. C++ é cheio de coisas desnecessárias para se aprender o básico.

K

O grande veneno na minha opinião são os “ambientes de desenvolvimento rápido”.
É muito comum vermos as pessoas iniciando sua carreira neste tipo de ferramenta que, realmente, são produtivas, isto é um fato inegável, porém que se mostram ineficientes a partir de determinado nível de complexidade dos sistemas.

Normalmente, neste tipo de desenvolvedor, é criada uma ilusão tão grande de poder (que na realidade, apenas está mascarando a sua ineficiência) que este, muitas vezes por arrogancia mesmo, simplesmente ignora qualquer coisa que esteja fora deste ambiente.

Consequentemente, como já está com o sua cabeça cheia dos vícios e do modo de pensar da ferramenta a partir da qual estava já acostumado a trabalhar, acaba enfrentando uma dificuldade gigantesca ao tentar aprender qualquer outra tecnologia. Na realidade, neste momento, o sujeito percebe que não possui base alguma. Percebe que tudo aquilo que fez, foi feito com o trabalho de terceiros (componentes prontos incluidos em seus formulários, formulários compostos apenas por componentes lá incluídos, etc).

Já vi inúmeros casos de pessoas que simplesmente não conseguem sair destes ambientes. E, ao tentar mudar, acabam fazendo aquilo com o qual já estavam habituados a fazer nos mesmos. Por exemplo: conheci um sujeito que tentou criar uma série de templates de formulários em Java, igual fazia no Delphi, Logicamente, não deu certo. Resultado: passou a odiar Java profundamente. E até hoje só trabalha com Delphi, da mesma forma, com os mesmos sistemas, que na realidade não passam de CRUDS…

J

Para fins acadêmicos, um RAD é uma coisa sem sentido, já que o que vem em conta é lógica. Isso pode ser realmente um veneno mesmo. Mas até as faculdades de engenharia e ciência vem adotando isso. Muito complicado.

S

O limite não é a linguagem, é a educação.
E aqui “linguagem” está sendo usada para poder incluir Java , C e afins, quando na realidade as pessoas pensam com uma lingua.
A lingua é por definição mutável. se não fosse, não existiam neologismos.
Neologismos são a prova de que o ser humano pode avançar além da sua linguagem ( cojunto de simbolos) , criando novos simbolos e incluindo-os nela.

Mas como ele faz isso ? Simplesmente porque ele pensa. Mas pensar de uma forma “além do limite da linguagem” implica em uma educação extensa.

As linguagens de programação permitem a criação de novos simbolos, mas não de novos meta-simbolos. Por exemplo, classes eu crio quantas quiser, mas para criar o conceito de anotação é preciso mudar a estrutura interna da linguagem/plataforma

Isso não acontece em uma lingua normal (que não de programação). É por isso que é linguagem de programação e não lingua de programação…

Agora, o uso de IDE é outra historia. Acho que algumas pessoas acham que o IDE define a linguagem. ( tlv porque o VB fosse totalmente integrado e isso dava essa impressão). Então sim, o uso “errado” do IDE pode impedir a evolução da pessoa.
Mas isso e´uma problema de educação. Ninguem ensinou à pessoa / a pessoa não aprendeu diferente.

O problema é a educação, não a lingua nem a linguagem.

A prova é que tem muita gente capaz de alterar a JVM para incluir novas funcionalidades.

J

sergiotaborda:

A prova é que tem muita gente capaz de alterar a JVM para incluir novas funcionalidades.

Mas para alterar uma máquina virtual não é preciso dominar nenhuma linguagem de programação, e sim ter conhecimento de processadores e microcontroladores.

M

Não diria “estúpido”, mas limitado. Acho que conhecer apenas uma linguagem ou tecnologia limita bastante o desenvolvimento profissional. :wink:

S

juliocbq:
sergiotaborda:

A prova é que tem muita gente capaz de alterar a JVM para incluir novas funcionalidades.

Mas para alterar uma máquina virtual não é preciso dominar nenhuma linguagem de programação, e sim ter conhecimento de processadores e microcontroladores.

Hummm… a máquina é programa sem linguagem de programação ?!

Que eu saiba a JVM é feita em C++.
De qualquer forma o que eu quis dizer é que para alterar JVM vc não usa Java. ( se usasse java , ele não seria limitado)

J

Não…quis dizer que uma pessoa tem que ter mais conhecimento nos fundamentos matemáticos do que em liguagem de programação. Se a pessoa domina álgebra, programa em qlqr linguagem. Mas peço desculpas, prq realmente não havia entendido o que você havia postado.

T

sergiotaborda:
As linguagens de programação permitem a criação de novos simbolos, mas não de novos meta-simbolos. Por exemplo, classes eu crio quantas quiser, mas para criar o conceito de anotação é preciso mudar a estrutura interna da linguagem/plataforma

Isso não acontece em uma lingua normal (que não de programação). É por isso que é linguagem de programação e não lingua de programação…

Você quer dizer “linguagens mainstream”. Linguagens baseadas no Lisp permitem criar coisas totalmente novas. É possível, por exemplo, até customizar o reader que vai ler o código e transformá-lo em um grafo para ser interpretado.

M

Informação e educação.

“A educação não presumi que você terá habilidades intelectuais, mas com a mesma você pode ser uma pessoa bem instruída, logo a informação é associada ao intelectual que sabe usufruí-la”.

“Intelectuais tendem a serem pessoas mais egoístas e prepotentes, mas isso também não é regra”

P

programar em qualquer linguagem não é o problema, o problema é programar de qualquer jeito em qualquer linguagem, ou programar de um unico modo em qualquer linguagem. Eu reformularia sua frase para

“Quem domina métodos formais e teoria de linguagens de programação é sim capaz de aprender corretamente qualquer linguagem de alto nível”

Para hardwares e processadores, dominar eletrônica digital, linguagens de descrição de hardware ou algo tipo matlab + simulink já tá de bom tamanho :wink:

T+

J

Para “criar” tecnologia, fundamentos físicos e matemáticos são essenciais. Eu entendo que metodologia é muito importante para um produto final. Mas o ato de programar bem não depende disso, depende de resolução de problemas, e isso só o domínio de algoritmos pode dar.

W

hahahah a unica coisa que eu sei de matematica eh quanto eh 2 + 2 e consigo aprender qualquer linguagem, pra mim linguagem nao eh problema porque basicamente eh a mesma coisa. Com certeza o mais dificil eh entender do negocio, isso sim eh dificil.
Nao to falando que matematica nao seja importante, eu acho que muito importante no sentido que desenvolve o raciocinio logico. Mas isso nao faz ng um bom programador, tanto que na minha facul mesmo tinha gente que tirava 10 em calculo 1, 2, estatisca, etc etc e vivia pegando DP em materias mais tecnicas. :slight_smile:

//Daniel

J

Entendi…mas álgebra booleana não é cálculo. É ela que te faz usar a linguagem para resolver seus problemas(A lógica da programação ;]).

M
  • algoritmo é o que então ? não pode se a semelhar-se a uma equação !!!, qual a diferença, sobre uma expressão matematica
J

Marcio Duran:

  • algoritmo é o que então ? não pode se a semelhar-se a uma equação !!!, qual a diferença, sobre uma expressão matematica

Álgebra é lógica de conjuntos, não usa equação de primeiro nem de segundo grau. A booleana, claro

S

Thiagosc:
sergiotaborda:
As linguagens de programação permitem a criação de novos simbolos, mas não de novos meta-simbolos. Por exemplo, classes eu crio quantas quiser, mas para criar o conceito de anotação é preciso mudar a estrutura interna da linguagem/plataforma

Isso não acontece em uma lingua normal (que não de programação). É por isso que é linguagem de programação e não lingua de programação…

Você quer dizer “linguagens mainstream”. Linguagens baseadas no Lisp permitem criar coisas totalmente novas. É possível, por exemplo, até customizar o reader que vai ler o código e transformá-lo em um grafo para ser interpretado.

Não conheço muito de Lisp, mas pelo que sei ele usa o paradigma funcional baseado em funções lambda.
Pode modificar a formar como o código é definido (sintax) ? pode adicionar annotations ,por exemplo ?
Ou seja, mudar a linguagem em si ? Acho que não…

Costumizar o reader é modificar algo que já existe. A questão é , consegue fazer criando algo novo ?

M

juliocbq:

Álgebra é lógica de conjuntos, não usa equação de primeiro nem de segundo grau. A booleana, claro

O termo “aritmética” é também utilizado para se referir a teoria dos números, algoritmo não deixa de fazer parte disso, em relação a Booleana posso vincular algoritmo de busca.

Detalhe interessante:Stephen Cole Kleene, que desenvolveu as expressões regulares como uma notação ao que ele chamava de álgebra de conjuntos regulares, o que serviu de base para os primeiros algoritmos computacionais de busca, e depois para algumas das mais antigas ferramentas de tratamento de texto da plataforma Unix.
[size=18]
Fonte:
[/size]

J

Ninguém disse que não se pode utilizar algoritmos para resolver equações. Quero dizer, que expressões regulares e teoria de conjuntos não são cálculo, são a base da resolução de problemas computacionais(Já para o mundo real usa-se, ao invés da booleana, a fuzzy).

T

sergiotaborda:
Não conheço muito de Lisp, mas pelo que sei ele usa o paradigma funcional baseado em funções lambda.
Pode modificar a formar como o código é definido (sintax) ? pode adicionar annotations ,por exemplo ?
Ou seja, mudar a linguagem em si ? Acho que não…

Costumizar o reader é modificar algo que já existe. A questão é , consegue fazer criando algo novo ?

Sim, pode. É por isso que Lisp humilha qualquer linguagem de programação. O Lisp vai muito além de lambdas.

L

Marcio Duran:
juliocbq:

Álgebra é lógica de conjuntos, não usa equação de primeiro nem de segundo grau. A booleana, claro

O termo “aritmética” é também utilizado para se referir a teoria dos números, algoritmo não deixa de fazer parte disso, em relação a Booleana posso vincular algoritmo de busca.

Detalhe interessante:Stephen Cole Kleene, que desenvolveu as expressões regulares como uma notação ao que ele chamava de álgebra de conjuntos regulares, o que serviu de base para os primeiros algoritmos computacionais de busca, e depois para algumas das mais antigas ferramentas de tratamento de texto da plataforma Unix.
[size=18]
Fonte:
[/size]
http://pt.wikipedia.org/wiki/Expressão_regular

o MC duran aprendeu a citar as fontes…
parabens duran…

K

sergiotaborda:
Thiagosc:
sergiotaborda:
As linguagens de programação permitem a criação de novos simbolos, mas não de novos meta-simbolos. Por exemplo, classes eu crio quantas quiser, mas para criar o conceito de anotação é preciso mudar a estrutura interna da linguagem/plataforma

Isso não acontece em uma lingua normal (que não de programação). É por isso que é linguagem de programação e não lingua de programação…

Você quer dizer “linguagens mainstream”. Linguagens baseadas no Lisp permitem criar coisas totalmente novas. É possível, por exemplo, até customizar o reader que vai ler o código e transformá-lo em um grafo para ser interpretado.

Não conheço muito de Lisp, mas pelo que sei ele usa o paradigma funcional baseado em funções lambda.
Pode modificar a formar como o código é definido (sintax) ? pode adicionar annotations ,por exemplo ?
Ou seja, mudar a linguagem em si ? Acho que não…

Costumizar o reader é modificar algo que já existe. A questão é , consegue fazer criando algo novo ?

Por incrível que pareça, pode! :slight_smile: Basta usar as macros do Lisp para que você mude a sintaxe da linguagem ou mesmo adicione novas features.
É assim que são criados diversos dialetos do Lisp, como por exemplo o Arc. Show de bola o negócio.

S

kicolobo:
sergiotaborda:

Não conheço muito de Lisp, mas pelo que sei ele usa o paradigma funcional baseado em funções lambda.
Pode modificar a formar como o código é definido (sintax) ? pode adicionar annotations ,por exemplo ?
Ou seja, mudar a linguagem em si ? Acho que não…

Costumizar o reader é modificar algo que já existe. A questão é , consegue fazer criando algo novo ?

Por incrível que pareça, pode! :slight_smile: Basta usar as macros do Lisp para que você mude a sintaxe da linguagem ou mesmo adicione novas features.
É assim que são criados diversos dialetos do Lisp, como por exemplo o Arc. Show de bola o negócio.

Legal…
Eu posso dizer ao parser/compilador que a sintaxe @Transaction deve fazer o codigo X sobre o codigo Y ?

C

http://www.defmacro.org/ramblings/lisp-ducati.html

Vale dar uma conferida 8)

P

kicolobo:

Por incrível que pareça, pode! :slight_smile: Basta usar as macros do Lisp para que você mude a sintaxe da linguagem ou mesmo adicione novas features.
É assim que são criados diversos dialetos do Lisp, como por exemplo o Arc. Show de bola o negócio.

Uhm… não. Macros permitem criar bastante liberdade com sintaxe (não liberdade completa) mas dialetos de Lisp (pelo menos os mais comuns) não são gerados com macros, são linguagens diferentes com implementações diferentes. Lisp não é funcional mas Scheme é, por exemplo. Clojure tem memória transacional, e por aí vai.

T

pcalcado:
kicolobo:

Por incrível que pareça, pode! :slight_smile: Basta usar as macros do Lisp para que você mude a sintaxe da linguagem ou mesmo adicione novas features.
É assim que são criados diversos dialetos do Lisp, como por exemplo o Arc. Show de bola o negócio.

Uhm… não. Macros permitem criar bastante liberdade com sintaxe (não liberdade completa) mas dialetos de Lisp (pelo menos os mais comuns) não são gerados com macros, são linguagens diferentes com implementações diferentes. Lisp não é funcional mas Scheme é, por exemplo. Clojure tem memória transacional, e por aí vai.

Lisp É funcional e todo Common Lisp tem, por definição, um sistema de macros (caso contrário não é Common Lisp). Clojure não é Lisp, pois não usa Cons cells e não implementa o padrão ANSI. Raro é encontrar um Lisp que não tenha macros, pois esta é uma das principais vantagens.

Sim, no Lisp há liberdade para se alterar o processamento da sintaxe além de macros (veja readtable e reader macros).

Lisp deixa Ruby, Python e todas essas linguagens da moda no chinelo.

EDIT: Macros tornam possível um nível de metaprogramação inigualável em comparação com outras linguagens que não usam S expressions. Recebe-se código como dados e gera-se mais código baseado nisso. Um sistema de Annotations seria facilmente implementado ao se definir novas macros que ao serem invocadas gerassem o código para atualizar as estruturas apropriadas, de forma transparente ao desenvolvedor.

Outro exemplo, o padrão ANSI não estabelece AOP, mas seria facilmente implementável com o uso de macros. Sem a necessidade de alteração alguma na VM.

P

Eu geralmente não respondo troll mas este pode ser informativo…

Não. Lisp é uma linguagem inventada em 1950 que originou uma miríade de linguagens parecidas. Lisp não é (era) funcional. Common Lisp não é funcional -tem a special form set para começo de conversa. Linguagens puramente funcionais não têm estado mutável.

Essa fase mostra que você está fazendo uma confusão enorme entre Common Lisp (uma linguagem da família, assim como Scheme é outra linguagem da mesma família) e a família de linguagens Lisp. Além disso eu não falei em lugar algum que CL ou Lisp não possuem macros então seu comentário está, no mínimo, fora de contexto.

Thiagosc:

Clojure não é Lisp, pois não usa Cons cells

Clojure é um dialeto de Lisp. Eu nunca vi nenhuma definição formal do que é ser ou não er parte da família de linguagens mas creio que isso estará muito mais ligado à s-expressions do que com a existência de con (que nada mais é do que uma função que retorna o primeiro elemento de uma lista ligada). Ainda que fosse relevante, Clojure possui os conceitos básicos de lista do lisp original (e, mais uma vez, lisp original != Common Lisp). con é first, car é rest e cons continua cons. Só o menmônico mudou, uma sequence em Clojure é análoga a uma lista em outros Lisps.

Claro que ela não implementa ANSI, quem é definido pelo padrão é Common Lisp(uma das linguagens da família) e não Lisp (a família).

E…?

Reader macros são macros, então dizer que estão “além de macros” é, no mínimo, estranho.

C

Uma linguagem nao é considerada funcional pela ausencia de estado mutavel, mas por permitir que programas sejam escritos de forma a retornar valor ao inves de alterar estado. A questao de ser pura ou nao sempre vai depender da linguagem oferecer um modelo pra gerenciar estado, como é o caso de transactions em clojure e monads em haskell.

Nesse sentido todo o lisp é funcional, como tb sao consideradas ouras linguagens, como Ruby e Python.

T

pcalcado:
Thiagosc:

Lisp É funcional

Não. Lisp é uma linguagem inventada em 1950 que originou uma miríade de linguagens parecidas. Lisp não é (era) funcional. Common Lisp não é funcional -tem a special form set para começo de conversa. Linguagens puramente funcionais não têm estado mutável.

Não há nenhum special form “set” em Common Lisp. Existe uma “setq” para atribuição que não é tão usada assim, assim como em Scheme existem outras formas de se fazer a mesmas coisa (i.e., atribuição em escopos léxicos ou dinâmicos). Se Scheme é funcional então Lisp é funcional.

Uma linguagem puramente funcional, i.e., completamente sem efeitos colaterais e cujas funções retornam sempre os mesmos valores para os mesmos parâmetros, seria inútil. Pode ser interessante do ponto de vista acadêmico e matemático para se testar algoritmos, mas se queremos desenvolver produtos comercializáveis precisamos de efeitos colaterais. Exemplos de efeito colateral: um jogo de computador que altera o estado da memória para exibir diferentes tipos de imagens, uma aplicação que altera estruturas de dados para assim poder exibir um relatório, etc.

pcalcado:

Essa fase mostra que você está fazendo uma confusão enorme entre Common Lisp (uma linguagem da família, assim como Scheme é outra linguagem da mesma família) e a família de linguagens Lisp. Além disso eu não falei em lugar algum que CL ou Lisp não possuem macros então seu comentário está, no mínimo, fora de contexto.

Common Lisp não é linguagem, mas sim uma especificação.

A família de linguagens Lisp conta com muitos dialetos cujas principais features foram reunidas no que se denominou “Common Lisp”. A especificação surgiu justamente para se definir um denominador comum entre os Lisps, mas nada impede que diferentes implementações tenham features extras.

Um Lisp sem CLOS, sem condition system, sem macros, sem “loop” não é Lisp, pois geralmente essas são as features mais reconhecidas por quem desenvolve nessa linguagem.

Portanto se Clojure não conta com essas coisas, não é um Lisp. Pode ser algo inspirado no Lisp, mas diferente. Assim como o criador do Ruby pode ter se inspirado em Scheme, mas Ruby jamais poderia ser considerado da família “Scheme”.

pcalcado:

Thiagosc:

Clojure não é Lisp, pois não usa Cons cells

Clojure é um dialeto de Lisp. Eu nunca vi nenhuma definição formal do que é ser ou não er parte da família de linguagens mas creio que isso estará muito mais ligado à s-expressions do que com a existência de con (que nada mais é do que uma função que retorna o primeiro elemento de uma lista ligada). Ainda que fosse relevante, Clojure possui os conceitos básicos de lista do lisp original (e, mais uma vez, lisp original != Common Lisp). con é first, car é rest e cons continua cons. Só o menmônico mudou, uma sequence em Clojure é análoga a uma lista em outros Lisps.

O que as pessoas se esquecem é nos anos 80 pessoas competentes já criaram o Common Lisp justamente para evitar a fragmentação do mercado. Eles pegaram aquelas features mais importantes encontradas em diversos dialetos e estabeleceram-nas como padrão.

Existem diversas coisas não especificadas (como reflection por exemplo, ou bibliotecas mais abrangentes), mas o núcleo básico é aquele. Cons cells são como o código é construído pelo leitor, o que permite fácil manipulação da estrutura pelo desenvolvedor (é uma árvore/grafo feita de singly linked lists, portanto posso facilmente adicionar novas listas em posições, extendê-la, separá-la em partes, etc). Se um vetor é usado, o que permite acesso direto pelo índice, como posso alterá-lo sem precisar realocar outro vetor de maior ou menor tamanho? Isso é um detalhe de implementação, mas esses detalhes influenciam no desenvolvimento, porque o desenvolvedor em Lisp tem acesso ao código como se fossem dados. Portanto a estrutura dos dados importa.

O Clojure é mais uma tentativa de quem não conhece Lisp de fazer um “Lisp melhor” baseado em suas próprias misconceptions, utilizando-se do nome “Lisp” para se auto-promover e para promover a sua nova linguagem.

pcalcado:

Claro que ela não implementa ANSI, quem é definido pelo padrão é Common Lisp(uma das linguagens da família) e não Lisp (a família).

Common Lisp não é uma linguagem, mas sim uma especificação.

pcalcado:

Reader macros são macros, então dizer que estão “além de macros” é, no mínimo, estranho.

Não, não são. Procure se informar. O Reader no Common Lisp é customizável, pode-se alterar o código que lê os caracteres ou usar novos caracteres com significados diferentes.

V

Se macros são tão boas assim, o que há de ruim em usá-las de forma pesada no C para “deixá-lo com a minha cara”?

C

Fazer um lisp melhor neste eu entendo por fazer um lisp que roda na JVM.

Mas quais seriam os equivocos na sua opiniao, principalmente em relacao ao reader nao ser tao customizavel?

P

cmoscoso:

Uma linguagem nao é considerada funcional pela ausencia de estado mutavel, mas por permitir que programas sejam escritos de forma a retornar valor ao inves de alterar estado. A questao de ser pura ou nao sempre vai depender da linguagem oferecer um modelo pra gerenciar estado, como é o caso de transactions em clojure e monads em haskell.

Nesse sentido todo o lisp é funcional, como tb sao consideradas ouras linguagens, como Ruby e Python.

Eu simplifiquei a afirmação acima mas o que faz uma linguagem ser considerada funcional é o fato de que suas funções se comportam como funções matemáticas, onde não existe estado mutável e, por isso, toda a comunicação é feita retornando valores. Pela sua definição qualquer linguagem com procedimentos (procedimentos != função) é funcional.

O que Haskell usa, monads, são um “truque” (descrito elo próprio Meijer) para permitir alteração de estado. Tem uma explicação simples no wikibooks:

http://en.wikibooks.org/wiki/Programming:Haskell_monads:

Input/Output needs bind

[…]

Performing input/output in a purely functional language like Haskell has long been a fundamental problem. How to implement operations like getChar which returns the latest character that the user has typed or putChar c which prints the character c on the screen? Giving getChar the type getChar :: Char is not an option, since a pure function with no arguments must be constant. We somehow have to capture that getChar also performs the side effect of interacting with the user. Likewise, a type putChar :: Char -> () is useless since the only value this function can return has to be ().

The breakthrough came when it was realized[4] that monads, […] can be used to elegantly deal with side effects. The idea is to give our two primitive operations the types

getChar :: IO Char
putChar :: Char -> IO ()

and interpret a value of type IO a as a computation or action that performs a side effect before returning the value a. This is rather abstract, so a more concrete way is to interpret IO as a state transformer

type IO a = World -> (a, World)

that acts on and changes the “state of the world”. In other words, printing a character takes the world and returns one where the character has been printed and reading a character returns a world where the character has been read

P

Não importa se é usada ou não (na verdade ela não é “tão usada” diretamente pelo programador), a existência de estado mutável faz com que ela não seja funcional. Eu não programo em Scheme para firmar nada além do que conta a documentaçào ma ara CL recomendo o ‘Practical Common Lisp’, que é uma leitura excelente e possui versão online gratuita:

Common Lisp é uma linguagem tanto quando Java é uma linguagem. Common Lisp é uma especificação tanto quanto Java é uma especificação.

O resto da sua mensagem é completamente baseado na teoria de que Common Lisp é uma espécie de unificação do Lisp. Bom, não é. Qualquer referência vai te mostrar que Common Lisp, Alisp, ELisp, Arc, Scheme e Clojure são linguagens diferentes pertencentes a mesma família então vou poupar o trabalho.

http://community.schemewiki.org/?scheme-faq-general
http://www.lispniks.com/faq/faq.html#s7q1

M

Acho que esse video cabe bem aqui neste post !!!

[size=20]; )[/size] hahahhhhhhaaaaa !!!

[size=12]Ruby on Rails vs Java - RailsEnvy.com Commerical[/size]
[youtube]http://www.youtube.com/watch?v=PQbuyKUaKFo&feature=related[/youtube]

T

Macros de C são um animal completamente diferente de Lisp. As macros de C são pouca coisa além de simples substituidores de texto burros.

T

Common Lisp é uma especificação, tanto que as implementações tem nomes diferentes, tais como:

http://common-lisp.net/~dlw/LispSurvey.html

  • Allegro CL
  • Armed Bear CL
  • CMU CL
  • Corman CL
  • Embedded CL
  • GNU CL
  • GNU CLISP
  • LispWorks
  • Scieneer CL
  • Steel Bank CL

Como eu disse, linguagens puramente funcionais são inúteis. Lisp é tão funcional quanto Ruby, Scheme e outras, ou seja, funcional o suficiente para ser útil.

P

Que bom então que você percebeu que, ao contrário do que tinha falado antes, Common Lisp não é uma unificação de Lisp e sim apenas um dos muitos dialetos derivados do Lisp original (como eles mesmo dizem no FAQ, aliás). Como você bem notou Common Lisp tem várias implementações, assim como Java.

Bom, é sua palavra contra Haskell, que é puramente funcional:

http://www.haskell.org/haskellwiki/Introduction#Does_anyone_use_functional_programming.3F

Recomendo que você revisite o tópico sobre monads para entender como uma linguagem puramente funcional (como Haskell ou Erlang) pode ser útil.

J

esse tipo de discussão é inútil. saber tudo de uma linguagem de programação não te deixa bom programador.

M

Algumas particularidades são de importantes observações, então o debate torna-se válido, o que acho que você deva estar fazendo confusão sobre programação em si, e não é isso que estamos aqui colocando aqui, e sim da aplicação sobre o melhor uso da tecnologia.

J

Desculpe, não quero julgar ninguém…mas só vejo discussão sobre “Lisp é funcional ou não”, isso é melhor que aquilo. Não vejo como isso pode ajudar alguém.

T

pcalcado:
Thiagosc:

Common Lisp é uma especificação, tanto que as implementações tem nomes diferentes, tais como:

Que bom então que você percebeu que, ao contrário do que tinha falado antes, Common Lisp não é uma unificação de Lisp e sim apenas um dos muitos dialetos derivados do Lisp original (como eles mesmo dizem no FAQ, aliás). Como você bem notou Common Lisp tem várias implementações, assim como Java.

Common Lisp se chama “Common” justamente porque é um denominador comum entre vários Lisps. Na época em que a especificação foi feita existiam (e ainda existem) diversas implementações com diversas features diferentes e incompatíveis com as demais. A motivação do Common Lisp foi justamente estabelecer um padrão comum para o mercado Lisp.

pcalcado:

Bom, é sua palavra contra Haskell, que é puramente funcional:

http://www.haskell.org/haskellwiki/Introduction#Does_anyone_use_functional_programming.3F

Recomendo que você revisite o tópico sobre monads para entender como uma linguagem puramente funcional (como Haskell ou Erlang) pode ser útil.

Usar Haskell como parâmetro do que é e não é funcional é como querer usar Smalltalk para delimitar o que é OO e dizer “Java não é OO”.

Java não é um OO muito católico, mas é OO. Não como implementado em outras linguagens, e não como visualizado pelos criadores do conceito de OO, mas é uma implementação de OO.

Basta entender o que significa “puramente funcional” para entender as óbvias limitações para um uso mais sério. Alguns podem ter contornado de alguma forma essas limitações, mas elas não deixaram de existir.

Curiosamente, os mesmos que acham que Lisp não é funcional, pasmém, acham que Ruby e Scheme são funcionais.

C

Nao. Procedimentos me lembra chaves, instrucoes por linha, metodos void e side-effects.

P

pcalcado:
Thiagosc:

Common Lisp é uma especificação, tanto que as implementações tem nomes diferentes, tais como:

Que bom então que você percebeu que, ao contrário do que tinha falado antes, Common Lisp não é uma unificação de Lisp e sim apenas um dos muitos dialetos derivados do Lisp original (como eles mesmo dizem no FAQ, aliás). Como você bem notou Common Lisp tem várias implementações, assim como Java.

Bom, é sua palavra contra Haskell, que é puramente funcional:

http://www.haskell.org/haskellwiki/Introduction#Does_anyone_use_functional_programming.3F

Recomendo que você revisite o tópico sobre monads para entender como uma linguagem puramente funcional (como Haskell ou Erlang) pode ser útil.

Só lembrando que existe a possibilidade de side-effects em linguagens puramente funcionais quando estas trabalham com IO / Sockets. :XD:

particularmente gosto da implementação da linguagem Erlang (apesar de muita gente achar a sintaxe dela horrível), justamente porque os processos em erlang são muito leves, não compartilham memória e se comunicam através de passagem de mensagem…isso é um conceito da linguagem, o que é muito legal para você criar processos distribuídos / tolerante a falhas. Linguagens funcionais têm uma natureza de grande valor prático! :slight_smile:

T+

P

Ok, estas versões continuam existindo e, ao contrário do que você disse antes, elas (Scheme, Arc, ALisp, Elisp, etc.) são Lisp e não são Common Lisp (Scheme possui sua própria especificação IEEE, aliás). Acho que nos entendemos quanto a isso.

Thiagosc:

Haskell é puramente funcional e é uma linguagem de uso genérico, com diversos programas escritos, logo sua afirmação sobre linguagens puramente funcionais não serem úteis está errada.

Acho que você ainda não entendeu que “sem efeito colateral” não significa ïnútil" porque não leu o texto que eu recomendei sobre monads.

Bom, cansei de alimentar troll. Os links estão aí, boa sorte e até nunca mais.

P

cmoscoso:
pcalcado:

Eu simplifiquei a afirmação acima mas o que faz uma linguagem ser considerada funcional é o fato de que suas funções se comportam como funções matemáticas, onde não existe estado mutável e, por isso, toda a comunicação é feita retornando valores. Pela sua definição qualquer linguagem com procedimentos (procedimentos != função) é funcional.

Nao. Procedimentos me lembra chaves, instrucoes por linha, metodos void e side-effects.

Não entendi. Procedimentos são funções que podem causar efeitos colaterais, basicamente, não importa tipo de retorno ou qualquer coisa do tipo.

Não confundir com o uso de palavras-chave procerue e function por algumas linguagens, não tem muito a ver com o conceito, creio.

V

pcalcado:
cmoscoso:
pcalcado:

Eu simplifiquei a afirmação acima mas o que faz uma linguagem ser considerada funcional é o fato de que suas funções se comportam como funções matemáticas, onde não existe estado mutável e, por isso, toda a comunicação é feita retornando valores. Pela sua definição qualquer linguagem com procedimentos (procedimentos != função) é funcional.

Nao. Procedimentos me lembra chaves, instrucoes por linha, metodos void e side-effects.

Não entendi. Procedimentos são funções que podem causar efeitos colaterais, basicamente, não importa tipo de retorno ou qualquer coisa do tipo.

Não confundir com o uso de palavras-chave procerue e function por algumas linguagens, não tem muito a ver com o conceito, creio.

Pois é, o significado de algumas palavras-chave em linguagens de programação muitas vezes não tem nada a ver com o significado normal delas. Na família de linguagens do C (java incluso) as palavra-chave static e void são exemplos disso.

C

pcalcado:
cmoscoso:
pcalcado:

Eu simplifiquei a afirmação acima mas o que faz uma linguagem ser considerada funcional é o fato de que suas funções se comportam como funções matemáticas, onde não existe estado mutável e, por isso, toda a comunicação é feita retornando valores. Pela sua definição qualquer linguagem com procedimentos (procedimentos != função) é funcional.

Nao. Procedimentos me lembra chaves, instrucoes por linha, metodos void e side-effects.

Não entendi. Procedimentos são funções que podem causar efeitos colaterais, basicamente, não importa tipo de retorno ou qualquer coisa do tipo.

Não confundir com o uso de palavras-chave procerue e function por algumas linguagens, não tem muito a ver com o conceito, creio.

O programa abaixo nao possui estado mutavel. De acordo com sua definicao entao Java é uma linguagem funcional?

String reverse(String arg) { if(arg.length == 0) { return arg; } else { return reverse(arg.substring(1, arg.length)) + arg.substring(0, 1); } }

Nao, pq nao se trata apenas de side-effect. Este, se houver, sera aintroduzido pela aplicacao, nao pela linguagem em si. Uma linguagem é considerada funcional principalmente pelas abstracoes funcionais disponiveis, tail recursion, high-order functions. A forma como gerencia estado me parece apenas um plus da linguagem, mas o que a torna a prova de estupido e permitier que ela propria seja estendida atraves da criacao de outras linguagens.

C

victorwss:
pcalcado:
cmoscoso:
pcalcado:

Eu simplifiquei a afirmação acima mas o que faz uma linguagem ser considerada funcional é o fato de que suas funções se comportam como funções matemáticas, onde não existe estado mutável e, por isso, toda a comunicação é feita retornando valores. Pela sua definição qualquer linguagem com procedimentos (procedimentos != função) é funcional.

Nao. Procedimentos me lembra chaves, instrucoes por linha, metodos void e side-effects.

Não entendi. Procedimentos são funções que podem causar efeitos colaterais, basicamente, não importa tipo de retorno ou qualquer coisa do tipo.

Não confundir com o uso de palavras-chave procerue e function por algumas linguagens, não tem muito a ver com o conceito, creio.

Pois é, o significado de algumas palavras-chave em linguagens de programação muitas vezes não tem nada a ver com o significado normal delas. Na família de linguagens do C (java incluso) as palavra-chave static e void são exemplos disso.

Ate onde sei, em qualquer linguagem, metodo void nao retorna valor. Logo se nao ha retorno para o chamador é pq provavelmente side-effect esta acontecendo. Pode citar algum exemplo onde void nao é… void?

B

Você quer uma linguagem onde os métodos que são feitos para não ter retorno, retornam alguma coisa? Serve Ruby?

C

Bruno Laturner:
cmoscoso:

Ate onde sei, em qualquer linguagem, metodo void nao retorna valor. Logo se nao ha retorno para o chamador é pq provavelmente side-effect esta acontecendo. Pode citar algum exemplo onde void nao é… void?

Você quer uma linguagem onde os métodos que são feitos para não ter retorno, retornam alguma coisa? Serve Ruby?

Exemplos costumam funcionar comigo, mas que eu saiba Ruby nem existe o tipo void. Vc vai ter que se esforcar…

D

kicolobo:
Finalmente consegui externalizar algo que há um bom tempo já havia percebido: uma linguagem de programação (inclua ambiente de desenvolvimento aí) pode tornar uma pessoa estúpida.

Postei no meu blog o argumento: http://www.itexto.net/devkico/?p=172

O que acham?

Eu li o tópico inteiro, para ver que ele deu origem a várias discussões paralelas…

Acho que em vez de estúpida o kicoloco poderia ter utilizado ignorante. De qualquer forma, a resposta é SIM. Mas não em função da linguagem ou do ambiente… mas em conseqüência da evolução.

Exemplo prático, quantos aqui conseguiriam fazer fogo apenas com madeiras e pedras? ou seja, as pessoas de hoje são mais estúpidas ou ignorantes que os homens da idade da pedra? por não ter uma “habilidade” que foi praticamente substituída pela tecnologia (fósforos, isqueiros, etc)

Com relação as máquinas de fabricar mão de obra barata (leiam faculdades e cia), vocês devem avaliar, mesmo entre os mais sábios, quantos aqui conseguiriam a partir de um monte de blocos de montar construir algo" interessante"? Leiam, o que fizeram com a nossa criatividade, que certamente era maior na infância?

Acredito que a questão de fundo está na relação entre conhecimento x agilidade de pensamento x inteligência.

Conhecimento: se obtém com os estudos, exemplos o grau de conhecimento de uma ou mais linguagem, teorias etc.
Agilidade: é a destreza da pessoa e o tempo de resposta observado quando um problema não corriqueiro é apresentado. Essa habilidade é conquista com a experiência e com exercícios que exigem raciocínios (similares aos matemáticos).
inteligência: conceito abstrato e melhor não tentarmos definir, porém podemos dizer que o efeito de uma solução inteligente é obtida com o emprego das outras duas características.

Valeu pelo tópico kico.

fw

P

Não entendi sua pergunta. A linguagem ser (puramente) funcional ou não está relacionada com o fato dela permitir ou não ter side-effects. Seu exemplo não mostra nada além de um programa sem efeitos colaterais escrito em java, uma linguagem onde efeitos colaterais são permitidos.

Como analogia, não usar generics em um programa não faz com que java não tenha generics. Não usar metaprogramação em um programa em Ruby não faz com que Ruby não tenha metaprogramação. Não usar efeitos colaterais em um programa em java não faz com que o Java não tenha efeitos colaterais.

Higher-order function e tail recursion são possíveis em linguagens não funcionais. O que faz uma linguagem ser funcional, como diz o paper, é se comportar como matemática.

C

Ruby e Python entao vc nao considera que sejam funcionais? Sao o que?

pcalcado:

Higher-order function e tail recursion são possíveis em linguagens não funcionais.

Eu disse o contrario?

pcalcado:

O que faz uma linguagem ser funcional, como diz o paper, é se comportar como matemática.

Melhorou, visto que “ausencia total de estado” é muito restritivo.

Alem do que, ausencia total de estado vai depender do uso que sera feito da programacao funcional.

editado: acabei editando ao inves de criar outro post 8)

P

São linguagens imperativas, com tipagem dinâmica e não-funcionais. Por quê?

Se, segundo você, elas caracterizam linguagens funcionais e se são posíveis em linguagens não funcionais… o que caracteriza uma linguagem funcional?

E quem falou em “ausência total de estado”? O que não existe é estado mutável, assim como em matemática.

Não importa o uso que se faça: uma linguagem puramente funcional não deixa estado ser alterado com funções destrutivas. Você pode rogrmar em estilo funcional em praticamente qualquer linguagem (assim como pode programar em estilo OO) mas isso não faz destas linguagens funcionais.

C

Uma linguagem é funcional quanto mais ela possibilita seus usuarios progamarem usando o paradigma funcional. Eu apenas afirmei que essas abstracoes sao recorrentes, nao disse que caracterizam linguagens funcionais. Nesse sentido sao como polimorfismo e heranca nas linguagens OO.

Exato, eu me enganei, ausencia de estado mutavel que é uma definicao restritiva para linguagens funcionais. Como eu disse, se é um estilo promovido pela linguagem, ela é funcional. Nao vejo mal nisso.

pcalcado:

Não importa o uso que se faça: uma linguagem puramente funcional não deixa estado ser alterado com funções destrutivas. Você pode rogrmar em estilo funcional em praticamente qualquer linguagem (assim como pode programar em estilo OO) mas isso não faz destas linguagens funcionais.

Talvez vc esteja achando que fazer uso de uma linguagem funcional pura vai garantir ao programa final os beneficios esperados em termos de processamento paralelo, otimizacao e teste de codigo. Mas uma coisa nao vai levar a outra sem levar em conta as habilidades do programador. Bastaria misturar modulos funcionais com nao funcionais (que usam estruturas monads) para termos um POG puramente funcional.

P

cmoscoso:

Talvez vc esteja achando que fazer uso de uma linguagem funcional pura vai garantir ao programa final os beneficios esperados em termos de processamento paralelo, otimizacao e teste de codigo. Mas uma coisa nao vai levar a outra sem levar em conta as habilidades do programador. Bastaria misturar modulos funcionais com nao funcionais (que usam estruturas monads) para termos um POG puramente funcional.

Eu não falei em momento algum de benefícios de linguagens funcionais nesta thread, apenas do que faz uma linguagem ser (puramente) funcional. E sua maior característica é a ausência de estado mutável. Não entendi sua colocação.

V

Ate onde sei, em qualquer linguagem, metodo void nao retorna valor. Logo se nao ha retorno para o chamador é pq provavelmente side-effect esta acontecendo. Pode citar algum exemplo onde void nao é… void?

Você não entendeu o que eu quis dizer.
“void” (de acordo com o dicionário) significa “sem valor”, “sem efeito”, “inválido”. Dizer que o método setQualquerCoisa é {“sem valor” | “sem efeito” | “inválido” } não é correto. Se ao invés de “void” a palavra-chave se chamasse “no_return”, por exemplo, o nome dela estaria mais perto do significado real.
“static” traduz para “estático”, que significa “paralizado”, “imóvel”, “firme”, “em repouso”. Obviamente, também não é uma palavra boa para dizer que um atributo, classe interna ou método não necessita de uma instância da classe para ser usado.

C

Ate onde sei, em qualquer linguagem, metodo void nao retorna valor. Logo se nao ha retorno para o chamador é pq provavelmente side-effect esta acontecendo. Pode citar algum exemplo onde void nao é… void?

Você não entendeu o que eu quis dizer.
“void” (de acordo com o dicionário) significa “sem valor”, “sem efeito”, “inválido”. Dizer que o método setQualquerCoisa é {“sem valor” | “sem efeito” | “inválido” } não é correto. Se ao invés de “void” a palavra-chave se chamasse “no_return”, por exemplo, o nome dela estaria mais perto do significado real.
“static” traduz para “estático”, que significa “paralizado”, “imóvel”, “firme”, “em repouso”. Obviamente, também não é uma palavra boa para dizer que um atributo, classe interna ou método não necessita de uma instância da classe para ser usado.

Entendi. Mas significado real neste caso nao é o que esta escrito num dicionario de lingua falada e sim como o compilador da linguagem interpreta o sinal. E void sinaliza que um aspecto da funcao (o retorno) é vazio, ou sem valor.

Eu disse que uma funcao que nao retorna valor altera estado pq sernao seria inutil ser chamada. Mas nao me lembro de linguagens funcionais que facam uso de void, linguagens multiparadigmas tudo é tao imperativo ou funcional quanto quiserem, ou seja, os beneficios que se espera obter.

V

Ate onde sei, em qualquer linguagem, metodo void nao retorna valor. Logo se nao ha retorno para o chamador é pq provavelmente side-effect esta acontecendo. Pode citar algum exemplo onde void nao é… void?

Você não entendeu o que eu quis dizer.
“void” (de acordo com o dicionário) significa “sem valor”, “sem efeito”, “inválido”. Dizer que o método setQualquerCoisa é {“sem valor” | “sem efeito” | “inválido” } não é correto. Se ao invés de “void” a palavra-chave se chamasse “no_return”, por exemplo, o nome dela estaria mais perto do significado real.
“static” traduz para “estático”, que significa “paralizado”, “imóvel”, “firme”, “em repouso”. Obviamente, também não é uma palavra boa para dizer que um atributo, classe interna ou método não necessita de uma instância da classe para ser usado.

Entendi. Mas significado real neste caso nao é o que esta escrito num dicionario de lingua falada e sim como o compilador da linguagem interpreta o sinal. E void sinaliza que um aspecto da funcao (o retorno) é vazio, ou sem valor.

Eu disse que uma funcao que nao retorna valor altera estado pq sernao seria inutil ser chamada. Mas nao me lembro de linguagens funcionais que facam uso de void, linguagens multiparadigmas tudo é tao imperativo ou funcional quanto quiserem, ou seja, os beneficios que se espera obter.

Sim, significa “retorno vazio”, “sem valor de retorno”. Mas o termo “void” não é uma palavra que na língüa inglesa reflita isso bem. Obviamente, há sim alguma relação da palavra com o significado na linguagem de programação, mas essa relação é um tanto enfraquecida porque “void” não é uma palavra que descreve bem esse significado. O mesmo ocorre com “static”.

E normalmente as palavras-chave são palavras na língua inglesa cujo significado coloquial seja próximo ao significado na linguagem de programação, tal como ocorre com as palavras “while”, “if”, “public”, “class”, “package”, “true”, “false”, “null”, “break”, “continue”, “boolean”, “char” e muitas outras. Mas “void” e “static” são palavras-chave que o significado coloquial já se afasta bem mais do que o significado na linguagem de programação.

Criado 23 de novembro de 2008
Ultima resposta 30 de nov. de 2008
Respostas 77
Participantes 18