Recursos de linguagem de programação semi-exclusivos do Killer [fechados]


25

Ao aprender uma nova linguagem de programação, você às vezes encontra um recurso de linguagem que faz com que você deseje tê-lo nas outras linguagens de programação que você conhece.

Quais são alguns recursos de linguagem que na época você aprendeu muito novos e que você gostaria que suas outras linguagens de programação tivessem.

Um exemplo disso são os geradores em Python ou C #. Outros exemplos podem incluir compreensão de lista em Python, modelo em C ++ ou LINQ em .NET ou avaliação lenta em Haskell.

Que outros recursos de idioma semi-exclusivos você encontrou e que foram completamente novos e esclarecedores para você? Existem outros recursos de linguagens de programação mais antigas que foram únicos e ficaram fora de moda?

Respostas:


25

Praticamente qualquer coisa em Haskell

  • Mônadas. Sim - a grande palavra assustadora que torna os analisadores incrivelmente fáceis, IO, operações em listas e outras coisas tão fáceis (depois que você percebe um padrão comum)
  • Setas; flechas. O mesmo para usuários avançados;)
  • Material padrão como lambdas etc.
  • Funções de curry
  • Tipos de dados algébricos
  • Correspondência de padrões

E muitos mais.

PS. Sim. Sou fanboy de Haskell, se alguém perguntar.


12
Para ser justo, você deve dar crédito ao ML pela maior parte dessa lista.
munificent

1
Bem - exceto mônadas e flechas IIRC. Mas eles ainda são semi -Unique
Maciej Piechotka

Algum motivo específico para voto negativo?
Maciej Piechotka 23/09/10

2
+1 para correspondência de padrões. Eu mostro para outras pessoas e elas não entendem. Eu acho que é genial.
Barry Brown

Obrigatório ( steve-yegge.blogspot.com/2010/12/… ). BTW, eu dificilmente consideraria lambdas únicas, python, C #, javascript, etc. Mônadas? A maioria dos outros idiomas se refere a ele como encadeamento; o núcleo do jquery é essencialmente um conjunto massivo de mônadas HTML / DOM e AJAX (Google: jQuery.fn). O curry também é relativamente comum hoje em dia.
quer

21

Macros Lisp.

A linguagem de macro Lisp é Lisp, com alguns recursos de sintaxe predefinidos por conveniência. Usando-os, é possível adicionar recursos importantes ao idioma, como a escolha de estilos de orientação a objetos ou a correspondência determinística do tipo Prolog, sem parecer fora do lugar. Isso torna setfpossível a macro, que é uma macro conceitualmente muito poderosa: (setf A B)significa que, quando você avalia, Avocê obtém Be pode ser estendida para qualquer limite que desejar.

A metaprogramação de modelos C ++ é capaz de coisas semelhantes, mas em uma linguagem muito diferente da C ++ comum.


+1 Espero que um dia eu consiga programar em um dialeto Lisp.
Oliver Weiler

@Helper ... Via C ++ templates [risos assustador]
mlvljr

@mlvjr: Você é assustador.
David Thornley

De fato, é o único recurso pronto para uso que você precisará em um idioma. Com as macros Lisp, você pode adicionar todos os outros recursos possíveis posteriormente.
SK-logic

18

Decorador de Python.

É extremamente fácil implementar memorização ou tempo de função usando o decorador.

Exemplo de um temporizador de função.

class FuncTimer(object):
    """ Time how much time a function takes """
    def __init__(self, fn):
        self.fn = fn
        self.memo = {}
        self.start_time = time.time()
    def __call__(self, *args):
        self.memo['return'] = self.fn(*args)
        print("Function '%s' took %u seconds" % (self.fn.__name__, time.time() - self.start_time))
        return self.memo['return']

Agora, se você tem uma função que deseja cronometrar, basta fazer isso,

@FuncTimer
def foo():
    # foo's implememtation goes here

Você verá algo como,

A função 'foo' levou 3 segundos.


Java tem anotações, que têm um propósito e sintaxe semelhante, mas trabalho muito diferente
Casebash

1
+1: Os decoradores do Python me impressionaram mais do que quase qualquer outro recurso da linguagem. Eles são muito bonitos e simples!
Adam Paynter

Talvez você possa compartilhar um exemplo simples conosco? Eu não sei Python para ser honesto.
ShdNx 22/09/10

@ShdNx, acabei de adicionar um exemplo.
grokus

1
A hora de início não deve ser calculada como parte da chamada?
detly

14

Transmitindo para void*C. Você pode converter tudo em bytes não processados ​​e fazer o que quiser com esses dados.

(Sim, hoje em dia é único ...)


1
O objeto nas linguagens .Net é muito semelhante. Apenas a mais tipo seguro etc.
Maciej Piechotka

Você pode transmitir para objetos em vários idiomas. Principal problema é que muitas línguas separar primitivos e objetos
Casebash

5
@ Maciej: mesmo no .NET, você não pode realmente converter primitivas em Object. Você os encaixa , e é uma fera bem diferente. Além disso, isso ainda é totalmente diferente para lançar a void*...
Dean Harding

1
A transmissão para PointerPascal e Object Pascal faz a mesma coisa.
Frank Shearar

1
@ DeanHarding: Bem, em C você tem as int64_tquais nem sempre pode transmitir com segurança void *(desculpe pelo atraso - resposta de 2 anos).
Maciej Piechotka

12

Rendimento em Python

No Python (e acredito em C #), você pode definir um gerador chamado que interrompe a execução da função em uma yieldinstrução, retorna o valor e, nas chamadas subseqüentes, reinicia a função de onde parou (com o estado preservado entre as chamadas). Isso é ótimo para gerar longas listas de valores em que você está interessado apenas no valor atual da função (o que é muito comum). Permite construir sequências potencialmente infinitamente longas, ocupando apenas um espaço muito limitado na memória.


1
O rendimento já está listado na pergunta.
Trinidad

Isso remonta ao BCPL.
22411 Peter Peter

8

Expressões lambda (fechamentos, funções aninhadas, métodos anônimos, como você os chama).

Encontrei-os pela primeira vez em Perl, amei-os instantaneamente e me perguntei por que outros idiomas não os têm. Hoje em dia acho que não é mais tão único; até o PHP conseguiu invadir eles de alguma forma. Mas eles eram semi-únicos na época.


5
Única, contanto que você volte ao Lisp, que é a segunda linguagem de programação mais antiga do mercado. ;-)
Michael H.

-1: Não é semi-exclusivo
Casebash 22/09/10


7

Conjuntos em Delphi são muito úteis, praticamente apenas uma matriz booleana nomeada. Eles são muito úteis para salvar um formulário de configurações com 32 caixas de seleção. Mas eles têm as mesmas funções da teoria dos conjuntos (diferença, interseção, união).

Não tenho certeza se eles ficaram fora de moda, mas eu os uso o tempo todo.


Bom, mas não seria fácil de implementar em Java, por exemplo: boolean []?
Mark C

Sim, você pode, mas não acho que seja tão sucinto quanto: TForm = (FF_1500 = 1, FF_CA251 = 5, FF_UB04 = 6, FF_MA10 = 7); TFormSet = conjunto de TForm;
Peter Turner #

7

Mandar

De Erlang. Envia uma mensagem assíncrona para outro thread.

Expr1 ! Expr2

Receber

De Erlang. Recebe uma mensagem de outro segmento.

receive
    Pattern1 [when GuardSeq1] ->
        Body1;
    ...;
    PatternN [when GuardSeqN] ->
        BodyN
end

5

Propriedades de C #

/// <summary>
/// Get ID
/// </summary>
public int ID
{
    get; set;
}

vs

(Java)

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

2
Sim, eles são melhores, mas este é um mau exemplo. A diferença seria muito menor se o getter / setter realmente fizesse algo especial e a versão C # estiver menos documentada.
Bart van Heukelom

1
Meu chefe é fortemente contra as propriedades automáticas do C # e sempre que discutimos sobre isso, nenhum de nós consegue ver por que o outro está certo ou errado. Eu simplesmente os amo porque eles tornam o código muito mais limpo e economizam muito tempo a longo prazo.
mbillard

2
Apenas não permita que isso incentive as pessoas a terem getters e setters por todo o lado. Somente os getters e setters que fazem sentido como ações em um objeto devem ser usados.
David Thornley

3
Eles não são chamados C # propriedades, eles são chamados de auto-propriedades
Jaco Pretorius

1
Auto-propriedades são muito comuns nos dias de hoje. Python, Objective-C ...
Casebash 22/09/10

5

Sindicatos em C

Sinceramente, não posso dizer que não tenha escrito C suficiente para criar um desses, mas trabalhei com o código de outros.

Quando se trata de empacotar misturas de dados diferentes em aplicativos que manipulam bits / bytes brutos, como rede ou armazenamento de dados binários. Em linguagens fortemente tipadas, não há maneira fácil de fazer o equivalente.

Aviso Legal:

Embora os Unions sejam extremamente úteis em alguns casos, eles não são encontrados na maioria dos idiomas de nível superior porque não são do tipo seguro. IE, você pode fazer com que os dados sangrem através dos limites das variáveis ​​usando uniões (um grande não não no tipo mundo seguro). Com grandes poderes vem grandes responsabilidades.


2
IMHO por uma boa razão. A reinterpretação dos dados é uma maneira bonita de se fotografar a pé ( en.wikipedia.org/wiki/Aliasing_(computing) ). Melhor usar conversões explícitas IMHO. Os sindicatos fazendo o caminho certo são os tipos de dados algébricos da IMHO.
Maciej Piechotka

@ Maciej Adicionei um aviso de isenção de responsabilidade necessário. No entanto, não tenho certeza se isso explica com precisão os perigos do uso de sindicatos, pois eu realmente não tenho conhecimento íntimo de usá-los. Eu apenas sei que, onde eu os vi usar, o código era muito mais conciso e fácil de trabalhar do que o equivalente em linguagem de nível superior.
Evan Plaice

O problema é que C é 'linguagem de nível superior' (apenas linguagem de nível superior). Desde o K&R C, existem muitas regras que permitem o uso de código portátil mais rápido. O preço é que o compilador pode assumir várias coisas e algumas podem ficar confusas. A maior parte do unionuso é segura, algumas são expressões bem suportadas (embora tecnicamente não estejam corretas) - consulte cellperformance.beyond3d.com/articles/2006/06/… (embora seja mais problemático o fato de os sindicatos de ponteiros poderem simular).
Maciej Piechotka

O Delphi estendeu sua recordsintaxe para apoiar os sindicatos:in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
Frank Shearar 24/09

5

Eu realmente gosto do modificador , a menos que esteja em Ruby . Parece tão natural e substitui muitos cenários em que seu código parece muito confuso sem ele.

puts "All good" unless input.nil?

Como você pode não gostar disso? : D


6
Perl já tinha antes de Ruby. Eu também adoro.
Barry Brown

1
Nemerle tem palavras-chave semelhantes para unlesse whenque substituem os cenários de ramificação mais comuns que tradicionalmente usariam if/else.
MattDavey

5

sintaxe de argumento de python chique

Não tenho certeza de como isso é único, mas em python você pode fazer coisas legais, como fazer com que os pares de palavras-chave sejam automaticamente transformados em um dicionário e retornados. O mesmo com as listas:

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print "-- This parrot wouldn't", action,
    print "if you put", voltage, "volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "!"


parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')

documentos python (role para baixo para obter mais informações sobre como colar argumentos)


1
+1 por poder passar um parâmetro profundamente na lista sem ter que passar valores para todos os parâmetros opcionais antes dele.
eswald

4

O pré-processador C. Você pode até escrever código comum em diferentes plataformas com - menos ou mais - ifdefs.


2
Existem pré-processadores melhores prontamente disponíveis que dão seu próprio passo extra e funcionam com todos os idiomas.
David Thornley

Estou muito feliz com ifdef, ifndef e mais.
ern0

3

Categorias do Objetivo-C

As categorias oferecem uma maneira fácil de estender a funcionalidade de um objeto em tempo de execução (pense em composição versus herança). O exemplo clássico é adicionar um verificador ortográfico à classe NSString.

@interface NSString (SpellChecker)
- (BOOL) checkSpelling;
@end

Também é útil para correções de bugs de baixo impacto, já que a implementação de um método por uma categoria substituirá a implementação de seus pais.


1
Muito semelhante aos métodos de extensão em C # #
Casebash

2

O método de injeção do Ruby combinado com o recurso Symbol # to_proc do Ruby 1.9 permite escrever um código incrivelmente conciso (mas ainda legível):

por exemplo (1..10).inject(:+)

que soma os números inteiros 1 a 10 => 55

Ver exemplos como esse me fez querer aprender Ruby, o que acabei de começar a fazer.


9
Para ser justo, injectar é a versão do Ruby de dobrar / foldl / foldr de linguagens como Lisp, Haskell, etc.
mipadi

Eu realmente não chamaria isso de único.
Daenyth 23/09/10

1
O título da pergunta diz "semi-único", não único. Certamente, a concisão do código proporcionada pela combinação de injetar (ou mapear etc) e Symbol # to_proc está muito além das linguagens convencionais, como C, Java e C ++.
tcrosley

Muito conciso (e eu gosto), mas não tenho tanta certeza de que seja tão diferente de algo como: Enumerable.Range (1, 10) .Aggregate ((s, x) => s + x); de C # ou outros idiomas
FinnNk

1

O mecanismo de ligação no JavaFX (RIP). A palavra-chave bind permite vincular o valor de uma variável ao valor de uma expressão e livrar-se de todos aqueles ouvintes feios, qualquer que seja o código padrão.

Embora o JavaFX tenha sido um fracasso de várias maneiras, achei muitos recursos da linguagem de script bastante agradáveis.


1

Mixins de strings mais avaliação da função de tempo de compilação em D é um recurso matador bastante exclusivo. Sim, tecnicamente são dois recursos, mas o poder real vem da combinação deles. Com essa combinação, você pode escrever funções D regulares que geram código como uma string no tempo de compilação e, em seguida, misturar esse código em qualquer escopo e fazer com que seja avaliado como código D. regular. O código é totalmente compilado estaticamente e executa exatamente como se tivesse sido manuscrito. Esse recurso é usado até para solucionar algumas situações complicadas na biblioteca padrão.


Eu também gosto do tipo de retorno inferir automaticamente a partir de um método ..
Nawfal
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.