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

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

[quote=pcalcado][quote=Thiagosc]
Common Lisp é uma especificação, tanto que as implementações tem nomes diferentes, tais como:
[/quote]

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.[/quote]

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+

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.

[quote=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.

[quote=cmoscoso][quote=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.
[/quote]

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

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.

[quote=pcalcado][quote=cmoscoso][quote=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.
[/quote]

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

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.[/quote]

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.

[quote=pcalcado][quote=cmoscoso][quote=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.
[/quote]

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

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.[/quote]

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.

[quote=victorwss][quote=pcalcado][quote=cmoscoso][quote=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.
[/quote]

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

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.[/quote]

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.[/quote]

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?

[quote=Bruno Laturner][quote=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?
[/quote]
Você quer uma linguagem onde os métodos que são feitos para não ter retorno, retornam alguma coisa? Serve Ruby?[/quote]

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

[quote=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?[/quote]

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

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.

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

[quote=pcalcado]
Higher-order function e tail recursion são possíveis em linguagens não funcionais.[/quote]

Eu disse o contrario?

[quote=pcalcado]
O que faz uma linguagem ser funcional, como diz o paper, é se comportar como matemática.[/quote]

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)

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.

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.

[quote=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.[/quote]

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.

[quote=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.[/quote]

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.

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?

[/quote]

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.

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?

[/quote]

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.[/quote]

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.

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?

[/quote]

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.[/quote]

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.
[/quote]

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.