Instrução With
Um padrão comum envolvendo a criação de um objeto é chamar uma série de funções e definir uma série de propriedades imediatamente após criá-lo.
Isso resulta em repetir o nome do objeto várias vezes no código, adicionando ruído desnecessário. Uma solução comum para isso é passar uma tabela como argumento que contém uma coleção de chaves e valores para sobrescrever. O inconveniente é que o construtor desse objeto deve suportar essa forma.
O bloco with ajuda a aliviar isso. Dentro de um bloco with podemos usar instruções especiais que começam com . ou \ que representam essas operações aplicadas ao objeto com o qual estamos usando with.
Por exemplo, trabalhamos com um objeto recém-criado:
with Person! .name = "Oswald" \add_relative my_dad \save! print .namewith Person! .name = "Oswald" \add_relative my_dad \save! print .nameA instrução with também pode ser usada como expressão que retorna o valor ao qual foi dado acesso.
file = with File "favorite_foods.txt" \set_encoding "utf8"file = with File "favorite_foods.txt" \set_encoding "utf8"Expressões with suportam break com um valor:
result = with obj break .valueresult = with obj break .valueDepois que break value é usado dentro de with, a expressão with deixa de retornar seu objeto-alvo e passa a retornar o valor de break.
a = with obj .x = 1-- a é obj
b = with obj break .x-- b é .x, não obja = with obj .x = 1-- a é obj
b = with obj break .x-- b é .x, não objDiferente de for / while / repeat / do, with suporta apenas um valor de break.
Ou…
create_person = (name, relatives) -> with Person! .name = name \add_relative relative for relative in *relatives
me = create_person "Leaf", [dad, mother, sister]create_person = (name, relatives) -> with Person! .name = name \add_relative relative for relative in *relatives
me = create_person "Leaf", [dad, mother, sister]Neste uso, with pode ser visto como uma forma especial do combinador K.
A expressão na instrução with também pode ser uma atribuição, se você quiser dar um nome à expressão.
with str := "Hello" print "original:", str print "upper:", \upper!with str := "Hello" print "original:", str print "upper:", \upper!Você pode acessar chaves especiais com [] em uma instrução with.
with tb [1] = 1 print [2] with [abc] [3] = [2]\func! ["key-name"] = value [] = "abc" -- anexando a "tb"with tb [1] = 1 print [2] with [abc] [3] = [2]\func! ["key-name"] = value [] = "abc" -- anexando a "tb"with? é uma versão aprimorada da sintaxe with, que introduz uma verificação existencial para acessar com segurança objetos que podem ser nil sem verificações explícitas de null.
with? obj print .namewith? obj print .name