ti-enxame.com

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

Ao aprender uma nova linguagem de programação, você às vezes encontra um recurso de linguagem que faz com que você deseje tê-lo em suas 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 é geradores in 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-únicos 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?

25
Brian R. Bondy

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 (uma vez 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.

25
Maciej Piechotka

Macros LISP.

A linguagem de macro LISP é LISP, com alguns recursos de sintaxe predefinidos por conveniência. Utilizando-os, é possível adicionar recursos principais 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 possível a macro setf, que é uma macro conceitualmente muito poderosa: (setf A B) significa que, quando você avaliar A, obterá B, e isso poderá ser estendido para qualquer limite que você desejar.

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

21
David Thornley

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.

18
grokus

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

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

14
P Shved

Rendimento em Python

Em Python (e acredito em C #), você pode definir um gerador chamado que interrompe a execução da função em uma instrução yield, retorna o valor e, nas chamadas subseqüentes, reinicia a função em que ela foi interrompida (com o estado preservado entre as chamadas). Isso é ótimo para gerar longas listas de valores nos quais você só está interessado no valor atual da função (o que é muito comum) .Ele permite que você crie potencialmente infinitamente seqüências longas enquanto ocupam apenas um espaço muito limitado na memória.

12
Chinmay Kanchi

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; even PHP conseguiu hackear eles de alguma forma. Mas eles eram semi-únicos na época.

8
Timwi

Continuação de Esquema (posteriormente adotado por alguns outros idiomas, incluindo Ruby.)

8
finnw

Enviar

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
7
Jonas

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 todas as mesmas funções da teoria dos conjuntos (ou seja, diferença, interseção, união).

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

7
Peter Turner

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.

Isenção de responsabilidade:

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.

5
Evan Plaice

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;
}
5
TheLQ

Eu realmente gosto do a menos modificador 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

5
Jaco Pretorius

fancy python

Não tenho certeza de como isso é único, mas em python você pode fazer coisas legais, como fazer com que pares de palavras-chave sejam automaticamente transformados em um dicionário e vice-versa. O mesmo ocorre 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')

documentação do python (role para baixo para obter mais informações sobre como colar argumentos)

5
Gordon Gustafson

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

4
ern0

categorias de 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, pois a implementação de um método por uma categoria substituirá a implementação de seus pais.

3
aprock

Método Ruby de injeção combinado com o método O símbolo # to_proc recurso de 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.

2
tcrosley

O Mecanismo de Ligação em JavaFX (R.I.P). 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 falhado de várias maneiras, achei muitos recursos da linguagem de script bastante agradáveis.

1
Oliver Weiler

Mixins de strings mais avaliação da função de tempo de compilação em D são 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.

1
dsimcha