Sugar
- Pony permite que você omite certos pequenos detalhes de seu código e os colocará de volta para você. Isto é feito para ajudar a tornar seu código menos desordenado e mais legível. O uso de sugar é totalmente opcional, você pode sempre escrever a versão completa, se preferir.
Aplicar
Muitas classes de Pony têm uma função chamada "Pony" que executa qualquer ação mais comum para esse tipo. Pony permite omitir a palavra apply e apenas tentar fazer uma chamada diretamente sobre o objeto. Por isso:
var foo = Foo.create()
foo()
- Que se transforma em:
var foo = Foo.create()
foo.apply()
- Quaisquer argumentos necessários podem ser acrescentados, assim como as chamadas ao método normal.
var foo = Foo.create()
foo(x, 37 where crash = false)
- Que se torna:
var foo = Foo.create()
foo.apply(x, 37 where crash = false)
- Ainda preciso fornecer os argumentos para aplicar? Sim, apenas o aplicar será adicionado para você, o número e o tipo correto de argumentos deve ser fornecido. Os argumentos predefinidos e nomeados podem ser usados normalmente.
- Como chamar uma função foo se a aplicação for adicionada? O sugar aplicável só é adicionado quando se chama um objeto, não quando se chama um método. O compilador pode dizer a diferença e só adiciona o aplicável quando apropriado.
Criar
Para criar um objeto você precisa especificar o tipo e chamar um construtor. Pony permite que você perca o construtor e irá inserir uma chamada para criar() para você. Assim:
var foo = Foo
- Que se torna:
var foo = Foo.create()
- Normalmente os tipos não são coisas válidas para aparecer em expressões, portanto, omitir a chamada do construtor não é ambíguo. Lembre-se de que você pode facilmente perceber que um nome é um tipo porque ele começará com uma letra maiúscula.
- Se forem necessários argumentos para criá-los, eles podem ser fornecidos como se fosse chamar o tipo. Argumentos predefinidos e nomeados podem ser usados como normais.
var foo = Foo(x, 37 where crash = false)
- Que se torna:
var foo = Foo.create(x, 37 where crash = false)
- E se eu quiser usar um construtor que não seja nomeado create? Então o sugar não pode ajudá-lo e você mesmo tem que escrevê-lo.
- Se a criação que eu quero chamar não aceita argumentos, posso ainda colocar entre parênteses?
Criar-apply combinado
Se um tipo tem um construtor que não aceita argumentos, então o sugar pode ser criado e aplicado em conjunto. Basta chamar o tipo e as chamadas para criar e aplicar serão adicionadas. A chamada para criar não aceitará argumentos e a chamada para aplicar aceitará quaisquer argumentos que forem fornecidos.
var foo = Foo()
var bar = Bar(x, 37 where crash = false)
- Que torna-se:
var foo = Foo.create().apply()
var bar = Bar.create().apply(x, 37 where crash = false)
- E se a criação tiver argumentos padrão? Eu recebo o sugar combinado de criação-aplicação se eu quiser usar os defaults? O sugar combinado cria-aplicação só pode ser usado quando o criador não tem argumentos. Se houver argumentos padrão, então este sugar não pode ser usado.
Atualização
O sugar de atualização permite que qualquer classe utilize uma atribuição para aceitar dados. Muitos idiomas permitem isso para atribuir em coleções, por exemplo, uma simples matriz C, a[3] = x;. Em qualquer atribuição em que o lado esquerdo é uma chamada de função, o Pony traduz isto para uma chamada de atualização, com o valor do lado direito como um argumento extra. Portanto, o valor do lado direito é um argumento extra:
foo(37) = x
- torna-se:
foo.update(37 where value = x)
- O valor do lado direito da atribuição é sempre passado para um parâmetro chamado valor. Qualquer objeto pode permitir esta sintaxe simplesmente fornecendo uma atualização apropriada da função com um valor de argumento.
Minha função de atualização tem que ter um único parâmetro que leva um número inteiro? Não, você pode definir a atualização para tomar os parâmetros que quiser, desde que haja um chamado valor. Os seguintes estão todos bem:
foo1(2, 3) = x
foo2() = x
foo3(37, "Hello", 3.5 where a = 2, b = 3) = x
- Importa onde o valor aparece na minha lista de parâmetros? Embora não seja estritamente importante, é uma boa prática colocar o valor como último parâmetro. Dessa forma, todos os outros podem ser especificados por posição.