diff options
Diffstat (limited to 'doc/yue-pt-br.md')
| -rw-r--r-- | doc/yue-pt-br.md | 2496 |
1 files changed, 2 insertions, 2494 deletions
diff --git a/doc/yue-pt-br.md b/doc/yue-pt-br.md index 7bab231..dac3aad 100644 --- a/doc/yue-pt-br.md +++ b/doc/yue-pt-br.md | |||
| @@ -1,11 +1,5 @@ | |||
| 1 | --- | ||
| 2 | title: Referência | ||
| 3 | --- | ||
| 4 | |||
| 5 | # Documentação do YueScript | 1 | # Documentação do YueScript |
| 6 | 2 | ||
| 7 | <img src="/image/yuescript.svg" width="250px" height="250px" alt="logo" style="padding-top: 3em; padding-bottom: 2em;"/> | ||
| 8 | |||
| 9 | Bem-vindo à documentação oficial do <b>YueScript</b>!<br/> | 3 | Bem-vindo à documentação oficial do <b>YueScript</b>!<br/> |
| 10 | Aqui você encontra recursos da linguagem, uso, exemplos de referência e materiais úteis.<br/> | 4 | Aqui você encontra recursos da linguagem, uso, exemplos de referência e materiais úteis.<br/> |
| 11 | Selecione um capÃtulo na barra lateral para começar a aprender YueScript. | 5 | Selecione um capÃtulo na barra lateral para começar a aprender YueScript. |
| @@ -21,17 +15,6 @@ do | |||
| 21 | print var -- nil aqui | 15 | print var -- nil aqui |
| 22 | ``` | 16 | ``` |
| 23 | 17 | ||
| 24 | <YueDisplay> | ||
| 25 | |||
| 26 | ```yue | ||
| 27 | do | ||
| 28 | var = "hello" | ||
| 29 | print var | ||
| 30 | print var -- nil aqui | ||
| 31 | ``` | ||
| 32 | |||
| 33 | </YueDisplay> | ||
| 34 | |||
| 35 | O **do** do YueScript também pode ser usado como expressão. Permitindo combinar múltiplas linhas em uma. O resultado da expressão do é a última instrução em seu corpo. Expressões `do` suportam usar `break` para interromper o fluxo de execução e retornar múltiplos valores antecipadamente. | 18 | O **do** do YueScript também pode ser usado como expressão. Permitindo combinar múltiplas linhas em uma. O resultado da expressão do é a última instrução em seu corpo. Expressões `do` suportam usar `break` para interromper o fluxo de execução e retornar múltiplos valores antecipadamente. |
| 36 | 19 | ||
| 37 | ```yuescript | 20 | ```yuescript |
| @@ -42,18 +25,6 @@ status, value = do | |||
| 42 | break "small", n | 25 | break "small", n |
| 43 | ``` | 26 | ``` |
| 44 | 27 | ||
| 45 | <YueDisplay> | ||
| 46 | |||
| 47 | ```yue | ||
| 48 | status, value = do | ||
| 49 | n = 12 | ||
| 50 | if n > 10 | ||
| 51 | break "large", n | ||
| 52 | break "small", n | ||
| 53 | ``` | ||
| 54 | |||
| 55 | </YueDisplay> | ||
| 56 | |||
| 57 | ```yuescript | 28 | ```yuescript |
| 58 | counter = do | 29 | counter = do |
| 59 | i = 0 | 30 | i = 0 |
| @@ -65,21 +36,6 @@ print counter! | |||
| 65 | print counter! | 36 | print counter! |
| 66 | ``` | 37 | ``` |
| 67 | 38 | ||
| 68 | <YueDisplay> | ||
| 69 | |||
| 70 | ```yue | ||
| 71 | counter = do | ||
| 72 | i = 0 | ||
| 73 | -> | ||
| 74 | i += 1 | ||
| 75 | i | ||
| 76 | |||
| 77 | print counter! | ||
| 78 | print counter! | ||
| 79 | ``` | ||
| 80 | |||
| 81 | </YueDisplay> | ||
| 82 | |||
| 83 | ```yuescript | 39 | ```yuescript |
| 84 | tbl = { | 40 | tbl = { |
| 85 | key: do | 41 | key: do |
| @@ -88,18 +44,6 @@ tbl = { | |||
| 88 | } | 44 | } |
| 89 | ``` | 45 | ``` |
| 90 | 46 | ||
| 91 | <YueDisplay> | ||
| 92 | |||
| 93 | ```yue | ||
| 94 | tbl = { | ||
| 95 | key: do | ||
| 96 | print "assigning key!" | ||
| 97 | 1234 | ||
| 98 | } | ||
| 99 | ``` | ||
| 100 | |||
| 101 | </YueDisplay> | ||
| 102 | |||
| 103 | # Decoradores de linha | 47 | # Decoradores de linha |
| 104 | 48 | ||
| 105 | Por conveniência, o loop for e a instrução if podem ser aplicados a instruções únicas no final da linha: | 49 | Por conveniência, o loop for e a instrução if podem ser aplicados a instruções únicas no final da linha: |
| @@ -108,28 +52,12 @@ Por conveniência, o loop for e a instrução if podem ser aplicados a instruçà | |||
| 108 | print "hello world" if name == "Rob" | 52 | print "hello world" if name == "Rob" |
| 109 | ``` | 53 | ``` |
| 110 | 54 | ||
| 111 | <YueDisplay> | ||
| 112 | |||
| 113 | ```yue | ||
| 114 | print "hello world" if name == "Rob" | ||
| 115 | ``` | ||
| 116 | |||
| 117 | </YueDisplay> | ||
| 118 | |||
| 119 | E com loops básicos: | 55 | E com loops básicos: |
| 120 | 56 | ||
| 121 | ```yuescript | 57 | ```yuescript |
| 122 | print "item: ", item for item in *items | 58 | print "item: ", item for item in *items |
| 123 | ``` | 59 | ``` |
| 124 | 60 | ||
| 125 | <YueDisplay> | ||
| 126 | |||
| 127 | ```yue | ||
| 128 | print "item: ", item for item in *items | ||
| 129 | ``` | ||
| 130 | |||
| 131 | </YueDisplay> | ||
| 132 | |||
| 133 | E com loops while: | 61 | E com loops while: |
| 134 | 62 | ||
| 135 | ```yuescript | 63 | ```yuescript |
| @@ -138,16 +66,6 @@ game\update! while game\isRunning! | |||
| 138 | reader\parse_line! until reader\eof! | 66 | reader\parse_line! until reader\eof! |
| 139 | ``` | 67 | ``` |
| 140 | 68 | ||
| 141 | <YueDisplay> | ||
| 142 | |||
| 143 | ```yue | ||
| 144 | game\update! while game\isRunning! | ||
| 145 | |||
| 146 | reader\parse_line! until reader\eof! | ||
| 147 | ``` | ||
| 148 | |||
| 149 | </YueDisplay> | ||
| 150 | |||
| 151 | # Macro | 69 | # Macro |
| 152 | 70 | ||
| 153 | ## Uso comum | 71 | ## Uso comum |
| @@ -183,39 +101,6 @@ if $and f1!, f2!, f3! | |||
| 183 | print "OK" | 101 | print "OK" |
| 184 | ``` | 102 | ``` |
| 185 | 103 | ||
| 186 | <YueDisplay> | ||
| 187 | |||
| 188 | ```yue | ||
| 189 | macro PI2 = -> math.pi * 2 | ||
| 190 | area = $PI2 * 5 | ||
| 191 | |||
| 192 | macro HELLO = -> "'hello world'" | ||
| 193 | print $HELLO | ||
| 194 | |||
| 195 | macro config = (debugging) -> | ||
| 196 | global debugMode = debugging == "true" | ||
| 197 | "" | ||
| 198 | |||
| 199 | macro asserts = (cond) -> | ||
| 200 | debugMode and "assert #{cond}" or "" | ||
| 201 | |||
| 202 | macro assert = (cond) -> | ||
| 203 | debugMode and "assert #{cond}" or "#{cond}" | ||
| 204 | |||
| 205 | $config true | ||
| 206 | $asserts item ~= nil | ||
| 207 | |||
| 208 | $config false | ||
| 209 | value = $assert item | ||
| 210 | |||
| 211 | -- as expressões passadas são tratadas como strings | ||
| 212 | macro and = (...) -> "#{ table.concat {...}, ' and ' }" | ||
| 213 | if $and f1!, f2!, f3! | ||
| 214 | print "OK" | ||
| 215 | ``` | ||
| 216 | |||
| 217 | </YueDisplay> | ||
| 218 | |||
| 219 | ## Inserir códigos brutos | 104 | ## Inserir códigos brutos |
| 220 | 105 | ||
| 221 | Uma função macro pode retornar uma string YueScript ou uma tabela de configuração contendo códigos Lua. | 106 | Uma função macro pode retornar uma string YueScript ou uma tabela de configuração contendo códigos Lua. |
| @@ -246,36 +131,6 @@ end | |||
| 246 | ]==] | 131 | ]==] |
| 247 | ``` | 132 | ``` |
| 248 | 133 | ||
| 249 | <YueDisplay> | ||
| 250 | |||
| 251 | ```yue | ||
| 252 | macro yueFunc = (var) -> "local #{var} = ->" | ||
| 253 | $yueFunc funcA | ||
| 254 | funcA = -> "fail to assign to the Yue macro defined variable" | ||
| 255 | |||
| 256 | macro luaFunc = (var) -> { | ||
| 257 | code: "local function #{var}() end" | ||
| 258 | type: "lua" | ||
| 259 | } | ||
| 260 | $luaFunc funcB | ||
| 261 | funcB = -> "fail to assign to the Lua macro defined variable" | ||
| 262 | |||
| 263 | macro lua = (code) -> { | ||
| 264 | :code | ||
| 265 | type: "lua" | ||
| 266 | } | ||
| 267 | |||
| 268 | -- os sÃmbolos inicial e final da string bruta são aparados automaticamente | ||
| 269 | $lua[==[ | ||
| 270 | -- inserção de códigos Lua brutos | ||
| 271 | if cond then | ||
| 272 | print("output") | ||
| 273 | end | ||
| 274 | ]==] | ||
| 275 | ``` | ||
| 276 | |||
| 277 | </YueDisplay> | ||
| 278 | |||
| 279 | ## Exportar macro | 134 | ## Exportar macro |
| 280 | 135 | ||
| 281 | Funções macro podem ser exportadas de um módulo e importadas em outro módulo. Você deve colocar funções export macro em um único arquivo para uso, e apenas definição de macro, importação de macro e expansão de macro inline podem ser colocadas no módulo exportador de macro. | 136 | Funções macro podem ser exportadas de um módulo e importadas em outro módulo. Você deve colocar funções export macro em um único arquivo para uso, e apenas definição de macro, importação de macro e expansão de macro inline podem ser colocadas no módulo exportador de macro. |
| @@ -295,27 +150,6 @@ import "utils" as { | |||
| 295 | [1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ | 150 | [1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ |
| 296 | ``` | 151 | ``` |
| 297 | 152 | ||
| 298 | <YueDisplay> | ||
| 299 | |||
| 300 | ```yue | ||
| 301 | -- arquivo: utils.yue | ||
| 302 | export macro map = (items, action) -> "[#{action} for _ in *#{items}]" | ||
| 303 | export macro filter = (items, action) -> "[_ for _ in *#{items} when #{action}]" | ||
| 304 | export macro foreach = (items, action) -> "for _ in *#{items} | ||
| 305 | #{action}" | ||
| 306 | |||
| 307 | -- arquivo main.yue | ||
| 308 | --[[ | ||
| 309 | import "utils" as { | ||
| 310 | $, -- sÃmbolo para importar todas as macros | ||
| 311 | $foreach: $each -- renomear macro $foreach para $each | ||
| 312 | } | ||
| 313 | [1, 2, 3] |> $map(_ * 2) |> $filter(_ > 4) |> $each print _ | ||
| 314 | ]] | ||
| 315 | ``` | ||
| 316 | |||
| 317 | </YueDisplay> | ||
| 318 | |||
| 319 | ## Macro embutida | 153 | ## Macro embutida |
| 320 | 154 | ||
| 321 | Existem algumas macros embutidas, mas você pode sobrescrevê-las declarando macros com os mesmos nomes. | 155 | Existem algumas macros embutidas, mas você pode sobrescrevê-las declarando macros com os mesmos nomes. |
| @@ -325,15 +159,6 @@ print $FILE -- obtém string do nome do módulo atual | |||
| 325 | print $LINE -- obtém número 2 | 159 | print $LINE -- obtém número 2 |
| 326 | ``` | 160 | ``` |
| 327 | 161 | ||
| 328 | <YueDisplay> | ||
| 329 | |||
| 330 | ```yue | ||
| 331 | print $FILE -- obtém string do nome do módulo atual | ||
| 332 | print $LINE -- obtém número 2 | ||
| 333 | ``` | ||
| 334 | |||
| 335 | </YueDisplay> | ||
| 336 | |||
| 337 | ## Gerando macros com macros | 162 | ## Gerando macros com macros |
| 338 | 163 | ||
| 339 | No YueScript, as funções macro permitem que você gere código em tempo de compilação. Aninhando funções macro, você pode criar padrões de geração mais complexos. Este recurso permite que você defina uma função macro que gera outra função macro, permitindo geração de código mais dinâmica. | 164 | No YueScript, as funções macro permitem que você gere código em tempo de compilação. Aninhando funções macro, você pode criar padrões de geração mais complexos. Este recurso permite que você defina uma função macro que gera outra função macro, permitindo geração de código mais dinâmica. |
| @@ -356,28 +181,6 @@ print "Valid enum type:", $BodyType Static | |||
| 356 | -- print "Compilation error with enum type:", $BodyType Unknown | 181 | -- print "Compilation error with enum type:", $BodyType Unknown |
| 357 | ``` | 182 | ``` |
| 358 | 183 | ||
| 359 | <YueDisplay> | ||
| 360 | |||
| 361 | ```yue | ||
| 362 | macro Enum = (...) -> | ||
| 363 | items = {...} | ||
| 364 | itemSet = {item, true for item in *items} | ||
| 365 | (item) -> | ||
| 366 | error "got \"#{item}\", expecting one of #{table.concat items, ', '}" unless itemSet[item] | ||
| 367 | "\"#{item}\"" | ||
| 368 | |||
| 369 | macro BodyType = $Enum( | ||
| 370 | Static | ||
| 371 | Dynamic | ||
| 372 | Kinematic | ||
| 373 | ) | ||
| 374 | |||
| 375 | print "Valid enum type:", $BodyType Static | ||
| 376 | -- print "Compilation error with enum type:", $BodyType Unknown | ||
| 377 | ``` | ||
| 378 | |||
| 379 | </YueDisplay> | ||
| 380 | |||
| 381 | ## Validação de argumentos | 184 | ## Validação de argumentos |
| 382 | 185 | ||
| 383 | Você pode declarar os tipos de nós AST esperados na lista de argumentos e verificar se os argumentos da macro recebidos atendem às expectativas em tempo de compilação. | 186 | Você pode declarar os tipos de nós AST esperados na lista de argumentos e verificar se os argumentos da macro recebidos atendem às expectativas em tempo de compilação. |
| @@ -392,20 +195,6 @@ macro printNumAndStr = (num `Num, str `String) -> | | |||
| 392 | $printNumAndStr 123, "hello" | 195 | $printNumAndStr 123, "hello" |
| 393 | ``` | 196 | ``` |
| 394 | 197 | ||
| 395 | <YueDisplay> | ||
| 396 | |||
| 397 | ```yue | ||
| 398 | macro printNumAndStr = (num `Num, str `String) -> | | ||
| 399 | print( | ||
| 400 | #{num} | ||
| 401 | #{str} | ||
| 402 | ) | ||
| 403 | |||
| 404 | $printNumAndStr 123, "hello" | ||
| 405 | ``` | ||
| 406 | |||
| 407 | </YueDisplay> | ||
| 408 | |||
| 409 | Se você precisar de verificação de argumentos mais flexÃvel, pode usar a função macro embutida `$is_ast` para verificar manualmente no lugar apropriado. | 198 | Se você precisar de verificação de argumentos mais flexÃvel, pode usar a função macro embutida `$is_ast` para verificar manualmente no lugar apropriado. |
| 410 | 199 | ||
| 411 | ```yuescript | 200 | ```yuescript |
| @@ -417,19 +206,6 @@ macro printNumAndStr = (num, str) -> | |||
| 417 | $printNumAndStr 123, "hello" | 206 | $printNumAndStr 123, "hello" |
| 418 | ``` | 207 | ``` |
| 419 | 208 | ||
| 420 | <YueDisplay> | ||
| 421 | |||
| 422 | ```yue | ||
| 423 | macro printNumAndStr = (num, str) -> | ||
| 424 | error "expected Num as first argument" unless $is_ast Num, num | ||
| 425 | error "expected String as second argument" unless $is_ast String, str | ||
| 426 | "print(#{num}, #{str})" | ||
| 427 | |||
| 428 | $printNumAndStr 123, "hello" | ||
| 429 | ``` | ||
| 430 | |||
| 431 | </YueDisplay> | ||
| 432 | |||
| 433 | Para mais detalhes sobre os nós AST disponÃveis, consulte as definições em maiúsculas em [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). | 209 | Para mais detalhes sobre os nós AST disponÃveis, consulte as definições em maiúsculas em [yue_parser.cpp](https://github.com/IppClub/YueScript/blob/main/src/yuescript/yue_parser.cpp). |
| 434 | 210 | ||
| 435 | # Try | 211 | # Try |
| @@ -464,38 +240,6 @@ catch err | |||
| 464 | print result | 240 | print result |
| 465 | ``` | 241 | ``` |
| 466 | 242 | ||
| 467 | <YueDisplay> | ||
| 468 | |||
| 469 | ```yue | ||
| 470 | try | ||
| 471 | func 1, 2, 3 | ||
| 472 | catch err | ||
| 473 | print yue.traceback err | ||
| 474 | |||
| 475 | success, result = try | ||
| 476 | func 1, 2, 3 | ||
| 477 | catch err | ||
| 478 | yue.traceback err | ||
| 479 | |||
| 480 | try func 1, 2, 3 | ||
| 481 | catch err | ||
| 482 | print yue.traceback err | ||
| 483 | |||
| 484 | success, result = try func 1, 2, 3 | ||
| 485 | |||
| 486 | try | ||
| 487 | print "trying" | ||
| 488 | func 1, 2, 3 | ||
| 489 | |||
| 490 | -- funcionando com padrão de atribuição em if | ||
| 491 | if success, result := try func 1, 2, 3 | ||
| 492 | catch err | ||
| 493 | print yue.traceback err | ||
| 494 | print result | ||
| 495 | ``` | ||
| 496 | |||
| 497 | </YueDisplay> | ||
| 498 | |||
| 499 | ## Try? | 243 | ## Try? |
| 500 | 244 | ||
| 501 | `try?` é um uso simplificado para sintaxe de tratamento de erros que omite o status booleano da instrução `try`, e retornará o resultado do bloco try quando tiver sucesso, retornando nil em vez do objeto de erro caso contrário. | 245 | `try?` é um uso simplificado para sintaxe de tratamento de erros que omite o status booleano da instrução `try`, e retornará o resultado do bloco try quando tiver sucesso, retornando nil em vez do objeto de erro caso contrário. |
| @@ -518,44 +262,14 @@ catch e | |||
| 518 | e | 262 | e |
| 519 | ``` | 263 | ``` |
| 520 | 264 | ||
| 521 | <YueDisplay> | ||
| 522 | |||
| 523 | ```yue | ||
| 524 | a, b, c = try? func! | ||
| 525 | |||
| 526 | -- com operador de coalescência de nil | ||
| 527 | a = (try? func!) ?? "default" | ||
| 528 | |||
| 529 | -- como argumento de função | ||
| 530 | f try? func! | ||
| 531 | |||
| 532 | -- com bloco catch | ||
| 533 | f try? | ||
| 534 | print 123 | ||
| 535 | func! | ||
| 536 | catch e | ||
| 537 | print e | ||
| 538 | e | ||
| 539 | ``` | ||
| 540 | |||
| 541 | </YueDisplay> | ||
| 542 | |||
| 543 | # Literais de tabela | 265 | # Literais de tabela |
| 544 | 266 | ||
| 545 | Como no Lua, as tabelas são delimitadas por chaves. | 267 | Como no Lua, as tabelas são delimitadas por chaves. |
| 546 | 268 | ||
| 547 | ```yuescript | 269 | ```yuescript |
| 548 | some_values = [1, 2, 3, 4] | 270 | some_values = {1, 2, 3, 4} |
| 549 | ``` | ||
| 550 | |||
| 551 | <YueDisplay> | ||
| 552 | |||
| 553 | ```yue | ||
| 554 | some_values = [1, 2, 3, 4] | ||
| 555 | ``` | 271 | ``` |
| 556 | 272 | ||
| 557 | </YueDisplay> | ||
| 558 | |||
| 559 | Diferente do Lua, atribuir um valor a uma chave em uma tabela é feito com **:** (em vez de **=**). | 273 | Diferente do Lua, atribuir um valor a uma chave em uma tabela é feito com **:** (em vez de **=**). |
| 560 | 274 | ||
| 561 | ```yuescript | 275 | ```yuescript |
| @@ -566,18 +280,6 @@ some_values = { | |||
| 566 | } | 280 | } |
| 567 | ``` | 281 | ``` |
| 568 | 282 | ||
| 569 | <YueDisplay> | ||
| 570 | |||
| 571 | ```yue | ||
| 572 | some_values = { | ||
| 573 | name: "Bill", | ||
| 574 | age: 200, | ||
| 575 | ["favorite food"]: "rice" | ||
| 576 | } | ||
| 577 | ``` | ||
| 578 | |||
| 579 | </YueDisplay> | ||
| 580 | |||
| 581 | As chaves podem ser omitidas se uma única tabela de pares chave-valor está sendo atribuÃda. | 283 | As chaves podem ser omitidas se uma única tabela de pares chave-valor está sendo atribuÃda. |
| 582 | 284 | ||
| 583 | ```yuescript | 285 | ```yuescript |
| @@ -587,17 +289,6 @@ profile = | |||
| 587 | favorite_foods: ["ice cream", "donuts"] | 289 | favorite_foods: ["ice cream", "donuts"] |
| 588 | ``` | 290 | ``` |
| 589 | 291 | ||
| 590 | <YueDisplay> | ||
| 591 | |||
| 592 | ```yue | ||
| 593 | profile = | ||
| 594 | height: "4 feet", | ||
| 595 | shoe_size: 13, | ||
| 596 | favorite_foods: ["ice cream", "donuts"] | ||
| 597 | ``` | ||
| 598 | |||
| 599 | </YueDisplay> | ||
| 600 | |||
| 601 | Quebras de linha podem ser usadas para delimitar valores em vez de vÃrgula (ou ambos): | 292 | Quebras de linha podem ser usadas para delimitar valores em vez de vÃrgula (ou ambos): |
| 602 | 293 | ||
| 603 | ```yuescript | 294 | ```yuescript |
| @@ -609,19 +300,6 @@ values = { | |||
| 609 | } | 300 | } |
| 610 | ``` | 301 | ``` |
| 611 | 302 | ||
| 612 | <YueDisplay> | ||
| 613 | |||
| 614 | ```yue | ||
| 615 | values = { | ||
| 616 | 1, 2, 3, 4 | ||
| 617 | 5, 6, 7, 8 | ||
| 618 | name: "superman" | ||
| 619 | occupation: "crime fighting" | ||
| 620 | } | ||
| 621 | ``` | ||
| 622 | |||
| 623 | </YueDisplay> | ||
| 624 | |||
| 625 | Ao criar um literal de tabela em uma única linha, as chaves também podem ser omitidas: | 303 | Ao criar um literal de tabela em uma única linha, as chaves também podem ser omitidas: |
| 626 | 304 | ||
| 627 | ```yuescript | 305 | ```yuescript |
| @@ -630,16 +308,6 @@ my_function dance: "Tango", partner: "none" | |||
| 630 | y = type: "dog", legs: 4, tails: 1 | 308 | y = type: "dog", legs: 4, tails: 1 |
| 631 | ``` | 309 | ``` |
| 632 | 310 | ||
| 633 | <YueDisplay> | ||
| 634 | |||
| 635 | ```yue | ||
| 636 | my_function dance: "Tango", partner: "none" | ||
| 637 | |||
| 638 | y = type: "dog", legs: 4, tails: 1 | ||
| 639 | ``` | ||
| 640 | |||
| 641 | </YueDisplay> | ||
| 642 | |||
| 643 | As chaves de um literal de tabela podem ser palavras-chave da linguagem sem precisar escapar: | 311 | As chaves de um literal de tabela podem ser palavras-chave da linguagem sem precisar escapar: |
| 644 | 312 | ||
| 645 | ```yuescript | 313 | ```yuescript |
| @@ -649,17 +317,6 @@ tbl = { | |||
| 649 | } | 317 | } |
| 650 | ``` | 318 | ``` |
| 651 | 319 | ||
| 652 | <YueDisplay> | ||
| 653 | |||
| 654 | ```yue | ||
| 655 | tbl = { | ||
| 656 | do: "something" | ||
| 657 | end: "hunger" | ||
| 658 | } | ||
| 659 | ``` | ||
| 660 | |||
| 661 | </YueDisplay> | ||
| 662 | |||
| 663 | Se você está construindo uma tabela a partir de variáveis e deseja que as chaves sejam iguais aos nomes das variáveis, então o operador de prefixo **:** pode ser usado: | 320 | Se você está construindo uma tabela a partir de variáveis e deseja que as chaves sejam iguais aos nomes das variáveis, então o operador de prefixo **:** pode ser usado: |
| 664 | 321 | ||
| 665 | ```yuescript | 322 | ```yuescript |
| @@ -670,18 +327,6 @@ person = { :hair, :height, shoe_size: 40 } | |||
| 670 | print_table :hair, :height | 327 | print_table :hair, :height |
| 671 | ``` | 328 | ``` |
| 672 | 329 | ||
| 673 | <YueDisplay> | ||
| 674 | |||
| 675 | ```yue | ||
| 676 | hair = "golden" | ||
| 677 | height = 200 | ||
| 678 | person = { :hair, :height, shoe_size: 40 } | ||
| 679 | |||
| 680 | print_table :hair, :height | ||
| 681 | ``` | ||
| 682 | |||
| 683 | </YueDisplay> | ||
| 684 | |||
| 685 | Se você quiser que a chave de um campo na tabela seja o resultado de uma expressão, então pode envolvê-la em **[ ]**, assim como no Lua. Você também pode usar um literal de string diretamente como chave, omitindo os colchetes. Isso é útil se sua chave tiver caracteres especiais. | 330 | Se você quiser que a chave de um campo na tabela seja o resultado de uma expressão, então pode envolvê-la em **[ ]**, assim como no Lua. Você também pode usar um literal de string diretamente como chave, omitindo os colchetes. Isso é útil se sua chave tiver caracteres especiais. |
| 686 | 331 | ||
| 687 | ```yuescript | 332 | ```yuescript |
| @@ -691,33 +336,13 @@ t = { | |||
| 691 | } | 336 | } |
| 692 | ``` | 337 | ``` |
| 693 | 338 | ||
| 694 | <YueDisplay> | 339 | As tabelas Lua têm tanto uma parte array quanto uma parte hash, mas às vezes é útil fazer uma distinção semântica entre as duas. Você pode usar **[ ]** em vez de **{ }** para declarar explicitamente uma tabela como um array, fazer isso impedirá que quaisquer pares chave-valor sejam escritos dentro dela. |
| 695 | |||
| 696 | ```yue | ||
| 697 | t = { | ||
| 698 | [1 + 2]: "hello" | ||
| 699 | "hello world": true | ||
| 700 | } | ||
| 701 | ``` | ||
| 702 | |||
| 703 | </YueDisplay> | ||
| 704 | |||
| 705 | As tabelas Lua têm tanto uma parte array quanto uma parte hash, mas às vezes você quer fazer uma distinção semântica entre uso de array e hash ao escrever tabelas Lua. Então você pode escrever tabela Lua com **[ ]** em vez de **{ }** para representar uma tabela array, e escrever qualquer par chave-valor em uma tabela lista não será permitido. | ||
| 706 | 340 | ||
| 707 | ```yuescript | 341 | ```yuescript |
| 708 | some_values = [1, 2, 3, 4] | 342 | some_values = [1, 2, 3, 4] |
| 709 | list_with_one_element = [1, ] | 343 | list_with_one_element = [1, ] |
| 710 | ``` | 344 | ``` |
| 711 | 345 | ||
| 712 | <YueDisplay> | ||
| 713 | |||
| 714 | ```yue | ||
| 715 | some_values = [1, 2, 3, 4] | ||
| 716 | list_with_one_element = [1, ] | ||
| 717 | ``` | ||
| 718 | |||
| 719 | </YueDisplay> | ||
| 720 | |||
| 721 | # Compreensões | 346 | # Compreensões |
| 722 | 347 | ||
| 723 | As compreensões fornecem uma sintaxe conveniente para construir uma nova tabela iterando sobre algum objeto existente e aplicando uma expressão a seus valores. Existem dois tipos de compreensões: compreensões de lista e compreensões de tabela. Ambas produzem tabelas Lua; as compreensões de lista acumulam valores em uma tabela semelhante a array, e as compreensões de tabela permitem definir tanto a chave quanto o valor em cada iteração. | 348 | As compreensões fornecem uma sintaxe conveniente para construir uma nova tabela iterando sobre algum objeto existente e aplicando uma expressão a seus valores. Existem dois tipos de compreensões: compreensões de lista e compreensões de tabela. Ambas produzem tabelas Lua; as compreensões de lista acumulam valores em uma tabela semelhante a array, e as compreensões de tabela permitem definir tanto a chave quanto o valor em cada iteração. |
| @@ -731,43 +356,18 @@ items = [ 1, 2, 3, 4 ] | |||
| 731 | doubled = [item * 2 for i, item in ipairs items] | 356 | doubled = [item * 2 for i, item in ipairs items] |
| 732 | ``` | 357 | ``` |
| 733 | 358 | ||
| 734 | <YueDisplay> | ||
| 735 | |||
| 736 | ```yue | ||
| 737 | items = [ 1, 2, 3, 4 ] | ||
| 738 | doubled = [item * 2 for i, item in ipairs items] | ||
| 739 | ``` | ||
| 740 | |||
| 741 | </YueDisplay> | ||
| 742 | |||
| 743 | Os itens incluÃdos na nova tabela podem ser restringidos com uma cláusula when: | 359 | Os itens incluÃdos na nova tabela podem ser restringidos com uma cláusula when: |
| 744 | 360 | ||
| 745 | ```yuescript | 361 | ```yuescript |
| 746 | slice = [item for i, item in ipairs items when i > 1 and i < 3] | 362 | slice = [item for i, item in ipairs items when i > 1 and i < 3] |
| 747 | ``` | 363 | ``` |
| 748 | 364 | ||
| 749 | <YueDisplay> | ||
| 750 | |||
| 751 | ```yue | ||
| 752 | slice = [item for i, item in ipairs items when i > 1 and i < 3] | ||
| 753 | ``` | ||
| 754 | |||
| 755 | </YueDisplay> | ||
| 756 | |||
| 757 | Como é comum iterar sobre os valores de uma tabela indexada numericamente, um operador **\*** é introduzido. O exemplo doubled pode ser reescrito como: | 365 | Como é comum iterar sobre os valores de uma tabela indexada numericamente, um operador **\*** é introduzido. O exemplo doubled pode ser reescrito como: |
| 758 | 366 | ||
| 759 | ```yuescript | 367 | ```yuescript |
| 760 | doubled = [item * 2 for item in *items] | 368 | doubled = [item * 2 for item in *items] |
| 761 | ``` | 369 | ``` |
| 762 | 370 | ||
| 763 | <YueDisplay> | ||
| 764 | |||
| 765 | ```yue | ||
| 766 | doubled = [item * 2 for item in *items] | ||
| 767 | ``` | ||
| 768 | |||
| 769 | </YueDisplay> | ||
| 770 | |||
| 771 | Nas compreensões de lista, você também pode usar o operador spread `...` para achatar listas aninhadas, alcançando um efeito de flat map: | 371 | Nas compreensões de lista, você também pode usar o operador spread `...` para achatar listas aninhadas, alcançando um efeito de flat map: |
| 772 | 372 | ||
| 773 | ```yuescript | 373 | ```yuescript |
| @@ -779,19 +379,6 @@ flat = [...v for k,v in pairs data] | |||
| 779 | -- flat agora é [1, 2, 3, 4, 5, 6] | 379 | -- flat agora é [1, 2, 3, 4, 5, 6] |
| 780 | ``` | 380 | ``` |
| 781 | 381 | ||
| 782 | <YueDisplay> | ||
| 783 | |||
| 784 | ```yue | ||
| 785 | data = | ||
| 786 | a: [1, 2, 3] | ||
| 787 | b: [4, 5, 6] | ||
| 788 | |||
| 789 | flat = [...v for k,v in pairs data] | ||
| 790 | -- flat agora é [1, 2, 3, 4, 5, 6] | ||
| 791 | ``` | ||
| 792 | |||
| 793 | </YueDisplay> | ||
| 794 | |||
| 795 | As cláusulas for e when podem ser encadeadas tanto quanto desejado. O único requisito é que uma compreensão tenha pelo menos uma cláusula for. | 382 | As cláusulas for e when podem ser encadeadas tanto quanto desejado. O único requisito é que uma compreensão tenha pelo menos uma cláusula for. |
| 796 | 383 | ||
| 797 | Usar múltiplas cláusulas for é o mesmo que usar loops aninhados: | 384 | Usar múltiplas cláusulas for é o mesmo que usar loops aninhados: |
| @@ -804,32 +391,12 @@ points = [ [x, y] for x in *x_coords \ | |||
| 804 | for y in *y_coords] | 391 | for y in *y_coords] |
| 805 | ``` | 392 | ``` |
| 806 | 393 | ||
| 807 | <YueDisplay> | ||
| 808 | |||
| 809 | ```yue | ||
| 810 | x_coords = [4, 5, 6, 7] | ||
| 811 | y_coords = [9, 2, 3] | ||
| 812 | |||
| 813 | points = [ [x, y] for x in *x_coords \ | ||
| 814 | for y in *y_coords] | ||
| 815 | ``` | ||
| 816 | |||
| 817 | </YueDisplay> | ||
| 818 | |||
| 819 | Loops for numéricos também podem ser usados em compreensões: | 394 | Loops for numéricos também podem ser usados em compreensões: |
| 820 | 395 | ||
| 821 | ```yuescript | 396 | ```yuescript |
| 822 | evens = [i for i = 1, 100 when i % 2 == 0] | 397 | evens = [i for i = 1, 100 when i % 2 == 0] |
| 823 | ``` | 398 | ``` |
| 824 | 399 | ||
| 825 | <YueDisplay> | ||
| 826 | |||
| 827 | ```yue | ||
| 828 | evens = [i for i = 1, 100 when i % 2 == 0] | ||
| 829 | ``` | ||
| 830 | |||
| 831 | </YueDisplay> | ||
| 832 | |||
| 833 | ## Compreensões de tabela | 400 | ## Compreensões de tabela |
| 834 | 401 | ||
| 835 | A sintaxe para compreensões de tabela é muito semelhante, diferindo apenas por usar **{** e **}** e receber dois valores de cada iteração. | 402 | A sintaxe para compreensões de tabela é muito semelhante, diferindo apenas por usar **{** e **}** e receber dois valores de cada iteração. |
| @@ -846,32 +413,10 @@ thing = { | |||
| 846 | thing_copy = {k, v for k, v in pairs thing} | 413 | thing_copy = {k, v for k, v in pairs thing} |
| 847 | ``` | 414 | ``` |
| 848 | 415 | ||
| 849 | <YueDisplay> | ||
| 850 | |||
| 851 | ```yue | ||
| 852 | thing = { | ||
| 853 | color: "red" | ||
| 854 | name: "fast" | ||
| 855 | width: 123 | ||
| 856 | } | ||
| 857 | |||
| 858 | thing_copy = {k, v for k, v in pairs thing} | ||
| 859 | ``` | ||
| 860 | |||
| 861 | </YueDisplay> | ||
| 862 | |||
| 863 | ```yuescript | 416 | ```yuescript |
| 864 | no_color = {k, v for k, v in pairs thing when k != "color"} | 417 | no_color = {k, v for k, v in pairs thing when k != "color"} |
| 865 | ``` | 418 | ``` |
| 866 | 419 | ||
| 867 | <YueDisplay> | ||
| 868 | |||
| 869 | ```yue | ||
| 870 | no_color = {k, v for k, v in pairs thing when k != "color"} | ||
| 871 | ``` | ||
| 872 | |||
| 873 | </YueDisplay> | ||
| 874 | |||
| 875 | O operador **\*** também é suportado. Aqui criamos uma tabela de consulta de raiz quadrada para alguns números. | 420 | O operador **\*** também é suportado. Aqui criamos uma tabela de consulta de raiz quadrada para alguns números. |
| 876 | 421 | ||
| 877 | ```yuescript | 422 | ```yuescript |
| @@ -879,15 +424,6 @@ numbers = [1, 2, 3, 4] | |||
| 879 | sqrts = {i, math.sqrt i for i in *numbers} | 424 | sqrts = {i, math.sqrt i for i in *numbers} |
| 880 | ``` | 425 | ``` |
| 881 | 426 | ||
| 882 | <YueDisplay> | ||
| 883 | |||
| 884 | ```yue | ||
| 885 | numbers = [1, 2, 3, 4] | ||
| 886 | sqrts = {i, math.sqrt i for i in *numbers} | ||
| 887 | ``` | ||
| 888 | |||
| 889 | </YueDisplay> | ||
| 890 | |||
| 891 | A tupla chave-valor em uma compreensão de tabela também pode vir de uma única expressão, caso em que a expressão deve retornar dois valores. O primeiro é usado como chave e o segundo é usado como valor: | 427 | A tupla chave-valor em uma compreensão de tabela também pode vir de uma única expressão, caso em que a expressão deve retornar dois valores. O primeiro é usado como chave e o segundo é usado como valor: |
| 892 | 428 | ||
| 893 | Neste exemplo convertemos um array de pares em uma tabela onde o primeiro item do par é a chave e o segundo é o valor. | 429 | Neste exemplo convertemos um array de pares em uma tabela onde o primeiro item do par é a chave e o segundo é o valor. |
| @@ -897,15 +433,6 @@ tuples = [ ["hello", "world"], ["foo", "bar"]] | |||
| 897 | tbl = {unpack tuple for tuple in *tuples} | 433 | tbl = {unpack tuple for tuple in *tuples} |
| 898 | ``` | 434 | ``` |
| 899 | 435 | ||
| 900 | <YueDisplay> | ||
| 901 | |||
| 902 | ```yue | ||
| 903 | tuples = [ ["hello", "world"], ["foo", "bar"]] | ||
| 904 | tbl = {unpack tuple for tuple in *tuples} | ||
| 905 | ``` | ||
| 906 | |||
| 907 | </YueDisplay> | ||
| 908 | |||
| 909 | ## Slicing | 436 | ## Slicing |
| 910 | 437 | ||
| 911 | Uma sintaxe especial é fornecida para restringir os itens sobre os quais se itera ao usar o operador **\***. Isso é equivalente a definir os limites de iteração e um tamanho de passo em um loop for. | 438 | Uma sintaxe especial é fornecida para restringir os itens sobre os quais se itera ao usar o operador **\***. Isso é equivalente a definir os limites de iteração e um tamanho de passo em um loop for. |
| @@ -916,42 +443,18 @@ Aqui podemos definir os limites mÃnimo e máximo, pegando todos os itens com à | |||
| 916 | slice = [item for item in *items[1, 5]] | 443 | slice = [item for item in *items[1, 5]] |
| 917 | ``` | 444 | ``` |
| 918 | 445 | ||
| 919 | <YueDisplay> | ||
| 920 | |||
| 921 | ```yue | ||
| 922 | slice = [item for item in *items[1, 5]] | ||
| 923 | ``` | ||
| 924 | |||
| 925 | </YueDisplay> | ||
| 926 | |||
| 927 | Qualquer um dos argumentos do slice pode ser omitido para usar um padrão sensato. Neste exemplo, se o Ãndice máximo for omitido, ele usa como padrão o comprimento da tabela. Isso pegará tudo exceto o primeiro elemento: | 446 | Qualquer um dos argumentos do slice pode ser omitido para usar um padrão sensato. Neste exemplo, se o Ãndice máximo for omitido, ele usa como padrão o comprimento da tabela. Isso pegará tudo exceto o primeiro elemento: |
| 928 | 447 | ||
| 929 | ```yuescript | 448 | ```yuescript |
| 930 | slice = [item for item in *items[2,]] | 449 | slice = [item for item in *items[2,]] |
| 931 | ``` | 450 | ``` |
| 932 | 451 | ||
| 933 | <YueDisplay> | ||
| 934 | |||
| 935 | ```yue | ||
| 936 | slice = [item for item in *items[2,]] | ||
| 937 | ``` | ||
| 938 | |||
| 939 | </YueDisplay> | ||
| 940 | |||
| 941 | Se o limite mÃnimo for omitido, ele usa como padrão 1. Aqui fornecemos apenas um tamanho de passo e deixamos os outros limites em branco. Isso pega todos os itens com Ãndice Ãmpar: (1, 3, 5, …) | 452 | Se o limite mÃnimo for omitido, ele usa como padrão 1. Aqui fornecemos apenas um tamanho de passo e deixamos os outros limites em branco. Isso pega todos os itens com Ãndice Ãmpar: (1, 3, 5, …) |
| 942 | 453 | ||
| 943 | ```yuescript | 454 | ```yuescript |
| 944 | slice = [item for item in *items[,,2]] | 455 | slice = [item for item in *items[,,2]] |
| 945 | ``` | 456 | ``` |
| 946 | 457 | ||
| 947 | <YueDisplay> | ||
| 948 | |||
| 949 | ```yue | ||
| 950 | slice = [item for item in *items[,,2]] | ||
| 951 | ``` | ||
| 952 | |||
| 953 | </YueDisplay> | ||
| 954 | |||
| 955 | Tanto o limite mÃnimo quanto o máximo podem ser negativos, o que significa que os limites são contados a partir do fim da tabela. | 458 | Tanto o limite mÃnimo quanto o máximo podem ser negativos, o que significa que os limites são contados a partir do fim da tabela. |
| 956 | 459 | ||
| 957 | ```yuescript | 460 | ```yuescript |
| @@ -959,29 +462,12 @@ Tanto o limite mÃnimo quanto o máximo podem ser negativos, o que significa que | |||
| 959 | slice = [item for item in *items[-4,-1]] | 462 | slice = [item for item in *items[-4,-1]] |
| 960 | ``` | 463 | ``` |
| 961 | 464 | ||
| 962 | <YueDisplay> | ||
| 963 | |||
| 964 | ```yue | ||
| 965 | -- pegar os últimos 4 itens | ||
| 966 | slice = [item for item in *items[-4,-1]] | ||
| 967 | ``` | ||
| 968 | |||
| 969 | </YueDisplay> | ||
| 970 | |||
| 971 | O tamanho do passo também pode ser negativo, o que significa que os itens são tomados em ordem reversa. | 465 | O tamanho do passo também pode ser negativo, o que significa que os itens são tomados em ordem reversa. |
| 972 | 466 | ||
| 973 | ```yuescript | 467 | ```yuescript |
| 974 | reverse_slice = [item for item in *items[-1,1,-1]] | 468 | reverse_slice = [item for item in *items[-1,1,-1]] |
| 975 | ``` | 469 | ``` |
| 976 | 470 | ||
| 977 | <YueDisplay> | ||
| 978 | |||
| 979 | ```yue | ||
| 980 | reverse_slice = [item for item in *items[-1,1,-1]] | ||
| 981 | ``` | ||
| 982 | |||
| 983 | </YueDisplay> | ||
| 984 | |||
| 985 | ### Expressão de slicing | 471 | ### Expressão de slicing |
| 986 | 472 | ||
| 987 | O slicing também pode ser usado como expressão. Isso é útil para obter uma sublista de uma tabela. | 473 | O slicing também pode ser usado como expressão. Isso é útil para obter uma sublista de uma tabela. |
| @@ -994,18 +480,6 @@ sub_list = items[2, 4] | |||
| 994 | last_four_items = items[-4, -1] | 480 | last_four_items = items[-4, -1] |
| 995 | ``` | 481 | ``` |
| 996 | 482 | ||
| 997 | <YueDisplay> | ||
| 998 | |||
| 999 | ```yue | ||
| 1000 | -- pegar o 2º e 4º itens como nova lista | ||
| 1001 | sub_list = items[2, 4] | ||
| 1002 | |||
| 1003 | -- pegar os últimos 4 itens | ||
| 1004 | last_four_items = items[-4, -1] | ||
| 1005 | ``` | ||
| 1006 | |||
| 1007 | </YueDisplay> | ||
| 1008 | |||
| 1009 | # Programação orientada a objetos | 483 | # Programação orientada a objetos |
| 1010 | 484 | ||
| 1011 | Nestes exemplos, o código Lua gerado pode parecer avassalador. É melhor focar primeiro no significado do código YueScript e depois olhar o código Lua se desejar conhecer os detalhes da implementação. | 485 | Nestes exemplos, o código Lua gerado pode parecer avassalador. É melhor focar primeiro no significado do código YueScript e depois olhar o código Lua se desejar conhecer os detalhes da implementação. |
| @@ -1024,22 +498,6 @@ class Inventory | |||
| 1024 | @items[name] = 1 | 498 | @items[name] = 1 |
| 1025 | ``` | 499 | ``` |
| 1026 | 500 | ||
| 1027 | <YueDisplay> | ||
| 1028 | |||
| 1029 | ```yue | ||
| 1030 | class Inventory | ||
| 1031 | new: => | ||
| 1032 | @items = {} | ||
| 1033 | |||
| 1034 | add_item: (name) => | ||
| 1035 | if @items[name] | ||
| 1036 | @items[name] += 1 | ||
| 1037 | else | ||
| 1038 | @items[name] = 1 | ||
| 1039 | ``` | ||
| 1040 | |||
| 1041 | </YueDisplay> | ||
| 1042 | |||
| 1043 | Uma classe é declarada com uma instrução class seguida de uma declaração semelhante a tabela onde todos os métodos e propriedades são listados. | 501 | Uma classe é declarada com uma instrução class seguida de uma declaração semelhante a tabela onde todos os métodos e propriedades são listados. |
| 1044 | 502 | ||
| 1045 | A propriedade new é especial pois se tornará o construtor. | 503 | A propriedade new é especial pois se tornará o construtor. |
| @@ -1056,16 +514,6 @@ inv\add_item "t-shirt" | |||
| 1056 | inv\add_item "pants" | 514 | inv\add_item "pants" |
| 1057 | ``` | 515 | ``` |
| 1058 | 516 | ||
| 1059 | <YueDisplay> | ||
| 1060 | |||
| 1061 | ```yue | ||
| 1062 | inv = Inventory! | ||
| 1063 | inv\add_item "t-shirt" | ||
| 1064 | inv\add_item "pants" | ||
| 1065 | ``` | ||
| 1066 | |||
| 1067 | </YueDisplay> | ||
| 1068 | |||
| 1069 | Como a instância da classe precisa ser enviada aos métodos quando são chamados, o operador \ é usado. | 517 | Como a instância da classe precisa ser enviada aos métodos quando são chamados, o operador \ é usado. |
| 1070 | 518 | ||
| 1071 | Todas as propriedades de uma classe são compartilhadas entre as instâncias. Isso é bom para funções, mas para outros tipos de objetos, resultados indesejados podem ocorrer. | 519 | Todas as propriedades de uma classe são compartilhadas entre as instâncias. Isso é bom para funções, mas para outros tipos de objetos, resultados indesejados podem ocorrer. |
| @@ -1088,26 +536,6 @@ b\give_item "shirt" | |||
| 1088 | print item for item in *a.clothes | 536 | print item for item in *a.clothes |
| 1089 | ``` | 537 | ``` |
| 1090 | 538 | ||
| 1091 | <YueDisplay> | ||
| 1092 | |||
| 1093 | ```yue | ||
| 1094 | class Person | ||
| 1095 | clothes: [] | ||
| 1096 | give_item: (name) => | ||
| 1097 | table.insert @clothes, name | ||
| 1098 | |||
| 1099 | a = Person! | ||
| 1100 | b = Person! | ||
| 1101 | |||
| 1102 | a\give_item "pants" | ||
| 1103 | b\give_item "shirt" | ||
| 1104 | |||
| 1105 | -- vai imprimir tanto pants quanto shirt | ||
| 1106 | print item for item in *a.clothes | ||
| 1107 | ``` | ||
| 1108 | |||
| 1109 | </YueDisplay> | ||
| 1110 | |||
| 1111 | A forma correta de evitar esse problema é criar o estado mutável do objeto no construtor: | 539 | A forma correta de evitar esse problema é criar o estado mutável do objeto no construtor: |
| 1112 | 540 | ||
| 1113 | ```yuescript | 541 | ```yuescript |
| @@ -1116,16 +544,6 @@ class Person | |||
| 1116 | @clothes = [] | 544 | @clothes = [] |
| 1117 | ``` | 545 | ``` |
| 1118 | 546 | ||
| 1119 | <YueDisplay> | ||
| 1120 | |||
| 1121 | ```yue | ||
| 1122 | class Person | ||
| 1123 | new: => | ||
| 1124 | @clothes = [] | ||
| 1125 | ``` | ||
| 1126 | |||
| 1127 | </YueDisplay> | ||
| 1128 | |||
| 1129 | ## Herança | 547 | ## Herança |
| 1130 | 548 | ||
| 1131 | A palavra-chave extends pode ser usada em uma declaração de classe para herdar as propriedades e métodos de outra classe. | 549 | A palavra-chave extends pode ser usada em uma declaração de classe para herdar as propriedades e métodos de outra classe. |
| @@ -1138,18 +556,6 @@ class BackPack extends Inventory | |||
| 1138 | super name | 556 | super name |
| 1139 | ``` | 557 | ``` |
| 1140 | 558 | ||
| 1141 | <YueDisplay> | ||
| 1142 | |||
| 1143 | ```yue | ||
| 1144 | class BackPack extends Inventory | ||
| 1145 | size: 10 | ||
| 1146 | add_item: (name) => | ||
| 1147 | if #@items > size then error "backpack is full" | ||
| 1148 | super name | ||
| 1149 | ``` | ||
| 1150 | |||
| 1151 | </YueDisplay> | ||
| 1152 | |||
| 1153 | Aqui estendemos nossa classe Inventory e limitamos a quantidade de itens que ela pode carregar. | 559 | Aqui estendemos nossa classe Inventory e limitamos a quantidade de itens que ela pode carregar. |
| 1154 | 560 | ||
| 1155 | Neste exemplo, não definimos um construtor na subclasse, então o construtor da classe pai é chamado quando criamos uma nova instância. Se definirmos um construtor, podemos usar o método super para chamar o construtor pai. | 561 | Neste exemplo, não definimos um construtor na subclasse, então o construtor da classe pai é chamado quando criamos uma nova instância. Se definirmos um construtor, podemos usar o método super para chamar o construtor pai. |
| @@ -1165,19 +571,6 @@ class Shelf | |||
| 1165 | class Cupboard extends Shelf | 571 | class Cupboard extends Shelf |
| 1166 | ``` | 572 | ``` |
| 1167 | 573 | ||
| 1168 | <YueDisplay> | ||
| 1169 | |||
| 1170 | ```yue | ||
| 1171 | class Shelf | ||
| 1172 | @__inherited: (child) => | ||
| 1173 | print @__name, "was inherited by", child.__name | ||
| 1174 | |||
| 1175 | -- vai imprimir: Shelf was inherited by Cupboard | ||
| 1176 | class Cupboard extends Shelf | ||
| 1177 | ``` | ||
| 1178 | |||
| 1179 | </YueDisplay> | ||
| 1180 | |||
| 1181 | ## Super | 574 | ## Super |
| 1182 | 575 | ||
| 1183 | **super** é uma palavra-chave especial que pode ser usada de duas formas diferentes: pode ser tratado como um objeto, ou pode ser chamado como uma função. Só tem funcionalidade especial quando está dentro de uma classe. | 576 | **super** é uma palavra-chave especial que pode ser usada de duas formas diferentes: pode ser tratado como um objeto, ou pode ser chamado como uma função. Só tem funcionalidade especial quando está dentro de uma classe. |
| @@ -1204,22 +597,6 @@ class MyClass extends ParentClass | |||
| 1204 | assert super == ParentClass | 597 | assert super == ParentClass |
| 1205 | ``` | 598 | ``` |
| 1206 | 599 | ||
| 1207 | <YueDisplay> | ||
| 1208 | |||
| 1209 | ```yue | ||
| 1210 | class MyClass extends ParentClass | ||
| 1211 | a_method: => | ||
| 1212 | -- os seguintes têm o mesmo efeito: | ||
| 1213 | super "hello", "world" | ||
| 1214 | super\a_method "hello", "world" | ||
| 1215 | super.a_method self, "hello", "world" | ||
| 1216 | |||
| 1217 | -- super como valor é igual à classe pai: | ||
| 1218 | assert super == ParentClass | ||
| 1219 | ``` | ||
| 1220 | |||
| 1221 | </YueDisplay> | ||
| 1222 | |||
| 1223 | **super** também pode ser usado no lado esquerdo de um Function Stub. A única diferença principal é que, em vez da função resultante estar vinculada ao valor de super, ela está vinculada a self. | 600 | **super** também pode ser usado no lado esquerdo de um Function Stub. A única diferença principal é que, em vez da função resultante estar vinculada ao valor de super, ela está vinculada a self. |
| 1224 | 601 | ||
| 1225 | ## Tipos | 602 | ## Tipos |
| @@ -1233,17 +610,6 @@ assert b.__class == BackPack | |||
| 1233 | print BackPack.size -- imprime 10 | 610 | print BackPack.size -- imprime 10 |
| 1234 | ``` | 611 | ``` |
| 1235 | 612 | ||
| 1236 | <YueDisplay> | ||
| 1237 | |||
| 1238 | ```yue | ||
| 1239 | b = BackPack! | ||
| 1240 | assert b.__class == BackPack | ||
| 1241 | |||
| 1242 | print BackPack.size -- imprime 10 | ||
| 1243 | ``` | ||
| 1244 | |||
| 1245 | </YueDisplay> | ||
| 1246 | |||
| 1247 | ## Objetos de classe | 613 | ## Objetos de classe |
| 1248 | 614 | ||
| 1249 | O objeto da classe é o que criamos quando usamos uma instrução class. O objeto da classe é armazenado em uma variável com o mesmo nome da classe. | 615 | O objeto da classe é o que criamos quando usamos uma instrução class. O objeto da classe é armazenado em uma variável com o mesmo nome da classe. |
| @@ -1264,14 +630,6 @@ O nome da classe quando foi declarada é armazenado como string no campo \_\_nam | |||
| 1264 | print BackPack.__name -- imprime Backpack | 630 | print BackPack.__name -- imprime Backpack |
| 1265 | ``` | 631 | ``` |
| 1266 | 632 | ||
| 1267 | <YueDisplay> | ||
| 1268 | |||
| 1269 | ```yue | ||
| 1270 | print BackPack.__name -- imprime Backpack | ||
| 1271 | ``` | ||
| 1272 | |||
| 1273 | </YueDisplay> | ||
| 1274 | |||
| 1275 | O objeto base é armazenado em \_\_base. Podemos modificar esta tabela para adicionar funcionalidade a instâncias que já foram criadas e às que ainda serão criadas. | 633 | O objeto base é armazenado em \_\_base. Podemos modificar esta tabela para adicionar funcionalidade a instâncias que já foram criadas e às que ainda serão criadas. |
| 1276 | 634 | ||
| 1277 | Se a classe estende de algo, o objeto da classe pai é armazenado em \_\_parent. | 635 | Se a classe estende de algo, o objeto da classe pai é armazenado em \_\_parent. |
| @@ -1290,20 +648,6 @@ Things\some_func! | |||
| 1290 | assert Things().some_func == nil | 648 | assert Things().some_func == nil |
| 1291 | ``` | 649 | ``` |
| 1292 | 650 | ||
| 1293 | <YueDisplay> | ||
| 1294 | |||
| 1295 | ```yue | ||
| 1296 | class Things | ||
| 1297 | @some_func: => print "Hello from", @__name | ||
| 1298 | |||
| 1299 | Things\some_func! | ||
| 1300 | |||
| 1301 | -- variáveis de classe não visÃveis em instâncias | ||
| 1302 | assert Things().some_func == nil | ||
| 1303 | ``` | ||
| 1304 | |||
| 1305 | </YueDisplay> | ||
| 1306 | |||
| 1307 | Em expressões, podemos usar @@ para acessar um valor armazenado no **class de self. Assim, @@hello é abreviação para self.**class.hello. | 651 | Em expressões, podemos usar @@ para acessar um valor armazenado no **class de self. Assim, @@hello é abreviação para self.**class.hello. |
| 1308 | 652 | ||
| 1309 | ```yuescript | 653 | ```yuescript |
| @@ -1319,37 +663,12 @@ Counter! | |||
| 1319 | print Counter.count -- imprime 2 | 663 | print Counter.count -- imprime 2 |
| 1320 | ``` | 664 | ``` |
| 1321 | 665 | ||
| 1322 | <YueDisplay> | ||
| 1323 | |||
| 1324 | ```yue | ||
| 1325 | class Counter | ||
| 1326 | @count: 0 | ||
| 1327 | |||
| 1328 | new: => | ||
| 1329 | @@count += 1 | ||
| 1330 | |||
| 1331 | Counter! | ||
| 1332 | Counter! | ||
| 1333 | |||
| 1334 | print Counter.count -- imprime 2 | ||
| 1335 | ``` | ||
| 1336 | |||
| 1337 | </YueDisplay> | ||
| 1338 | |||
| 1339 | A semântica de chamada de @@ é semelhante a @. Chamar um nome @@ passará a classe como primeiro argumento usando a sintaxe de dois pontos do Lua. | 666 | A semântica de chamada de @@ é semelhante a @. Chamar um nome @@ passará a classe como primeiro argumento usando a sintaxe de dois pontos do Lua. |
| 1340 | 667 | ||
| 1341 | ```yuescript | 668 | ```yuescript |
| 1342 | @@hello 1,2,3,4 | 669 | @@hello 1,2,3,4 |
| 1343 | ``` | 670 | ``` |
| 1344 | 671 | ||
| 1345 | <YueDisplay> | ||
| 1346 | |||
| 1347 | ```yue | ||
| 1348 | @@hello 1,2,3,4 | ||
| 1349 | ``` | ||
| 1350 | |||
| 1351 | </YueDisplay> | ||
| 1352 | |||
| 1353 | ## Instruções de declaração de classe | 672 | ## Instruções de declaração de classe |
| 1354 | 673 | ||
| 1355 | No corpo de uma declaração de classe, podemos ter expressões normais além de pares chave/valor. Neste contexto, self é igual ao objeto da classe. | 674 | No corpo de uma declaração de classe, podemos ter expressões normais além de pares chave/valor. Neste contexto, self é igual ao objeto da classe. |
| @@ -1361,15 +680,6 @@ class Things | |||
| 1361 | @class_var = "hello world" | 680 | @class_var = "hello world" |
| 1362 | ``` | 681 | ``` |
| 1363 | 682 | ||
| 1364 | <YueDisplay> | ||
| 1365 | |||
| 1366 | ```yue | ||
| 1367 | class Things | ||
| 1368 | @class_var = "hello world" | ||
| 1369 | ``` | ||
| 1370 | |||
| 1371 | </YueDisplay> | ||
| 1372 | |||
| 1373 | Estas expressões são executadas após todas as propriedades terem sido adicionadas à base. | 683 | Estas expressões são executadas após todas as propriedades terem sido adicionadas à base. |
| 1374 | 684 | ||
| 1375 | Todas as variáveis declaradas no corpo da classe são locais às propriedades da classe. Isso é conveniente para colocar valores privados ou funções auxiliares que apenas os métodos da classe podem acessar: | 685 | Todas as variáveis declaradas no corpo da classe são locais às propriedades da classe. Isso é conveniente para colocar valores privados ou funções auxiliares que apenas os métodos da classe podem acessar: |
| @@ -1383,19 +693,6 @@ class MoreThings | |||
| 1383 | log "hello world: " .. secret | 693 | log "hello world: " .. secret |
| 1384 | ``` | 694 | ``` |
| 1385 | 695 | ||
| 1386 | <YueDisplay> | ||
| 1387 | |||
| 1388 | ```yue | ||
| 1389 | class MoreThings | ||
| 1390 | secret = 123 | ||
| 1391 | log = (msg) -> print "LOG:", msg | ||
| 1392 | |||
| 1393 | some_method: => | ||
| 1394 | log "hello world: " .. secret | ||
| 1395 | ``` | ||
| 1396 | |||
| 1397 | </YueDisplay> | ||
| 1398 | |||
| 1399 | ## Valores @ e @@ | 696 | ## Valores @ e @@ |
| 1400 | 697 | ||
| 1401 | Quando @ e @@ são prefixados na frente de um nome, eles representam, respectivamente, esse nome acessado em self e self.\_\_class. | 698 | Quando @ e @@ são prefixados na frente de um nome, eles representam, respectivamente, esse nome acessado em self e self.\_\_class. |
| @@ -1407,29 +704,12 @@ assert @ == self | |||
| 1407 | assert @@ == self.__class | 704 | assert @@ == self.__class |
| 1408 | ``` | 705 | ``` |
| 1409 | 706 | ||
| 1410 | <YueDisplay> | ||
| 1411 | |||
| 1412 | ```yue | ||
| 1413 | assert @ == self | ||
| 1414 | assert @@ == self.__class | ||
| 1415 | ``` | ||
| 1416 | |||
| 1417 | </YueDisplay> | ||
| 1418 | |||
| 1419 | Por exemplo, uma forma rápida de criar uma nova instância da mesma classe a partir de um método de instância usando @@: | 707 | Por exemplo, uma forma rápida de criar uma nova instância da mesma classe a partir de um método de instância usando @@: |
| 1420 | 708 | ||
| 1421 | ```yuescript | 709 | ```yuescript |
| 1422 | some_instance_method = (...) => @@ ... | 710 | some_instance_method = (...) => @@ ... |
| 1423 | ``` | 711 | ``` |
| 1424 | 712 | ||
| 1425 | <YueDisplay> | ||
| 1426 | |||
| 1427 | ```yue | ||
| 1428 | some_instance_method = (...) => @@ ... | ||
| 1429 | ``` | ||
| 1430 | |||
| 1431 | </YueDisplay> | ||
| 1432 | |||
| 1433 | ## Promoção de propriedade no construtor | 713 | ## Promoção de propriedade no construtor |
| 1434 | 714 | ||
| 1435 | Para reduzir o código repetitivo na definição de objetos de valor simples. Você pode escrever uma classe simples como: | 715 | Para reduzir o código repetitivo na definição de objetos de valor simples. Você pode escrever uma classe simples como: |
| @@ -1448,24 +728,6 @@ class Something | |||
| 1448 | @@baz = baz | 728 | @@baz = baz |
| 1449 | ``` | 729 | ``` |
| 1450 | 730 | ||
| 1451 | <YueDisplay> | ||
| 1452 | |||
| 1453 | ```yue | ||
| 1454 | class Something | ||
| 1455 | new: (@foo, @bar, @@biz, @@baz) => | ||
| 1456 | |||
| 1457 | -- O que é abreviação para | ||
| 1458 | |||
| 1459 | class Something | ||
| 1460 | new: (foo, bar, biz, baz) => | ||
| 1461 | @foo = foo | ||
| 1462 | @bar = bar | ||
| 1463 | @@biz = biz | ||
| 1464 | @@baz = baz | ||
| 1465 | ``` | ||
| 1466 | |||
| 1467 | </YueDisplay> | ||
| 1468 | |||
| 1469 | Você também pode usar esta sintaxe para uma função comum para inicializar os campos de um objeto. | 731 | Você também pode usar esta sintaxe para uma função comum para inicializar os campos de um objeto. |
| 1470 | 732 | ||
| 1471 | ```yuescript | 733 | ```yuescript |
| @@ -1474,16 +736,6 @@ obj = new {}, 123, "abc" | |||
| 1474 | print obj | 736 | print obj |
| 1475 | ``` | 737 | ``` |
| 1476 | 738 | ||
| 1477 | <YueDisplay> | ||
| 1478 | |||
| 1479 | ```yue | ||
| 1480 | new = (@fieldA, @fieldB) => @ | ||
| 1481 | obj = new {}, 123, "abc" | ||
| 1482 | print obj | ||
| 1483 | ``` | ||
| 1484 | |||
| 1485 | </YueDisplay> | ||
| 1486 | |||
| 1487 | ## Expressões de classe | 739 | ## Expressões de classe |
| 1488 | 740 | ||
| 1489 | A sintaxe de classe também pode ser usada como expressão que pode ser atribuÃda a uma variável ou retornada explicitamente. | 741 | A sintaxe de classe também pode ser usada como expressão que pode ser atribuÃda a uma variável ou retornada explicitamente. |
| @@ -1494,16 +746,6 @@ x = class Bucket | |||
| 1494 | add_drop: => @drops += 1 | 746 | add_drop: => @drops += 1 |
| 1495 | ``` | 747 | ``` |
| 1496 | 748 | ||
| 1497 | <YueDisplay> | ||
| 1498 | |||
| 1499 | ```yue | ||
| 1500 | x = class Bucket | ||
| 1501 | drops: 0 | ||
| 1502 | add_drop: => @drops += 1 | ||
| 1503 | ``` | ||
| 1504 | |||
| 1505 | </YueDisplay> | ||
| 1506 | |||
| 1507 | ## Classes anônimas | 749 | ## Classes anônimas |
| 1508 | 750 | ||
| 1509 | O nome pode ser omitido ao declarar uma classe. O atributo \_\_name será nil, a menos que a expressão da classe esteja em uma atribuição. O nome no lado esquerdo da atribuição é usado em vez de nil. | 751 | O nome pode ser omitido ao declarar uma classe. O atributo \_\_name será nil, a menos que a expressão da classe esteja em uma atribuição. O nome no lado esquerdo da atribuição é usado em vez de nil. |
| @@ -1515,31 +757,12 @@ BigBucket = class extends Bucket | |||
| 1515 | assert Bucket.__name == "BigBucket" | 757 | assert Bucket.__name == "BigBucket" |
| 1516 | ``` | 758 | ``` |
| 1517 | 759 | ||
| 1518 | <YueDisplay> | ||
| 1519 | |||
| 1520 | ```yue | ||
| 1521 | BigBucket = class extends Bucket | ||
| 1522 | add_drop: => @drops += 10 | ||
| 1523 | |||
| 1524 | assert Bucket.__name == "BigBucket" | ||
| 1525 | ``` | ||
| 1526 | |||
| 1527 | </YueDisplay> | ||
| 1528 | |||
| 1529 | Você pode até omitir o corpo, significando que pode escrever uma classe anônima em branco assim: | 760 | Você pode até omitir o corpo, significando que pode escrever uma classe anônima em branco assim: |
| 1530 | 761 | ||
| 1531 | ```yuescript | 762 | ```yuescript |
| 1532 | x = class | 763 | x = class |
| 1533 | ``` | 764 | ``` |
| 1534 | 765 | ||
| 1535 | <YueDisplay> | ||
| 1536 | |||
| 1537 | ```yue | ||
| 1538 | x = class | ||
| 1539 | ``` | ||
| 1540 | |||
| 1541 | </YueDisplay> | ||
| 1542 | |||
| 1543 | ## Mistura de classes | 766 | ## Mistura de classes |
| 1544 | 767 | ||
| 1545 | Você pode fazer mistura com a palavra-chave `using` para copiar funções de uma tabela simples ou de um objeto de classe predefinido para sua nova classe. Ao fazer mistura com uma tabela simples, você pode sobrescrever a função de indexação da classe (metamétodo `__index`) para sua implementação personalizada. Ao fazer mistura com um objeto de classe existente, os metamétodos do objeto da classe não serão copiados. | 768 | Você pode fazer mistura com a palavra-chave `using` para copiar funções de uma tabela simples ou de um objeto de classe predefinido para sua nova classe. Ao fazer mistura com uma tabela simples, você pode sobrescrever a função de indexação da classe (metamétodo `__index`) para sua implementação personalizada. Ao fazer mistura com um objeto de classe existente, os metamétodos do objeto da classe não serão copiados. |
| @@ -1562,28 +785,6 @@ y\func! | |||
| 1562 | assert y.__class.__parent ~= X -- X não é pai de Y | 785 | assert y.__class.__parent ~= X -- X não é pai de Y |
| 1563 | ``` | 786 | ``` |
| 1564 | 787 | ||
| 1565 | <YueDisplay> | ||
| 1566 | |||
| 1567 | ```yue | ||
| 1568 | MyIndex = __index: var: 1 | ||
| 1569 | |||
| 1570 | class X using MyIndex | ||
| 1571 | func: => | ||
| 1572 | print 123 | ||
| 1573 | |||
| 1574 | x = X! | ||
| 1575 | print x.var | ||
| 1576 | |||
| 1577 | class Y using X | ||
| 1578 | |||
| 1579 | y = Y! | ||
| 1580 | y\func! | ||
| 1581 | |||
| 1582 | assert y.__class.__parent ~= X -- X não é pai de Y | ||
| 1583 | ``` | ||
| 1584 | |||
| 1585 | </YueDisplay> | ||
| 1586 | |||
| 1587 | # Instrução With | 788 | # Instrução With |
| 1588 | 789 | ||
| 1589 | 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. | 790 | 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. |
| @@ -1602,18 +803,6 @@ with Person! | |||
| 1602 | print .name | 803 | print .name |
| 1603 | ``` | 804 | ``` |
| 1604 | 805 | ||
| 1605 | <YueDisplay> | ||
| 1606 | |||
| 1607 | ```yue | ||
| 1608 | with Person! | ||
| 1609 | .name = "Oswald" | ||
| 1610 | \add_relative my_dad | ||
| 1611 | \save! | ||
| 1612 | print .name | ||
| 1613 | ``` | ||
| 1614 | |||
| 1615 | </YueDisplay> | ||
| 1616 | |||
| 1617 | A instrução with também pode ser usada como expressão que retorna o valor ao qual foi dado acesso. | 806 | A instrução with também pode ser usada como expressão que retorna o valor ao qual foi dado acesso. |
| 1618 | 807 | ||
| 1619 | ```yuescript | 808 | ```yuescript |
| @@ -1621,15 +810,6 @@ file = with File "favorite_foods.txt" | |||
| 1621 | \set_encoding "utf8" | 810 | \set_encoding "utf8" |
| 1622 | ``` | 811 | ``` |
| 1623 | 812 | ||
| 1624 | <YueDisplay> | ||
| 1625 | |||
| 1626 | ```yue | ||
| 1627 | file = with File "favorite_foods.txt" | ||
| 1628 | \set_encoding "utf8" | ||
| 1629 | ``` | ||
| 1630 | |||
| 1631 | </YueDisplay> | ||
| 1632 | |||
| 1633 | Expressões `with` suportam `break` com um valor: | 813 | Expressões `with` suportam `break` com um valor: |
| 1634 | 814 | ||
| 1635 | ```yuescript | 815 | ```yuescript |
| @@ -1637,15 +817,6 @@ result = with obj | |||
| 1637 | break .value | 817 | break .value |
| 1638 | ``` | 818 | ``` |
| 1639 | 819 | ||
| 1640 | <YueDisplay> | ||
| 1641 | |||
| 1642 | ```yue | ||
| 1643 | result = with obj | ||
| 1644 | break .value | ||
| 1645 | ``` | ||
| 1646 | |||
| 1647 | </YueDisplay> | ||
| 1648 | |||
| 1649 | Depois 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`. | 820 | Depois 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`. |
| 1650 | 821 | ||
| 1651 | ```yuescript | 822 | ```yuescript |
| @@ -1658,20 +829,6 @@ b = with obj | |||
| 1658 | -- b é .x, não obj | 829 | -- b é .x, não obj |
| 1659 | ``` | 830 | ``` |
| 1660 | 831 | ||
| 1661 | <YueDisplay> | ||
| 1662 | |||
| 1663 | ```yue | ||
| 1664 | a = with obj | ||
| 1665 | .x = 1 | ||
| 1666 | -- a é obj | ||
| 1667 | |||
| 1668 | b = with obj | ||
| 1669 | break .x | ||
| 1670 | -- b é .x, não obj | ||
| 1671 | ``` | ||
| 1672 | |||
| 1673 | </YueDisplay> | ||
| 1674 | |||
| 1675 | Diferente de `for` / `while` / `repeat` / `do`, `with` suporta apenas um valor de `break`. | 832 | Diferente de `for` / `while` / `repeat` / `do`, `with` suporta apenas um valor de `break`. |
| 1676 | 833 | ||
| 1677 | Ou… | 834 | Ou… |
| @@ -1685,19 +842,6 @@ create_person = (name, relatives) -> | |||
| 1685 | me = create_person "Leaf", [dad, mother, sister] | 842 | me = create_person "Leaf", [dad, mother, sister] |
| 1686 | ``` | 843 | ``` |
| 1687 | 844 | ||
| 1688 | <YueDisplay> | ||
| 1689 | |||
| 1690 | ```yue | ||
| 1691 | create_person = (name, relatives) -> | ||
| 1692 | with Person! | ||
| 1693 | .name = name | ||
| 1694 | \add_relative relative for relative in *relatives | ||
| 1695 | |||
| 1696 | me = create_person "Leaf", [dad, mother, sister] | ||
| 1697 | ``` | ||
| 1698 | |||
| 1699 | </YueDisplay> | ||
| 1700 | |||
| 1701 | Neste uso, with pode ser visto como uma forma especial do combinador K. | 845 | Neste uso, with pode ser visto como uma forma especial do combinador K. |
| 1702 | 846 | ||
| 1703 | A expressão na instrução with também pode ser uma atribuição, se você quiser dar um nome à expressão. | 847 | A expressão na instrução with também pode ser uma atribuição, se você quiser dar um nome à expressão. |
| @@ -1708,16 +852,6 @@ with str := "Hello" | |||
| 1708 | print "upper:", \upper! | 852 | print "upper:", \upper! |
| 1709 | ``` | 853 | ``` |
| 1710 | 854 | ||
| 1711 | <YueDisplay> | ||
| 1712 | |||
| 1713 | ```yue | ||
| 1714 | with str := "Hello" | ||
| 1715 | print "original:", str | ||
| 1716 | print "upper:", \upper! | ||
| 1717 | ``` | ||
| 1718 | |||
| 1719 | </YueDisplay> | ||
| 1720 | |||
| 1721 | Você pode acessar chaves especiais com `[]` em uma instrução `with`. | 855 | Você pode acessar chaves especiais com `[]` em uma instrução `with`. |
| 1722 | 856 | ||
| 1723 | ```yuescript | 857 | ```yuescript |
| @@ -1730,20 +864,6 @@ with tb | |||
| 1730 | [] = "abc" -- anexando a "tb" | 864 | [] = "abc" -- anexando a "tb" |
| 1731 | ``` | 865 | ``` |
| 1732 | 866 | ||
| 1733 | <YueDisplay> | ||
| 1734 | |||
| 1735 | ```yue | ||
| 1736 | with tb | ||
| 1737 | [1] = 1 | ||
| 1738 | print [2] | ||
| 1739 | with [abc] | ||
| 1740 | [3] = [2]\func! | ||
| 1741 | ["key-name"] = value | ||
| 1742 | [] = "abc" -- anexando a "tb" | ||
| 1743 | ``` | ||
| 1744 | |||
| 1745 | </YueDisplay> | ||
| 1746 | |||
| 1747 | `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. | 867 | `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. |
| 1748 | 868 | ||
| 1749 | ```yuescript | 869 | ```yuescript |
| @@ -1751,15 +871,6 @@ with? obj | |||
| 1751 | print obj.name | 871 | print obj.name |
| 1752 | ``` | 872 | ``` |
| 1753 | 873 | ||
| 1754 | <YueDisplay> | ||
| 1755 | |||
| 1756 | ```yue | ||
| 1757 | with? obj | ||
| 1758 | print obj.name | ||
| 1759 | ``` | ||
| 1760 | |||
| 1761 | </YueDisplay> | ||
| 1762 | |||
| 1763 | # Atribuição | 874 | # Atribuição |
| 1764 | 875 | ||
| 1765 | A variável é tipada dinamicamente e é definida como local por padrão. Mas você pode alterar o escopo da declaração pelas instruções **local** e **global**. | 876 | A variável é tipada dinamicamente e é definida como local por padrão. Mas você pode alterar o escopo da declaração pelas instruções **local** e **global**. |
| @@ -1770,16 +881,6 @@ a, b, c = 1, 2, 3 | |||
| 1770 | hello = 123 -- usa a variável existente | 881 | hello = 123 -- usa a variável existente |
| 1771 | ``` | 882 | ``` |
| 1772 | 883 | ||
| 1773 | <YueDisplay> | ||
| 1774 | |||
| 1775 | ```yue | ||
| 1776 | hello = "world" | ||
| 1777 | a, b, c = 1, 2, 3 | ||
| 1778 | hello = 123 -- usa a variável existente | ||
| 1779 | ``` | ||
| 1780 | |||
| 1781 | </YueDisplay> | ||
| 1782 | |||
| 1783 | ## Atualização | 884 | ## Atualização |
| 1784 | 885 | ||
| 1785 | Você pode realizar atribuição de atualização com muitos operadores binários. | 886 | Você pode realizar atribuição de atualização com muitos operadores binários. |
| @@ -1795,21 +896,6 @@ s ..= "world" -- adiciona um novo local se a variável local não existir | |||
| 1795 | arg or= "valor padrão" | 896 | arg or= "valor padrão" |
| 1796 | ``` | 897 | ``` |
| 1797 | 898 | ||
| 1798 | <YueDisplay> | ||
| 1799 | |||
| 1800 | ```yue | ||
| 1801 | x = 1 | ||
| 1802 | x += 1 | ||
| 1803 | x -= 1 | ||
| 1804 | x *= 10 | ||
| 1805 | x /= 10 | ||
| 1806 | x %= 10 | ||
| 1807 | s ..= "world" -- adiciona um novo local se a variável local não existir | ||
| 1808 | arg or= "valor padrão" | ||
| 1809 | ``` | ||
| 1810 | |||
| 1811 | </YueDisplay> | ||
| 1812 | |||
| 1813 | ## Atribuição encadeada | 899 | ## Atribuição encadeada |
| 1814 | 900 | ||
| 1815 | Você pode fazer atribuição encadeada para atribuir múltiplos itens ao mesmo valor. | 901 | Você pode fazer atribuição encadeada para atribuir múltiplos itens ao mesmo valor. |
| @@ -1819,15 +905,6 @@ a = b = c = d = e = 0 | |||
| 1819 | x = y = z = f! | 905 | x = y = z = f! |
| 1820 | ``` | 906 | ``` |
| 1821 | 907 | ||
| 1822 | <YueDisplay> | ||
| 1823 | |||
| 1824 | ```yue | ||
| 1825 | a = b = c = d = e = 0 | ||
| 1826 | x = y = z = f! | ||
| 1827 | ``` | ||
| 1828 | |||
| 1829 | </YueDisplay> | ||
| 1830 | |||
| 1831 | ## Locais explÃcitos | 908 | ## Locais explÃcitos |
| 1832 | 909 | ||
| 1833 | ```yuescript | 910 | ```yuescript |
| @@ -1847,27 +924,6 @@ do | |||
| 1847 | B = 2 | 924 | B = 2 |
| 1848 | ``` | 925 | ``` |
| 1849 | 926 | ||
| 1850 | <YueDisplay> | ||
| 1851 | |||
| 1852 | ```yue | ||
| 1853 | do | ||
| 1854 | local a = 1 | ||
| 1855 | local * | ||
| 1856 | print "declarar antecipadamente todas as variáveis como locais" | ||
| 1857 | x = -> 1 + y + z | ||
| 1858 | y, z = 2, 3 | ||
| 1859 | global instance = Item\new! | ||
| 1860 | |||
| 1861 | do | ||
| 1862 | local X = 1 | ||
| 1863 | local ^ | ||
| 1864 | print "declarar antecipadamente apenas variáveis em maiúsculas" | ||
| 1865 | a = 1 | ||
| 1866 | B = 2 | ||
| 1867 | ``` | ||
| 1868 | |||
| 1869 | </YueDisplay> | ||
| 1870 | |||
| 1871 | ## Globais explÃcitos | 927 | ## Globais explÃcitos |
| 1872 | 928 | ||
| 1873 | ```yuescript | 929 | ```yuescript |
| @@ -1887,27 +943,6 @@ do | |||
| 1887 | local Temp = "um valor local" | 943 | local Temp = "um valor local" |
| 1888 | ``` | 944 | ``` |
| 1889 | 945 | ||
| 1890 | <YueDisplay> | ||
| 1891 | |||
| 1892 | ```yue | ||
| 1893 | do | ||
| 1894 | global a = 1 | ||
| 1895 | global * | ||
| 1896 | print "declarar todas as variáveis como globais" | ||
| 1897 | x = -> 1 + y + z | ||
| 1898 | y, z = 2, 3 | ||
| 1899 | |||
| 1900 | do | ||
| 1901 | global X = 1 | ||
| 1902 | global ^ | ||
| 1903 | print "declarar apenas variáveis em maiúsculas como globais" | ||
| 1904 | a = 1 | ||
| 1905 | B = 2 | ||
| 1906 | local Temp = "um valor local" | ||
| 1907 | ``` | ||
| 1908 | |||
| 1909 | </YueDisplay> | ||
| 1910 | |||
| 1911 | # Atribuição de varargs | 946 | # Atribuição de varargs |
| 1912 | 947 | ||
| 1913 | Você pode atribuir os resultados retornados de uma função a um sÃmbolo varargs `...`. E então acessar seu conteúdo da forma Lua. | 948 | Você pode atribuir os resultados retornados de uma função a um sÃmbolo varargs `...`. E então acessar seu conteúdo da forma Lua. |
| @@ -1921,19 +956,6 @@ first = select 1, ... | |||
| 1921 | print ok, count, first | 956 | print ok, count, first |
| 1922 | ``` | 957 | ``` |
| 1923 | 958 | ||
| 1924 | <YueDisplay> | ||
| 1925 | |||
| 1926 | ```yue | ||
| 1927 | list = [1, 2, 3, 4, 5] | ||
| 1928 | fn = (ok) -> ok, table.unpack list | ||
| 1929 | ok, ... = fn true | ||
| 1930 | count = select '#', ... | ||
| 1931 | first = select 1, ... | ||
| 1932 | print ok, count, first | ||
| 1933 | ``` | ||
| 1934 | |||
| 1935 | </YueDisplay> | ||
| 1936 | |||
| 1937 | # Atribuição em if | 959 | # Atribuição em if |
| 1938 | 960 | ||
| 1939 | Os blocos `if` e `elseif` podem receber uma atribuição no lugar de uma expressão condicional. Ao avaliar o condicional, a atribuição será realizada e o valor que foi atribuÃdo será usado como expressão condicional. A variável atribuÃda está no escopo apenas para o corpo do condicional, ou seja, nunca está disponÃvel se o valor não for truthy. E você precisa usar o "operador walrus" `:=` em vez de `=` para fazer a atribuição. | 961 | Os blocos `if` e `elseif` podem receber uma atribuição no lugar de uma expressão condicional. Ao avaliar o condicional, a atribuição será realizada e o valor que foi atribuÃdo será usado como expressão condicional. A variável atribuÃda está no escopo apenas para o corpo do condicional, ou seja, nunca está disponÃvel se o valor não for truthy. E você precisa usar o "operador walrus" `:=` em vez de `=` para fazer a atribuição. |
| @@ -1943,15 +965,6 @@ if user := database.find_user "moon" | |||
| 1943 | print user.name | 965 | print user.name |
| 1944 | ``` | 966 | ``` |
| 1945 | 967 | ||
| 1946 | <YueDisplay> | ||
| 1947 | |||
| 1948 | ```yue | ||
| 1949 | if user := database.find_user "moon" | ||
| 1950 | print user.name | ||
| 1951 | ``` | ||
| 1952 | |||
| 1953 | </YueDisplay> | ||
| 1954 | |||
| 1955 | ```yuescript | 968 | ```yuescript |
| 1956 | if hello := os.getenv "hello" | 969 | if hello := os.getenv "hello" |
| 1957 | print "Você tem hello", hello | 970 | print "Você tem hello", hello |
| @@ -1961,19 +974,6 @@ else | |||
| 1961 | print "nada :(" | 974 | print "nada :(" |
| 1962 | ``` | 975 | ``` |
| 1963 | 976 | ||
| 1964 | <YueDisplay> | ||
| 1965 | |||
| 1966 | ```yue | ||
| 1967 | if hello := os.getenv "hello" | ||
| 1968 | print "Você tem hello", hello | ||
| 1969 | elseif world := os.getenv "world" | ||
| 1970 | print "você tem world", world | ||
| 1971 | else | ||
| 1972 | print "nada :(" | ||
| 1973 | ``` | ||
| 1974 | |||
| 1975 | </YueDisplay> | ||
| 1976 | |||
| 1977 | Atribuição em if com múltiplos valores de retorno. Apenas o primeiro valor é verificado, os outros valores estão no escopo. | 977 | Atribuição em if com múltiplos valores de retorno. Apenas o primeiro valor é verificado, os outros valores estão no escopo. |
| 1978 | 978 | ||
| 1979 | ```yuescript | 979 | ```yuescript |
| @@ -1982,16 +982,6 @@ if success, result := pcall -> "obter resultado sem problemas" | |||
| 1982 | print "OK" | 982 | print "OK" |
| 1983 | ``` | 983 | ``` |
| 1984 | 984 | ||
| 1985 | <YueDisplay> | ||
| 1986 | |||
| 1987 | ```yue | ||
| 1988 | if success, result := pcall -> "obter resultado sem problemas" | ||
| 1989 | print result -- variável result está no escopo | ||
| 1990 | print "OK" | ||
| 1991 | ``` | ||
| 1992 | |||
| 1993 | </YueDisplay> | ||
| 1994 | |||
| 1995 | ## Atribuição em while | 985 | ## Atribuição em while |
| 1996 | 986 | ||
| 1997 | Você também pode usar atribuição em if em um loop while para obter o valor como condição do loop. | 987 | Você também pode usar atribuição em if em um loop while para obter o valor como condição do loop. |
| @@ -2002,16 +992,6 @@ while byte := stream\read_one! | |||
| 2002 | print byte | 992 | print byte |
| 2003 | ``` | 993 | ``` |
| 2004 | 994 | ||
| 2005 | <YueDisplay> | ||
| 2006 | |||
| 2007 | ```yue | ||
| 2008 | while byte := stream\read_one! | ||
| 2009 | -- fazer algo com o byte | ||
| 2010 | print byte | ||
| 2011 | ``` | ||
| 2012 | |||
| 2013 | </YueDisplay> | ||
| 2014 | |||
| 2015 | # Atribuição por desestruturação | 995 | # Atribuição por desestruturação |
| 2016 | 996 | ||
| 2017 | A atribuição por desestruturação é uma forma de extrair rapidamente valores de uma tabela por seu nome ou posição em tabelas baseadas em array. | 997 | A atribuição por desestruturação é uma forma de extrair rapidamente valores de uma tabela por seu nome ou posição em tabelas baseadas em array. |
| @@ -2027,17 +1007,6 @@ thing = [1, 2] | |||
| 2027 | print a, b | 1007 | print a, b |
| 2028 | ``` | 1008 | ``` |
| 2029 | 1009 | ||
| 2030 | <YueDisplay> | ||
| 2031 | |||
| 2032 | ```yue | ||
| 2033 | thing = [1, 2] | ||
| 2034 | |||
| 2035 | [a, b] = thing | ||
| 2036 | print a, b | ||
| 2037 | ``` | ||
| 2038 | |||
| 2039 | </YueDisplay> | ||
| 2040 | |||
| 2041 | No literal de tabela de desestruturação, a chave representa a chave para ler do lado direito, e o valor representa o nome ao qual o valor lido será atribuÃdo. | 1010 | No literal de tabela de desestruturação, a chave representa a chave para ler do lado direito, e o valor representa o nome ao qual o valor lido será atribuÃdo. |
| 2042 | 1011 | ||
| 2043 | ```yuescript | 1012 | ```yuescript |
| @@ -2053,23 +1022,6 @@ print hello, the_day | |||
| 2053 | :day = obj -- OK fazer desestruturação simples sem chaves | 1022 | :day = obj -- OK fazer desestruturação simples sem chaves |
| 2054 | ``` | 1023 | ``` |
| 2055 | 1024 | ||
| 2056 | <YueDisplay> | ||
| 2057 | |||
| 2058 | ```yue | ||
| 2059 | obj = { | ||
| 2060 | hello: "world" | ||
| 2061 | day: "tuesday" | ||
| 2062 | length: 20 | ||
| 2063 | } | ||
| 2064 | |||
| 2065 | {hello: hello, day: the_day} = obj | ||
| 2066 | print hello, the_day | ||
| 2067 | |||
| 2068 | :day = obj -- OK fazer desestruturação simples sem chaves | ||
| 2069 | ``` | ||
| 2070 | |||
| 2071 | </YueDisplay> | ||
| 2072 | |||
| 2073 | Isso também funciona com estruturas de dados aninhadas: | 1025 | Isso também funciona com estruturas de dados aninhadas: |
| 2074 | 1026 | ||
| 2075 | ```yuescript | 1027 | ```yuescript |
| @@ -2085,23 +1037,6 @@ obj2 = { | |||
| 2085 | print first, second, color | 1037 | print first, second, color |
| 2086 | ``` | 1038 | ``` |
| 2087 | 1039 | ||
| 2088 | <YueDisplay> | ||
| 2089 | |||
| 2090 | ```yue | ||
| 2091 | obj2 = { | ||
| 2092 | numbers: [1, 2, 3, 4] | ||
| 2093 | properties: { | ||
| 2094 | color: "green" | ||
| 2095 | height: 13.5 | ||
| 2096 | } | ||
| 2097 | } | ||
| 2098 | |||
| 2099 | {numbers: [first, second], properties: {color: color}} = obj2 | ||
| 2100 | print first, second, color | ||
| 2101 | ``` | ||
| 2102 | |||
| 2103 | </YueDisplay> | ||
| 2104 | |||
| 2105 | Se a instrução de desestruturação for complicada, sinta-se à vontade para espalhá-la em várias linhas. Um exemplo um pouco mais complicado: | 1040 | Se a instrução de desestruturação for complicada, sinta-se à vontade para espalhá-la em várias linhas. Um exemplo um pouco mais complicado: |
| 2106 | 1041 | ||
| 2107 | ```yuescript | 1042 | ```yuescript |
| @@ -2113,75 +1048,30 @@ Se a instrução de desestruturação for complicada, sinta-se à vontade para e | |||
| 2113 | } = obj2 | 1048 | } = obj2 |
| 2114 | ``` | 1049 | ``` |
| 2115 | 1050 | ||
| 2116 | <YueDisplay> | ||
| 2117 | |||
| 2118 | ```yue | ||
| 2119 | { | ||
| 2120 | numbers: [first, second] | ||
| 2121 | properties: { | ||
| 2122 | color: color | ||
| 2123 | } | ||
| 2124 | } = obj2 | ||
| 2125 | ``` | ||
| 2126 | |||
| 2127 | </YueDisplay> | ||
| 2128 | |||
| 2129 | É comum extrair valores de uma tabela e atribuÃ-los a variáveis locais que têm o mesmo nome da chave. Para evitar repetição, podemos usar o operador de prefixo **:**: | 1051 | É comum extrair valores de uma tabela e atribuÃ-los a variáveis locais que têm o mesmo nome da chave. Para evitar repetição, podemos usar o operador de prefixo **:**: |
| 2130 | 1052 | ||
| 2131 | ```yuescript | 1053 | ```yuescript |
| 2132 | {:concat, :insert} = table | 1054 | {:concat, :insert} = table |
| 2133 | ``` | 1055 | ``` |
| 2134 | 1056 | ||
| 2135 | <YueDisplay> | ||
| 2136 | |||
| 2137 | ```yue | ||
| 2138 | {:concat, :insert} = table | ||
| 2139 | ``` | ||
| 2140 | |||
| 2141 | </YueDisplay> | ||
| 2142 | |||
| 2143 | Isso é efetivamente o mesmo que import, mas podemos renomear campos que queremos extrair misturando a sintaxe: | 1057 | Isso é efetivamente o mesmo que import, mas podemos renomear campos que queremos extrair misturando a sintaxe: |
| 2144 | 1058 | ||
| 2145 | ```yuescript | 1059 | ```yuescript |
| 2146 | {:mix, :max, random: rand} = math | 1060 | {:mix, :max, random: rand} = math |
| 2147 | ``` | 1061 | ``` |
| 2148 | 1062 | ||
| 2149 | <YueDisplay> | ||
| 2150 | |||
| 2151 | ```yue | ||
| 2152 | {:mix, :max, random: rand} = math | ||
| 2153 | ``` | ||
| 2154 | |||
| 2155 | </YueDisplay> | ||
| 2156 | |||
| 2157 | Você pode escrever valores padrão ao fazer desestruturação: | 1063 | Você pode escrever valores padrão ao fazer desestruturação: |
| 2158 | 1064 | ||
| 2159 | ```yuescript | 1065 | ```yuescript |
| 2160 | {:name = "sem nome", :job = "sem emprego"} = person | 1066 | {:name = "sem nome", :job = "sem emprego"} = person |
| 2161 | ``` | 1067 | ``` |
| 2162 | 1068 | ||
| 2163 | <YueDisplay> | ||
| 2164 | |||
| 2165 | ```yue | ||
| 2166 | {:name = "sem nome", :job = "sem emprego"} = person | ||
| 2167 | ``` | ||
| 2168 | |||
| 2169 | </YueDisplay> | ||
| 2170 | |||
| 2171 | Você pode usar `_` como placeholder ao fazer desestruturação de lista: | 1069 | Você pode usar `_` como placeholder ao fazer desestruturação de lista: |
| 2172 | 1070 | ||
| 2173 | ```yuescript | 1071 | ```yuescript |
| 2174 | [_, two, _, four] = items | 1072 | [_, two, _, four] = items |
| 2175 | ``` | 1073 | ``` |
| 2176 | 1074 | ||
| 2177 | <YueDisplay> | ||
| 2178 | |||
| 2179 | ```yue | ||
| 2180 | [_, two, _, four] = items | ||
| 2181 | ``` | ||
| 2182 | |||
| 2183 | </YueDisplay> | ||
| 2184 | |||
| 2185 | ## Desestruturação por intervalo | 1075 | ## Desestruturação por intervalo |
| 2186 | 1076 | ||
| 2187 | Você pode usar o operador spread `...` na desestruturação de lista para capturar um intervalo de valores. Isso é útil quando você quer extrair elementos especÃficos do inÃcio e do fim de uma lista enquanto coleta o restante entre eles. | 1077 | Você pode usar o operador spread `...` na desestruturação de lista para capturar um intervalo de valores. Isso é útil quando você quer extrair elementos especÃficos do inÃcio e do fim de uma lista enquanto coleta o restante entre eles. |
| @@ -2194,18 +1084,6 @@ print bulk -- imprime: {"second", "third", "fourth"} | |||
| 2194 | print last -- imprime: last | 1084 | print last -- imprime: last |
| 2195 | ``` | 1085 | ``` |
| 2196 | 1086 | ||
| 2197 | <YueDisplay> | ||
| 2198 | |||
| 2199 | ```yue | ||
| 2200 | orders = ["first", "second", "third", "fourth", "last"] | ||
| 2201 | [first, ...bulk, last] = orders | ||
| 2202 | print first -- imprime: first | ||
| 2203 | print bulk -- imprime: {"second", "third", "fourth"} | ||
| 2204 | print last -- imprime: last | ||
| 2205 | ``` | ||
| 2206 | |||
| 2207 | </YueDisplay> | ||
| 2208 | |||
| 2209 | O operador spread pode ser usado em diferentes posições para capturar diferentes intervalos, e você pode usar `_` como placeholder para os valores que não quer capturar: | 1087 | O operador spread pode ser usado em diferentes posições para capturar diferentes intervalos, e você pode usar `_` como placeholder para os valores que não quer capturar: |
| 2210 | 1088 | ||
| 2211 | ```yuescript | 1089 | ```yuescript |
| @@ -2219,21 +1097,6 @@ O operador spread pode ser usado em diferentes posições para capturar diferent | |||
| 2219 | [first, ..._, last] = orders | 1097 | [first, ..._, last] = orders |
| 2220 | ``` | 1098 | ``` |
| 2221 | 1099 | ||
| 2222 | <YueDisplay> | ||
| 2223 | |||
| 2224 | ```yue | ||
| 2225 | -- Capturar tudo após o primeiro elemento | ||
| 2226 | [first, ...rest] = orders | ||
| 2227 | |||
| 2228 | -- Capturar tudo antes do último elemento | ||
| 2229 | [...start, last] = orders | ||
| 2230 | |||
| 2231 | -- Capturar tudo exceto os elementos do meio | ||
| 2232 | [first, ..._, last] = orders | ||
| 2233 | ``` | ||
| 2234 | |||
| 2235 | </YueDisplay> | ||
| 2236 | |||
| 2237 | ## Desestruturação em outros lugares | 1100 | ## Desestruturação em outros lugares |
| 2238 | 1101 | ||
| 2239 | A desestruturação também pode aparecer em lugares onde uma atribuição ocorre implicitamente. Um exemplo disso é um loop for: | 1102 | A desestruturação também pode aparecer em lugares onde uma atribuição ocorre implicitamente. Um exemplo disso é um loop for: |
| @@ -2248,20 +1111,6 @@ for [left, right] in *tuples | |||
| 2248 | print left, right | 1111 | print left, right |
| 2249 | ``` | 1112 | ``` |
| 2250 | 1113 | ||
| 2251 | <YueDisplay> | ||
| 2252 | |||
| 2253 | ```yue | ||
| 2254 | tuples = [ | ||
| 2255 | ["hello", "world"] | ||
| 2256 | ["egg", "head"] | ||
| 2257 | ] | ||
| 2258 | |||
| 2259 | for [left, right] in *tuples | ||
| 2260 | print left, right | ||
| 2261 | ``` | ||
| 2262 | |||
| 2263 | </YueDisplay> | ||
| 2264 | |||
| 2265 | Sabemos que cada elemento na tabela array é uma tupla de dois itens, então podemos desempacotá-lo diretamente na cláusula de nomes da instrução for usando desestruturação. | 1114 | Sabemos que cada elemento na tabela array é uma tupla de dois itens, então podemos desempacotá-lo diretamente na cláusula de nomes da instrução for usando desestruturação. |
| 2266 | 1115 | ||
| 2267 | # A cláusula Using; controlando atribuição destrutiva | 1116 | # A cláusula Using; controlando atribuição destrutiva |
| @@ -2284,26 +1133,6 @@ my_func! | |||
| 2284 | print i -- vai imprimir 0 | 1133 | print i -- vai imprimir 0 |
| 2285 | ``` | 1134 | ``` |
| 2286 | 1135 | ||
| 2287 | <YueDisplay> | ||
| 2288 | |||
| 2289 | ```yue | ||
| 2290 | i = 100 | ||
| 2291 | |||
| 2292 | -- muitas linhas de código... | ||
| 2293 | |||
| 2294 | my_func = -> | ||
| 2295 | i = 10 | ||
| 2296 | while i > 0 | ||
| 2297 | print i | ||
| 2298 | i -= 1 | ||
| 2299 | |||
| 2300 | my_func! | ||
| 2301 | |||
| 2302 | print i -- vai imprimir 0 | ||
| 2303 | ``` | ||
| 2304 | |||
| 2305 | </YueDisplay> | ||
| 2306 | |||
| 2307 | Em my_func, sobrescrevemos o valor de i por engano. Neste exemplo é bem óbvio, mas considere uma base de código grande ou estrangeira onde não está claro quais nomes já foram declarados. | 1136 | Em my_func, sobrescrevemos o valor de i por engano. Neste exemplo é bem óbvio, mas considere uma base de código grande ou estrangeira onde não está claro quais nomes já foram declarados. |
| 2308 | 1137 | ||
| 2309 | Seria útil dizer quais variáveis do escopo envolvente pretendemos alterar, para evitar que alteremos outras por acidente. | 1138 | Seria útil dizer quais variáveis do escopo envolvente pretendemos alterar, para evitar que alteremos outras por acidente. |
| @@ -2320,20 +1149,6 @@ my_func! | |||
| 2320 | print i -- imprime 100, i não é afetado | 1149 | print i -- imprime 100, i não é afetado |
| 2321 | ``` | 1150 | ``` |
| 2322 | 1151 | ||
| 2323 | <YueDisplay> | ||
| 2324 | |||
| 2325 | ```yue | ||
| 2326 | i = 100 | ||
| 2327 | |||
| 2328 | my_func = (using nil) -> | ||
| 2329 | i = "hello" -- uma nova variável local é criada aqui | ||
| 2330 | |||
| 2331 | my_func! | ||
| 2332 | print i -- imprime 100, i não é afetado | ||
| 2333 | ``` | ||
| 2334 | |||
| 2335 | </YueDisplay> | ||
| 2336 | |||
| 2337 | Múltiplos nomes podem ser separados por vÃrgulas. Os valores do closure ainda podem ser acessados, apenas não podem ser modificados: | 1152 | Múltiplos nomes podem ser separados por vÃrgulas. Os valores do closure ainda podem ser acessados, apenas não podem ser modificados: |
| 2338 | 1153 | ||
| 2339 | ```yuescript | 1154 | ```yuescript |
| @@ -2349,23 +1164,6 @@ my_func(22) | |||
| 2349 | print i, k -- estes foram atualizados | 1164 | print i, k -- estes foram atualizados |
| 2350 | ``` | 1165 | ``` |
| 2351 | 1166 | ||
| 2352 | <YueDisplay> | ||
| 2353 | |||
| 2354 | ```yue | ||
| 2355 | tmp = 1213 | ||
| 2356 | i, k = 100, 50 | ||
| 2357 | |||
| 2358 | my_func = (add using k, i) -> | ||
| 2359 | tmp = tmp + add -- uma nova variável local tmp é criada | ||
| 2360 | i += tmp | ||
| 2361 | k += tmp | ||
| 2362 | |||
| 2363 | my_func(22) | ||
| 2364 | print i, k -- estes foram atualizados | ||
| 2365 | ``` | ||
| 2366 | |||
| 2367 | </YueDisplay> | ||
| 2368 | |||
| 2369 | # Uso | 1167 | # Uso |
| 2370 | 1168 | ||
| 2371 | ## Módulo Lua | 1169 | ## Módulo Lua |
| @@ -2534,55 +1332,6 @@ with apple | |||
| 2534 | export 🌛 = "Script da Lua" | 1332 | export 🌛 = "Script da Lua" |
| 2535 | ``` | 1333 | ``` |
| 2536 | 1334 | ||
| 2537 | <YueDisplay> | ||
| 2538 | |||
| 2539 | ```yue | ||
| 2540 | -- sintaxe de importação | ||
| 2541 | import p, to_lua from "yue" | ||
| 2542 | |||
| 2543 | -- literais de objeto | ||
| 2544 | inventory = | ||
| 2545 | equipment: | ||
| 2546 | - "sword" | ||
| 2547 | - "shield" | ||
| 2548 | items: | ||
| 2549 | - name: "potion" | ||
| 2550 | count: 10 | ||
| 2551 | - name: "bread" | ||
| 2552 | count: 3 | ||
| 2553 | |||
| 2554 | -- compreensão de lista | ||
| 2555 | map = (arr, action) -> | ||
| 2556 | [action item for item in *arr] | ||
| 2557 | |||
| 2558 | filter = (arr, cond) -> | ||
| 2559 | [item for item in *arr when cond item] | ||
| 2560 | |||
| 2561 | reduce = (arr, init, action): init -> | ||
| 2562 | init = action init, item for item in *arr | ||
| 2563 | |||
| 2564 | -- operador pipe | ||
| 2565 | [1, 2, 3] | ||
| 2566 | |> map (x) -> x * 2 | ||
| 2567 | |> filter (x) -> x > 4 | ||
| 2568 | |> reduce 0, (a, b) -> a + b | ||
| 2569 | |||
| 2570 | |||
| 2571 | -- manipulação de metatable | ||
| 2572 | apple = | ||
| 2573 | size: 15 | ||
| 2574 | <index>: | ||
| 2575 | color: 0x00ffff | ||
| 2576 | |||
| 2577 | with apple | ||
| 2578 | p .size, .color, .<index> if .<>? | ||
| 2579 | |||
| 2580 | -- sintaxe de exportação estilo js | ||
| 2581 | export 🌛 = "Script da Lua" | ||
| 2582 | ``` | ||
| 2583 | |||
| 2584 | </YueDisplay> | ||
| 2585 | |||
| 2586 | ## Sobre o Dora SSR | 1335 | ## Sobre o Dora SSR |
| 2587 | 1336 | ||
| 2588 | O YueScript está sendo desenvolvido e mantido em conjunto com o motor de jogo open-source [Dora SSR](https://github.com/Dora-SSR/Dora-SSR). Tem sido usado para criar ferramentas do motor, demonstrações de jogos e protótipos, validando suas capacidades em cenários do mundo real e aprimorando a experiência de desenvolvimento do Dora SSR. | 1337 | O YueScript está sendo desenvolvido e mantido em conjunto com o motor de jogo open-source [Dora SSR](https://github.com/Dora-SSR/Dora-SSR). Tem sido usado para criar ferramentas do motor, demonstrações de jogos e protótipos, validando suas capacidades em cenários do mundo real e aprimorando a experiência de desenvolvimento do Dora SSR. |
| @@ -2641,18 +1390,6 @@ else | |||
| 2641 | print "Sem moedas" | 1390 | print "Sem moedas" |
| 2642 | ``` | 1391 | ``` |
| 2643 | 1392 | ||
| 2644 | <YueDisplay> | ||
| 2645 | |||
| 2646 | ```yue | ||
| 2647 | have_coins = false | ||
| 2648 | if have_coins | ||
| 2649 | print "Tem moedas" | ||
| 2650 | else | ||
| 2651 | print "Sem moedas" | ||
| 2652 | ``` | ||
| 2653 | |||
| 2654 | </YueDisplay> | ||
| 2655 | |||
| 2656 | Uma sintaxe curta para instruções únicas também pode ser usada: | 1393 | Uma sintaxe curta para instruções únicas também pode ser usada: |
| 2657 | 1394 | ||
| 2658 | ```yuescript | 1395 | ```yuescript |
| @@ -2660,15 +1397,6 @@ have_coins = false | |||
| 2660 | if have_coins then print "Tem moedas" else print "Sem moedas" | 1397 | if have_coins then print "Tem moedas" else print "Sem moedas" |
| 2661 | ``` | 1398 | ``` |
| 2662 | 1399 | ||
| 2663 | <YueDisplay> | ||
| 2664 | |||
| 2665 | ```yue | ||
| 2666 | have_coins = false | ||
| 2667 | if have_coins then print "Tem moedas" else print "Sem moedas" | ||
| 2668 | ``` | ||
| 2669 | |||
| 2670 | </YueDisplay> | ||
| 2671 | |||
| 2672 | Como instruções if podem ser usadas como expressões, isso também pode ser escrito como: | 1400 | Como instruções if podem ser usadas como expressões, isso também pode ser escrito como: |
| 2673 | 1401 | ||
| 2674 | ```yuescript | 1402 | ```yuescript |
| @@ -2676,15 +1404,6 @@ have_coins = false | |||
| 2676 | print if have_coins then "Tem moedas" else "Sem moedas" | 1404 | print if have_coins then "Tem moedas" else "Sem moedas" |
| 2677 | ``` | 1405 | ``` |
| 2678 | 1406 | ||
| 2679 | <YueDisplay> | ||
| 2680 | |||
| 2681 | ```yue | ||
| 2682 | have_coins = false | ||
| 2683 | print if have_coins then "Tem moedas" else "Sem moedas" | ||
| 2684 | ``` | ||
| 2685 | |||
| 2686 | </YueDisplay> | ||
| 2687 | |||
| 2688 | Condicionais também podem ser usados em instruções de retorno e atribuições: | 1407 | Condicionais também podem ser usados em instruções de retorno e atribuições: |
| 2689 | 1408 | ||
| 2690 | ```yuescript | 1409 | ```yuescript |
| @@ -2702,25 +1421,6 @@ else | |||
| 2702 | print message -- imprime: Sou muito alto | 1421 | print message -- imprime: Sou muito alto |
| 2703 | ``` | 1422 | ``` |
| 2704 | 1423 | ||
| 2705 | <YueDisplay> | ||
| 2706 | |||
| 2707 | ```yue | ||
| 2708 | is_tall = (name) -> | ||
| 2709 | if name == "Rob" | ||
| 2710 | true | ||
| 2711 | else | ||
| 2712 | false | ||
| 2713 | |||
| 2714 | message = if is_tall "Rob" | ||
| 2715 | "Sou muito alto" | ||
| 2716 | else | ||
| 2717 | "Não sou tão alto" | ||
| 2718 | |||
| 2719 | print message -- imprime: Sou muito alto | ||
| 2720 | ``` | ||
| 2721 | |||
| 2722 | </YueDisplay> | ||
| 2723 | |||
| 2724 | O oposto de if é unless: | 1424 | O oposto de if é unless: |
| 2725 | 1425 | ||
| 2726 | ```yuescript | 1426 | ```yuescript |
| @@ -2728,27 +1428,10 @@ unless os.date("%A") == "Monday" | |||
| 2728 | print "não é segunda-feira!" | 1428 | print "não é segunda-feira!" |
| 2729 | ``` | 1429 | ``` |
| 2730 | 1430 | ||
| 2731 | <YueDisplay> | ||
| 2732 | |||
| 2733 | ```yue | ||
| 2734 | unless os.date("%A") == "Monday" | ||
| 2735 | print "não é segunda-feira!" | ||
| 2736 | ``` | ||
| 2737 | |||
| 2738 | </YueDisplay> | ||
| 2739 | |||
| 2740 | ```yuescript | 1431 | ```yuescript |
| 2741 | print "Você tem sorte!" unless math.random! > 0.1 | 1432 | print "Você tem sorte!" unless math.random! > 0.1 |
| 2742 | ``` | 1433 | ``` |
| 2743 | 1434 | ||
| 2744 | <YueDisplay> | ||
| 2745 | |||
| 2746 | ```yue | ||
| 2747 | print "Você tem sorte!" unless math.random! > 0.1 | ||
| 2748 | ``` | ||
| 2749 | |||
| 2750 | </YueDisplay> | ||
| 2751 | |||
| 2752 | ## Em expressão | 1435 | ## Em expressão |
| 2753 | 1436 | ||
| 2754 | Você pode escrever código de verificação de intervalo com uma `in-expression`. | 1437 | Você pode escrever código de verificação de intervalo com uma `in-expression`. |
| @@ -2763,20 +1446,6 @@ if a in list | |||
| 2763 | print "verificando se `a` está na lista" | 1446 | print "verificando se `a` está na lista" |
| 2764 | ``` | 1447 | ``` |
| 2765 | 1448 | ||
| 2766 | <YueDisplay> | ||
| 2767 | |||
| 2768 | ```yue | ||
| 2769 | a = 5 | ||
| 2770 | |||
| 2771 | if a in [1, 3, 5, 7] | ||
| 2772 | print "verificando igualdade com valores discretos" | ||
| 2773 | |||
| 2774 | if a in list | ||
| 2775 | print "verificando se `a` está na lista" | ||
| 2776 | ``` | ||
| 2777 | |||
| 2778 | </YueDisplay> | ||
| 2779 | |||
| 2780 | O operador `in` também pode ser usado com tabelas e suporta a variante `not in` para negação: | 1449 | O operador `in` também pode ser usado com tabelas e suporta a variante `not in` para negação: |
| 2781 | 1450 | ||
| 2782 | ```yuescript | 1451 | ```yuescript |
| @@ -2790,21 +1459,6 @@ not_exist = item not in list | |||
| 2790 | check = -> value not in table | 1459 | check = -> value not in table |
| 2791 | ``` | 1460 | ``` |
| 2792 | 1461 | ||
| 2793 | <YueDisplay> | ||
| 2794 | |||
| 2795 | ```yue | ||
| 2796 | has = "foo" in {"bar", "foo"} | ||
| 2797 | |||
| 2798 | if a in {1, 2, 3} | ||
| 2799 | print "a está na tabela" | ||
| 2800 | |||
| 2801 | not_exist = item not in list | ||
| 2802 | |||
| 2803 | check = -> value not in table | ||
| 2804 | ``` | ||
| 2805 | |||
| 2806 | </YueDisplay> | ||
| 2807 | |||
| 2808 | Uma lista ou tabela de único elemento verifica igualdade com esse elemento: | 1462 | Uma lista ou tabela de único elemento verifica igualdade com esse elemento: |
| 2809 | 1463 | ||
| 2810 | ```yuescript | 1464 | ```yuescript |
| @@ -2819,22 +1473,6 @@ with tb | |||
| 2819 | c = a in [1] | 1473 | c = a in [1] |
| 2820 | ``` | 1474 | ``` |
| 2821 | 1475 | ||
| 2822 | <YueDisplay> | ||
| 2823 | |||
| 2824 | ```yue | ||
| 2825 | -- [1,] verifica se valor == 1 | ||
| 2826 | c = a in [1,] | ||
| 2827 | |||
| 2828 | -- {1} também verifica se valor == 1 | ||
| 2829 | c = a in {1} | ||
| 2830 | |||
| 2831 | -- Sem vÃrgula, [1] é acesso por Ãndice (tb[1]) | ||
| 2832 | with tb | ||
| 2833 | c = a in [1] | ||
| 2834 | ``` | ||
| 2835 | |||
| 2836 | </YueDisplay> | ||
| 2837 | |||
| 2838 | # Loop For | 1476 | # Loop For |
| 2839 | 1477 | ||
| 2840 | Existem duas formas de loop for, assim como no Lua. Uma numérica e uma genérica: | 1478 | Existem duas formas de loop for, assim como no Lua. Uma numérica e uma genérica: |
| @@ -2850,21 +1488,6 @@ for key, value in pairs object | |||
| 2850 | print key, value | 1488 | print key, value |
| 2851 | ``` | 1489 | ``` |
| 2852 | 1490 | ||
| 2853 | <YueDisplay> | ||
| 2854 | |||
| 2855 | ```yue | ||
| 2856 | for i = 10, 20 | ||
| 2857 | print i | ||
| 2858 | |||
| 2859 | for k = 1, 15, 2 -- um passo opcional fornecido | ||
| 2860 | print k | ||
| 2861 | |||
| 2862 | for key, value in pairs object | ||
| 2863 | print key, value | ||
| 2864 | ``` | ||
| 2865 | |||
| 2866 | </YueDisplay> | ||
| 2867 | |||
| 2868 | Os operadores de slicing e **\*** podem ser usados, assim como com compreensões: | 1491 | Os operadores de slicing e **\*** podem ser usados, assim como com compreensões: |
| 2869 | 1492 | ||
| 2870 | ```yuescript | 1493 | ```yuescript |
| @@ -2872,15 +1495,6 @@ for item in *items[2, 4] | |||
| 2872 | print item | 1495 | print item |
| 2873 | ``` | 1496 | ``` |
| 2874 | 1497 | ||
| 2875 | <YueDisplay> | ||
| 2876 | |||
| 2877 | ```yue | ||
| 2878 | for item in *items[2, 4] | ||
| 2879 | print item | ||
| 2880 | ``` | ||
| 2881 | |||
| 2882 | </YueDisplay> | ||
| 2883 | |||
| 2884 | Uma sintaxe mais curta também está disponÃvel para todas as variações quando o corpo é apenas uma linha: | 1498 | Uma sintaxe mais curta também está disponÃvel para todas as variações quando o corpo é apenas uma linha: |
| 2885 | 1499 | ||
| 2886 | ```yuescript | 1500 | ```yuescript |
| @@ -2889,16 +1503,6 @@ for item in *items do print item | |||
| 2889 | for j = 1, 10, 3 do print j | 1503 | for j = 1, 10, 3 do print j |
| 2890 | ``` | 1504 | ``` |
| 2891 | 1505 | ||
| 2892 | <YueDisplay> | ||
| 2893 | |||
| 2894 | ```yue | ||
| 2895 | for item in *items do print item | ||
| 2896 | |||
| 2897 | for j = 1, 10, 3 do print j | ||
| 2898 | ``` | ||
| 2899 | |||
| 2900 | </YueDisplay> | ||
| 2901 | |||
| 2902 | Um loop for também pode ser usado como expressão. A última instrução no corpo do loop for é convertida em expressão e anexada a uma tabela array acumuladora. | 1506 | Um loop for também pode ser usado como expressão. A última instrução no corpo do loop for é convertida em expressão e anexada a uma tabela array acumuladora. |
| 2903 | 1507 | ||
| 2904 | Dobrando cada número par: | 1508 | Dobrando cada número par: |
| @@ -2911,18 +1515,6 @@ doubled_evens = for i = 1, 20 | |||
| 2911 | i | 1515 | i |
| 2912 | ``` | 1516 | ``` |
| 2913 | 1517 | ||
| 2914 | <YueDisplay> | ||
| 2915 | |||
| 2916 | ```yue | ||
| 2917 | doubled_evens = for i = 1, 20 | ||
| 2918 | if i % 2 == 0 | ||
| 2919 | i * 2 | ||
| 2920 | else | ||
| 2921 | i | ||
| 2922 | ``` | ||
| 2923 | |||
| 2924 | </YueDisplay> | ||
| 2925 | |||
| 2926 | Além disso, os loops for suportam break com valores de retorno, permitindo que o próprio loop seja usado como expressão que sai antecipadamente com um resultado significativo. Expressões `for` suportam `break` com múltiplos valores. | 1518 | Além disso, os loops for suportam break com valores de retorno, permitindo que o próprio loop seja usado como expressão que sai antecipadamente com um resultado significativo. Expressões `for` suportam `break` com múltiplos valores. |
| 2927 | 1519 | ||
| 2928 | Por exemplo, para encontrar o primeiro número maior que 10: | 1520 | Por exemplo, para encontrar o primeiro número maior que 10: |
| @@ -2932,15 +1524,6 @@ first_large = for n in *numbers | |||
| 2932 | break n if n > 10 | 1524 | break n if n > 10 |
| 2933 | ``` | 1525 | ``` |
| 2934 | 1526 | ||
| 2935 | <YueDisplay> | ||
| 2936 | |||
| 2937 | ```yue | ||
| 2938 | first_large = for n in *numbers | ||
| 2939 | break n if n > 10 | ||
| 2940 | ``` | ||
| 2941 | |||
| 2942 | </YueDisplay> | ||
| 2943 | |||
| 2944 | Esta sintaxe de break-com-valor permite padrões concisos e expressivos de busca ou saÃda antecipada diretamente em expressões de loop. | 1527 | Esta sintaxe de break-com-valor permite padrões concisos e expressivos de busca ou saÃda antecipada diretamente em expressões de loop. |
| 2945 | 1528 | ||
| 2946 | ```yuescript | 1529 | ```yuescript |
| @@ -2948,15 +1531,6 @@ key, score = for k, v in pairs data | |||
| 2948 | break k, v * 10 if k == "target" | 1531 | break k, v * 10 if k == "target" |
| 2949 | ``` | 1532 | ``` |
| 2950 | 1533 | ||
| 2951 | <YueDisplay> | ||
| 2952 | |||
| 2953 | ```yue | ||
| 2954 | key, score = for k, v in pairs data | ||
| 2955 | break k, v * 10 if k == "target" | ||
| 2956 | ``` | ||
| 2957 | |||
| 2958 | </YueDisplay> | ||
| 2959 | |||
| 2960 | Você também pode filtrar valores combinando a expressão do loop for com a instrução continue. | 1534 | Você também pode filtrar valores combinando a expressão do loop for com a instrução continue. |
| 2961 | 1535 | ||
| 2962 | Loops for no final do corpo de uma função não são acumulados em uma tabela para valor de retorno (em vez disso, a função retornará nil). Uma instrução return explÃcita pode ser usada, ou o loop pode ser convertido em compreensão de lista. | 1536 | Loops for no final do corpo de uma função não são acumulados em uma tabela para valor de retorno (em vez disso, a função retornará nil). Uma instrução return explÃcita pode ser usada, ou o loop pode ser convertido em compreensão de lista. |
| @@ -2969,18 +1543,6 @@ print func_a! -- imprime nil | |||
| 2969 | print func_b! -- imprime objeto table | 1543 | print func_b! -- imprime objeto table |
| 2970 | ``` | 1544 | ``` |
| 2971 | 1545 | ||
| 2972 | <YueDisplay> | ||
| 2973 | |||
| 2974 | ```yue | ||
| 2975 | func_a = -> for i = 1, 10 do print i | ||
| 2976 | func_b = -> return for i = 1, 10 do i | ||
| 2977 | |||
| 2978 | print func_a! -- imprime nil | ||
| 2979 | print func_b! -- imprime objeto table | ||
| 2980 | ``` | ||
| 2981 | |||
| 2982 | </YueDisplay> | ||
| 2983 | |||
| 2984 | Isso é feito para evitar a criação desnecessária de tabelas para funções que não precisam retornar os resultados do loop. | 1546 | Isso é feito para evitar a criação desnecessária de tabelas para funções que não precisam retornar os resultados do loop. |
| 2985 | 1547 | ||
| 2986 | # Continue | 1548 | # Continue |
| @@ -2995,18 +1557,6 @@ while i < 10 | |||
| 2995 | print i | 1557 | print i |
| 2996 | ``` | 1558 | ``` |
| 2997 | 1559 | ||
| 2998 | <YueDisplay> | ||
| 2999 | |||
| 3000 | ```yue | ||
| 3001 | i = 0 | ||
| 3002 | while i < 10 | ||
| 3003 | i += 1 | ||
| 3004 | continue if i % 2 == 0 | ||
| 3005 | print i | ||
| 3006 | ``` | ||
| 3007 | |||
| 3008 | </YueDisplay> | ||
| 3009 | |||
| 3010 | continue também pode ser usado com expressões de loop para impedir que essa iteração seja acumulada no resultado. Este exemplo filtra a tabela array para apenas números pares: | 1560 | continue também pode ser usado com expressões de loop para impedir que essa iteração seja acumulada no resultado. Este exemplo filtra a tabela array para apenas números pares: |
| 3011 | 1561 | ||
| 3012 | ```yuescript | 1562 | ```yuescript |
| @@ -3016,17 +1566,6 @@ odds = for x in *my_numbers | |||
| 3016 | x | 1566 | x |
| 3017 | ``` | 1567 | ``` |
| 3018 | 1568 | ||
| 3019 | <YueDisplay> | ||
| 3020 | |||
| 3021 | ```yue | ||
| 3022 | my_numbers = [1, 2, 3, 4, 5, 6] | ||
| 3023 | odds = for x in *my_numbers | ||
| 3024 | continue if x % 2 == 1 | ||
| 3025 | x | ||
| 3026 | ``` | ||
| 3027 | |||
| 3028 | </YueDisplay> | ||
| 3029 | |||
| 3030 | # Switch | 1569 | # Switch |
| 3031 | 1570 | ||
| 3032 | A instrução switch é uma forma abreviada de escrever uma série de instruções if que verificam o mesmo valor. Observe que o valor é avaliado apenas uma vez. Como as instruções if, os switches podem ter um bloco else para tratar ausência de correspondências. A comparação é feita com o operador ==. Na instrução switch, você também pode usar expressão de atribuição para armazenar valor de variável temporária. | 1571 | A instrução switch é uma forma abreviada de escrever uma série de instruções if que verificam o mesmo valor. Observe que o valor é avaliado apenas uma vez. Como as instruções if, os switches podem ter um bloco else para tratar ausência de correspondências. A comparação é feita com o operador ==. Na instrução switch, você também pode usar expressão de atribuição para armazenar valor de variável temporária. |
| @@ -3041,20 +1580,6 @@ switch name := "Dan" | |||
| 3041 | print "Não sei quem você é com o nome #{name}" | 1580 | print "Não sei quem você é com o nome #{name}" |
| 3042 | ``` | 1581 | ``` |
| 3043 | 1582 | ||
| 3044 | <YueDisplay> | ||
| 3045 | |||
| 3046 | ```yue | ||
| 3047 | switch name := "Dan" | ||
| 3048 | when "Robert" | ||
| 3049 | print "Você é Robert" | ||
| 3050 | when "Dan", "Daniel" | ||
| 3051 | print "Seu nome é Dan" | ||
| 3052 | else | ||
| 3053 | print "Não sei quem você é com o nome #{name}" | ||
| 3054 | ``` | ||
| 3055 | |||
| 3056 | </YueDisplay> | ||
| 3057 | |||
| 3058 | Uma cláusula when de um switch pode corresponder a múltiplos valores listando-os separados por vÃrgula. | 1583 | Uma cláusula when de um switch pode corresponder a múltiplos valores listando-os separados por vÃrgula. |
| 3059 | 1584 | ||
| 3060 | Os switches também podem ser usados como expressões; aqui podemos atribuir o resultado do switch a uma variável: | 1585 | Os switches também podem ser usados como expressões; aqui podemos atribuir o resultado do switch a uma variável: |
| @@ -3070,21 +1595,6 @@ next_number = switch b | |||
| 3070 | error "não consigo contar tão alto!" | 1595 | error "não consigo contar tão alto!" |
| 3071 | ``` | 1596 | ``` |
| 3072 | 1597 | ||
| 3073 | <YueDisplay> | ||
| 3074 | |||
| 3075 | ```yue | ||
| 3076 | b = 1 | ||
| 3077 | next_number = switch b | ||
| 3078 | when 1 | ||
| 3079 | 2 | ||
| 3080 | when 2 | ||
| 3081 | 3 | ||
| 3082 | else | ||
| 3083 | error "não consigo contar tão alto!" | ||
| 3084 | ``` | ||
| 3085 | |||
| 3086 | </YueDisplay> | ||
| 3087 | |||
| 3088 | Podemos usar a palavra-chave then para escrever o bloco when de um switch em uma única linha. Nenhuma palavra-chave extra é necessária para escrever o bloco else em uma única linha. | 1598 | Podemos usar a palavra-chave then para escrever o bloco when de um switch em uma única linha. Nenhuma palavra-chave extra é necessária para escrever o bloco else em uma única linha. |
| 3089 | 1599 | ||
| 3090 | ```yuescript | 1600 | ```yuescript |
| @@ -3094,17 +1604,6 @@ msg = switch math.random(1, 5) | |||
| 3094 | else "não tão sortudo" | 1604 | else "não tão sortudo" |
| 3095 | ``` | 1605 | ``` |
| 3096 | 1606 | ||
| 3097 | <YueDisplay> | ||
| 3098 | |||
| 3099 | ```yue | ||
| 3100 | msg = switch math.random(1, 5) | ||
| 3101 | when 1 then "você tem sorte" | ||
| 3102 | when 2 then "você quase tem sorte" | ||
| 3103 | else "não tão sortudo" | ||
| 3104 | ``` | ||
| 3105 | |||
| 3106 | </YueDisplay> | ||
| 3107 | |||
| 3108 | Se você quiser escrever código com uma indentação a menos ao escrever uma instrução switch, pode colocar a primeira cláusula when na linha de inÃcio da instrução, e então todas as outras cláusulas podem ser escritas com uma indentação a menos. | 1607 | Se você quiser escrever código com uma indentação a menos ao escrever uma instrução switch, pode colocar a primeira cláusula when na linha de inÃcio da instrução, e então todas as outras cláusulas podem ser escritas com uma indentação a menos. |
| 3109 | 1608 | ||
| 3110 | ```yuescript | 1609 | ```yuescript |
| @@ -3120,23 +1619,6 @@ else | |||
| 3120 | print "não tão sortudo" | 1619 | print "não tão sortudo" |
| 3121 | ``` | 1620 | ``` |
| 3122 | 1621 | ||
| 3123 | <YueDisplay> | ||
| 3124 | |||
| 3125 | ```yue | ||
| 3126 | switch math.random(1, 5) | ||
| 3127 | when 1 | ||
| 3128 | print "você tem sorte" -- duas indentações | ||
| 3129 | else | ||
| 3130 | print "não tão sortudo" | ||
| 3131 | |||
| 3132 | switch math.random(1, 5) when 1 | ||
| 3133 | print "você tem sorte" -- uma indentação | ||
| 3134 | else | ||
| 3135 | print "não tão sortudo" | ||
| 3136 | ``` | ||
| 3137 | |||
| 3138 | </YueDisplay> | ||
| 3139 | |||
| 3140 | Vale notar a ordem da expressão de comparação do case. A expressão do case está no lado esquerdo. Isso pode ser útil se a expressão do case quiser sobrescrever como a comparação é feita definindo um metamétodo eq. | 1622 | Vale notar a ordem da expressão de comparação do case. A expressão do case está no lado esquerdo. Isso pode ser útil se a expressão do case quiser sobrescrever como a comparação é feita definindo um metamétodo eq. |
| 3141 | 1623 | ||
| 3142 | ## Correspondência de tabela | 1624 | ## Correspondência de tabela |
| @@ -3158,25 +1640,6 @@ for item in *items | |||
| 3158 | print "tamanho #{width}, #{height}" | 1640 | print "tamanho #{width}, #{height}" |
| 3159 | ``` | 1641 | ``` |
| 3160 | 1642 | ||
| 3161 | <YueDisplay> | ||
| 3162 | |||
| 3163 | ```yue | ||
| 3164 | items = | ||
| 3165 | * x: 100 | ||
| 3166 | y: 200 | ||
| 3167 | * width: 300 | ||
| 3168 | height: 400 | ||
| 3169 | |||
| 3170 | for item in *items | ||
| 3171 | switch item | ||
| 3172 | when :x, :y | ||
| 3173 | print "Vec2 #{x}, #{y}" | ||
| 3174 | when :width, :height | ||
| 3175 | print "tamanho #{width}, #{height}" | ||
| 3176 | ``` | ||
| 3177 | |||
| 3178 | </YueDisplay> | ||
| 3179 | |||
| 3180 | Você pode usar valores padrão para opcionalmente desestruturar a tabela para alguns campos. | 1643 | Você pode usar valores padrão para opcionalmente desestruturar a tabela para alguns campos. |
| 3181 | 1644 | ||
| 3182 | ```yuescript | 1645 | ```yuescript |
| @@ -3189,20 +1652,6 @@ switch item | |||
| 3189 | print "Vec2 #{x}, #{y}" -- a desestruturação de tabela ainda passará | 1652 | print "Vec2 #{x}, #{y}" -- a desestruturação de tabela ainda passará |
| 3190 | ``` | 1653 | ``` |
| 3191 | 1654 | ||
| 3192 | <YueDisplay> | ||
| 3193 | |||
| 3194 | ```yue | ||
| 3195 | item = {} | ||
| 3196 | |||
| 3197 | {pos: {:x = 50, :y = 200}} = item -- obtém erro: attempt to index a nil value (field 'pos') | ||
| 3198 | |||
| 3199 | switch item | ||
| 3200 | when {pos: {:x = 50, :y = 200}} | ||
| 3201 | print "Vec2 #{x}, #{y}" -- a desestruturação de tabela ainda passará | ||
| 3202 | ``` | ||
| 3203 | |||
| 3204 | </YueDisplay> | ||
| 3205 | |||
| 3206 | Você também pode corresponder contra elementos de array, campos de tabela, e até estruturas aninhadas com literais de array ou tabela. | 1655 | Você também pode corresponder contra elementos de array, campos de tabela, e até estruturas aninhadas com literais de array ou tabela. |
| 3207 | 1656 | ||
| 3208 | Corresponder contra elementos de array. | 1657 | Corresponder contra elementos de array. |
| @@ -3217,20 +1666,6 @@ switch tb | |||
| 3217 | print "1, 2, #{b}" | 1666 | print "1, 2, #{b}" |
| 3218 | ``` | 1667 | ``` |
| 3219 | 1668 | ||
| 3220 | <YueDisplay> | ||
| 3221 | |||
| 3222 | ```yue | ||
| 3223 | switch tb | ||
| 3224 | when [1, 2, 3] | ||
| 3225 | print "1, 2, 3" | ||
| 3226 | when [1, b, 3] | ||
| 3227 | print "1, #{b}, 3" | ||
| 3228 | when [1, 2, b = 3] -- b tem valor padrão | ||
| 3229 | print "1, 2, #{b}" | ||
| 3230 | ``` | ||
| 3231 | |||
| 3232 | </YueDisplay> | ||
| 3233 | |||
| 3234 | Corresponder contra campos de tabela com desestruturação. | 1669 | Corresponder contra campos de tabela com desestruturação. |
| 3235 | 1670 | ||
| 3236 | ```yuescript | 1671 | ```yuescript |
| @@ -3243,20 +1678,6 @@ switch tb | |||
| 3243 | print "inválido" | 1678 | print "inválido" |
| 3244 | ``` | 1679 | ``` |
| 3245 | 1680 | ||
| 3246 | <YueDisplay> | ||
| 3247 | |||
| 3248 | ```yue | ||
| 3249 | switch tb | ||
| 3250 | when success: true, :result | ||
| 3251 | print "sucesso", result | ||
| 3252 | when success: false | ||
| 3253 | print "falhou", result | ||
| 3254 | else | ||
| 3255 | print "inválido" | ||
| 3256 | ``` | ||
| 3257 | |||
| 3258 | </YueDisplay> | ||
| 3259 | |||
| 3260 | Corresponder contra estruturas de tabela aninhadas. | 1681 | Corresponder contra estruturas de tabela aninhadas. |
| 3261 | 1682 | ||
| 3262 | ```yuescript | 1683 | ```yuescript |
| @@ -3269,20 +1690,6 @@ switch tb | |||
| 3269 | print "inválido" | 1690 | print "inválido" |
| 3270 | ``` | 1691 | ``` |
| 3271 | 1692 | ||
| 3272 | <YueDisplay> | ||
| 3273 | |||
| 3274 | ```yue | ||
| 3275 | switch tb | ||
| 3276 | when data: {type: "success", :content} | ||
| 3277 | print "sucesso", content | ||
| 3278 | when data: {type: "error", :content} | ||
| 3279 | print "erro", content | ||
| 3280 | else | ||
| 3281 | print "inválido" | ||
| 3282 | ``` | ||
| 3283 | |||
| 3284 | </YueDisplay> | ||
| 3285 | |||
| 3286 | Corresponder contra array de tabelas. | 1693 | Corresponder contra array de tabelas. |
| 3287 | 1694 | ||
| 3288 | ```yuescript | 1695 | ```yuescript |
| @@ -3296,21 +1703,6 @@ switch tb | |||
| 3296 | print "correspondido", fourth | 1703 | print "correspondido", fourth |
| 3297 | ``` | 1704 | ``` |
| 3298 | 1705 | ||
| 3299 | <YueDisplay> | ||
| 3300 | |||
| 3301 | ```yue | ||
| 3302 | switch tb | ||
| 3303 | when [ | ||
| 3304 | {a: 1, b: 2} | ||
| 3305 | {a: 3, b: 4} | ||
| 3306 | {a: 5, b: 6} | ||
| 3307 | fourth | ||
| 3308 | ] | ||
| 3309 | print "correspondido", fourth | ||
| 3310 | ``` | ||
| 3311 | |||
| 3312 | </YueDisplay> | ||
| 3313 | |||
| 3314 | Corresponder contra uma lista e capturar um intervalo de elementos. | 1706 | Corresponder contra uma lista e capturar um intervalo de elementos. |
| 3315 | 1707 | ||
| 3316 | ```yuescript | 1708 | ```yuescript |
| @@ -3322,19 +1714,6 @@ switch segments | |||
| 3322 | print "Ação:", action -- imprime: "view" | 1714 | print "Ação:", action -- imprime: "view" |
| 3323 | ``` | 1715 | ``` |
| 3324 | 1716 | ||
| 3325 | <YueDisplay> | ||
| 3326 | |||
| 3327 | ```yue | ||
| 3328 | segments = ["admin", "users", "logs", "view"] | ||
| 3329 | switch segments | ||
| 3330 | when [...groups, resource, action] | ||
| 3331 | print "Grupo:", groups -- imprime: {"admin", "users"} | ||
| 3332 | print "Recurso:", resource -- imprime: "logs" | ||
| 3333 | print "Ação:", action -- imprime: "view" | ||
| 3334 | ``` | ||
| 3335 | |||
| 3336 | </YueDisplay> | ||
| 3337 | |||
| 3338 | # Loop While | 1717 | # Loop While |
| 3339 | 1718 | ||
| 3340 | O loop while também vem em quatro variações: | 1719 | O loop while também vem em quatro variações: |
| @@ -3348,19 +1727,6 @@ while i > 0 | |||
| 3348 | while running == true do my_function! | 1727 | while running == true do my_function! |
| 3349 | ``` | 1728 | ``` |
| 3350 | 1729 | ||
| 3351 | <YueDisplay> | ||
| 3352 | |||
| 3353 | ```yue | ||
| 3354 | i = 10 | ||
| 3355 | while i > 0 | ||
| 3356 | print i | ||
| 3357 | i -= 1 | ||
| 3358 | |||
| 3359 | while running == true do my_function! | ||
| 3360 | ``` | ||
| 3361 | |||
| 3362 | </YueDisplay> | ||
| 3363 | |||
| 3364 | ```yuescript | 1730 | ```yuescript |
| 3365 | i = 10 | 1731 | i = 10 |
| 3366 | until i == 0 | 1732 | until i == 0 |
| @@ -3370,18 +1736,6 @@ until i == 0 | |||
| 3370 | until running == false do my_function! | 1736 | until running == false do my_function! |
| 3371 | ``` | 1737 | ``` |
| 3372 | 1738 | ||
| 3373 | <YueDisplay> | ||
| 3374 | |||
| 3375 | ```yue | ||
| 3376 | i = 10 | ||
| 3377 | until i == 0 | ||
| 3378 | print i | ||
| 3379 | i -= 1 | ||
| 3380 | until running == false do my_function! | ||
| 3381 | ``` | ||
| 3382 | |||
| 3383 | </YueDisplay> | ||
| 3384 | |||
| 3385 | Como os loops for, o loop while também pode ser usado como expressão. Expressões `while` e `until` suportam `break` com múltiplos valores. | 1739 | Como os loops for, o loop while também pode ser usado como expressão. Expressões `while` e `until` suportam `break` com múltiplos valores. |
| 3386 | 1740 | ||
| 3387 | ```yuescript | 1741 | ```yuescript |
| @@ -3390,16 +1744,6 @@ value, doubled = while true | |||
| 3390 | break n, n * 2 if n > 10 | 1744 | break n, n * 2 if n > 10 |
| 3391 | ``` | 1745 | ``` |
| 3392 | 1746 | ||
| 3393 | <YueDisplay> | ||
| 3394 | |||
| 3395 | ```yue | ||
| 3396 | value, doubled = while true | ||
| 3397 | n = get_next! | ||
| 3398 | break n, n * 2 if n > 10 | ||
| 3399 | ``` | ||
| 3400 | |||
| 3401 | </YueDisplay> | ||
| 3402 | |||
| 3403 | Além disso, para uma função retornar o valor acumulado de um loop while, a instrução deve ser explicitamente retornada. | 1747 | Além disso, para uma função retornar o valor acumulado de um loop while, a instrução deve ser explicitamente retornada. |
| 3404 | 1748 | ||
| 3405 | ## Loop Repeat | 1749 | ## Loop Repeat |
| @@ -3414,18 +1758,6 @@ repeat | |||
| 3414 | until i == 0 | 1758 | until i == 0 |
| 3415 | ``` | 1759 | ``` |
| 3416 | 1760 | ||
| 3417 | <YueDisplay> | ||
| 3418 | |||
| 3419 | ```yue | ||
| 3420 | i = 10 | ||
| 3421 | repeat | ||
| 3422 | print i | ||
| 3423 | i -= 1 | ||
| 3424 | until i == 0 | ||
| 3425 | ``` | ||
| 3426 | |||
| 3427 | </YueDisplay> | ||
| 3428 | |||
| 3429 | Expressões `repeat` também suportam `break` com múltiplos valores: | 1761 | Expressões `repeat` também suportam `break` com múltiplos valores: |
| 3430 | 1762 | ||
| 3431 | ```yuescript | 1763 | ```yuescript |
| @@ -3436,18 +1768,6 @@ value, scaled = repeat | |||
| 3436 | until false | 1768 | until false |
| 3437 | ``` | 1769 | ``` |
| 3438 | 1770 | ||
| 3439 | <YueDisplay> | ||
| 3440 | |||
| 3441 | ```yue | ||
| 3442 | i = 1 | ||
| 3443 | value, scaled = repeat | ||
| 3444 | break i, i * 100 if i > 3 | ||
| 3445 | i += 1 | ||
| 3446 | until false | ||
| 3447 | ``` | ||
| 3448 | |||
| 3449 | </YueDisplay> | ||
| 3450 | |||
| 3451 | # Stubs de função | 1771 | # Stubs de função |
| 3452 | 1772 | ||
| 3453 | É comum passar uma função de um objeto como valor, por exemplo, passando um método de instância para uma função como callback. Se a função espera o objeto em que está operando como primeiro argumento, então você deve de alguma forma empacotar esse objeto com a função para que ela possa ser chamada corretamente. | 1773 | É comum passar uma função de um objeto como valor, por exemplo, passando um método de instância para uma função como callback. Se a função espera o objeto em que está operando como primeiro argumento, então você deve de alguma forma empacotar esse objeto com a função para que ela possa ser chamada corretamente. |
| @@ -3475,29 +1795,6 @@ run_callback my_object.write | |||
| 3475 | run_callback my_object\write | 1795 | run_callback my_object\write |
| 3476 | ``` | 1796 | ``` |
| 3477 | 1797 | ||
| 3478 | <YueDisplay> | ||
| 3479 | |||
| 3480 | ```yue | ||
| 3481 | my_object = { | ||
| 3482 | value: 1000 | ||
| 3483 | write: => print "the value:", @value | ||
| 3484 | } | ||
| 3485 | |||
| 3486 | run_callback = (func) -> | ||
| 3487 | print "running callback..." | ||
| 3488 | func! | ||
| 3489 | |||
| 3490 | -- isso não funcionará: | ||
| 3491 | -- a função não tem referência a my_object | ||
| 3492 | run_callback my_object.write | ||
| 3493 | |||
| 3494 | -- sintaxe de function stub | ||
| 3495 | -- nos permite empacotar o objeto em uma nova função | ||
| 3496 | run_callback my_object\write | ||
| 3497 | ``` | ||
| 3498 | |||
| 3499 | </YueDisplay> | ||
| 3500 | |||
| 3501 | # Backcalls | 1798 | # Backcalls |
| 3502 | 1799 | ||
| 3503 | Backcalls são usados para desaninhar callbacks. Eles são definidos usando setas apontando para a esquerda como o último parâmetro, preenchendo por padrão uma chamada de função. Toda a sintaxe é basicamente a mesma das funções seta regulares, exceto que apenas aponta para o outro lado e o corpo da função não requer indentação. | 1800 | Backcalls são usados para desaninhar callbacks. Eles são definidos usando setas apontando para a esquerda como o último parâmetro, preenchendo por padrão uma chamada de função. Toda a sintaxe é basicamente a mesma das funções seta regulares, exceto que apenas aponta para o outro lado e o corpo da função não requer indentação. |
| @@ -3507,15 +1804,6 @@ x <- f | |||
| 3507 | print "hello" .. x | 1804 | print "hello" .. x |
| 3508 | ``` | 1805 | ``` |
| 3509 | 1806 | ||
| 3510 | <YueDisplay> | ||
| 3511 | |||
| 3512 | ```yue | ||
| 3513 | x <- f | ||
| 3514 | print "hello" .. x | ||
| 3515 | ``` | ||
| 3516 | |||
| 3517 | </YueDisplay> | ||
| 3518 | |||
| 3519 | Funções seta "fat" também estão disponÃveis. | 1807 | Funções seta "fat" também estão disponÃveis. |
| 3520 | 1808 | ||
| 3521 | ```yuescript | 1809 | ```yuescript |
| @@ -3523,15 +1811,6 @@ Funções seta "fat" também estão disponÃveis. | |||
| 3523 | print @value | 1811 | print @value |
| 3524 | ``` | 1812 | ``` |
| 3525 | 1813 | ||
| 3526 | <YueDisplay> | ||
| 3527 | |||
| 3528 | ```yue | ||
| 3529 | <= f | ||
| 3530 | print @value | ||
| 3531 | ``` | ||
| 3532 | |||
| 3533 | </YueDisplay> | ||
| 3534 | |||
| 3535 | Você pode especificar um placeholder para onde deseja que a função backcall vá como parâmetro. | 1814 | Você pode especificar um placeholder para onde deseja que a função backcall vá como parâmetro. |
| 3536 | 1815 | ||
| 3537 | ```yuescript | 1816 | ```yuescript |
| @@ -3539,15 +1818,6 @@ Você pode especificar um placeholder para onde deseja que a função backcall v | |||
| 3539 | x * 2 | 1818 | x * 2 |
| 3540 | ``` | 1819 | ``` |
| 3541 | 1820 | ||
| 3542 | <YueDisplay> | ||
| 3543 | |||
| 3544 | ```yue | ||
| 3545 | (x) <- map _, [1, 2, 3] | ||
| 3546 | x * 2 | ||
| 3547 | ``` | ||
| 3548 | |||
| 3549 | </YueDisplay> | ||
| 3550 | |||
| 3551 | Se você desejar ter mais código após seus backcalls, pode colocá-los em uma instrução do. E os parênteses podem ser omitidos com funções seta não-fat. | 1821 | Se você desejar ter mais código após seus backcalls, pode colocá-los em uma instrução do. E os parênteses podem ser omitidos com funções seta não-fat. |
| 3552 | 1822 | ||
| 3553 | ```yuescript | 1823 | ```yuescript |
| @@ -3559,19 +1829,6 @@ result, msg = do | |||
| 3559 | print result, msg | 1829 | print result, msg |
| 3560 | ``` | 1830 | ``` |
| 3561 | 1831 | ||
| 3562 | <YueDisplay> | ||
| 3563 | |||
| 3564 | ```yue | ||
| 3565 | result, msg = do | ||
| 3566 | data <- readAsync "filename.txt" | ||
| 3567 | print data | ||
| 3568 | info <- processAsync data | ||
| 3569 | check info | ||
| 3570 | print result, msg | ||
| 3571 | ``` | ||
| 3572 | |||
| 3573 | </YueDisplay> | ||
| 3574 | |||
| 3575 | # Literais de função | 1832 | # Literais de função |
| 3576 | 1833 | ||
| 3577 | Todas as funções são criadas usando uma expressão de função. Uma função simples é denotada usando a seta: **->**. | 1834 | Todas as funções são criadas usando uma expressão de função. Uma função simples é denotada usando a seta: **->**. |
| @@ -3581,15 +1838,6 @@ my_function = -> | |||
| 3581 | my_function() -- chama a função vazia | 1838 | my_function() -- chama a função vazia |
| 3582 | ``` | 1839 | ``` |
| 3583 | 1840 | ||
| 3584 | <YueDisplay> | ||
| 3585 | |||
| 3586 | ```yue | ||
| 3587 | my_function = -> | ||
| 3588 | my_function() -- chama a função vazia | ||
| 3589 | ``` | ||
| 3590 | |||
| 3591 | </YueDisplay> | ||
| 3592 | |||
| 3593 | O corpo da função pode ser uma instrução colocada diretamente após a seta, ou pode ser uma série de instruções indentadas nas linhas seguintes: | 1841 | O corpo da função pode ser uma instrução colocada diretamente após a seta, ou pode ser uma série de instruções indentadas nas linhas seguintes: |
| 3594 | 1842 | ||
| 3595 | ```yuescript | 1843 | ```yuescript |
| @@ -3600,18 +1848,6 @@ func_b = -> | |||
| 3600 | print "The value:", value | 1848 | print "The value:", value |
| 3601 | ``` | 1849 | ``` |
| 3602 | 1850 | ||
| 3603 | <YueDisplay> | ||
| 3604 | |||
| 3605 | ```yue | ||
| 3606 | func_a = -> print "hello world" | ||
| 3607 | |||
| 3608 | func_b = -> | ||
| 3609 | value = 100 | ||
| 3610 | print "The value:", value | ||
| 3611 | ``` | ||
| 3612 | |||
| 3613 | </YueDisplay> | ||
| 3614 | |||
| 3615 | Se uma função não tem argumentos, ela pode ser chamada usando o operador !, em vez de parênteses vazios. A invocação ! é a forma preferida de chamar funções sem argumentos. | 1851 | Se uma função não tem argumentos, ela pode ser chamada usando o operador !, em vez de parênteses vazios. A invocação ! é a forma preferida de chamar funções sem argumentos. |
| 3616 | 1852 | ||
| 3617 | ```yuescript | 1853 | ```yuescript |
| @@ -3619,29 +1855,12 @@ func_a! | |||
| 3619 | func_b() | 1855 | func_b() |
| 3620 | ``` | 1856 | ``` |
| 3621 | 1857 | ||
| 3622 | <YueDisplay> | ||
| 3623 | |||
| 3624 | ```yue | ||
| 3625 | func_a! | ||
| 3626 | func_b() | ||
| 3627 | ``` | ||
| 3628 | |||
| 3629 | </YueDisplay> | ||
| 3630 | |||
| 3631 | Funções com argumentos podem ser criadas precedendo a seta com uma lista de nomes de argumentos entre parênteses: | 1858 | Funções com argumentos podem ser criadas precedendo a seta com uma lista de nomes de argumentos entre parênteses: |
| 3632 | 1859 | ||
| 3633 | ```yuescript | 1860 | ```yuescript |
| 3634 | sum = (x, y) -> print "sum", x + y | 1861 | sum = (x, y) -> print "sum", x + y |
| 3635 | ``` | 1862 | ``` |
| 3636 | 1863 | ||
| 3637 | <YueDisplay> | ||
| 3638 | |||
| 3639 | ```yue | ||
| 3640 | sum = (x, y) -> print "sum", x + y | ||
| 3641 | ``` | ||
| 3642 | |||
| 3643 | </YueDisplay> | ||
| 3644 | |||
| 3645 | Funções podem ser chamadas listando os argumentos após o nome de uma expressão que avalia para uma função. Ao encadear chamadas de função, os argumentos são aplicados à função mais próxima à esquerda. | 1864 | Funções podem ser chamadas listando os argumentos após o nome de uma expressão que avalia para uma função. Ao encadear chamadas de função, os argumentos são aplicados à função mais próxima à esquerda. |
| 3646 | 1865 | ||
| 3647 | ```yuescript | 1866 | ```yuescript |
| @@ -3651,31 +1870,12 @@ print sum 10, 20 | |||
| 3651 | a b c "a", "b", "c" | 1870 | a b c "a", "b", "c" |
| 3652 | ``` | 1871 | ``` |
| 3653 | 1872 | ||
| 3654 | <YueDisplay> | ||
| 3655 | |||
| 3656 | ```yue | ||
| 3657 | sum 10, 20 | ||
| 3658 | print sum 10, 20 | ||
| 3659 | |||
| 3660 | a b c "a", "b", "c" | ||
| 3661 | ``` | ||
| 3662 | |||
| 3663 | </YueDisplay> | ||
| 3664 | |||
| 3665 | Para evitar ambiguidade ao chamar funções, parênteses também podem ser usados para envolver os argumentos. Isso é necessário aqui para garantir que os argumentos certos sejam enviados às funções certas. | 1873 | Para evitar ambiguidade ao chamar funções, parênteses também podem ser usados para envolver os argumentos. Isso é necessário aqui para garantir que os argumentos certos sejam enviados às funções certas. |
| 3666 | 1874 | ||
| 3667 | ```yuescript | 1875 | ```yuescript |
| 3668 | print "x:", sum(10, 20), "y:", sum(30, 40) | 1876 | print "x:", sum(10, 20), "y:", sum(30, 40) |
| 3669 | ``` | 1877 | ``` |
| 3670 | 1878 | ||
| 3671 | <YueDisplay> | ||
| 3672 | |||
| 3673 | ```yue | ||
| 3674 | print "x:", sum(10, 20), "y:", sum(30, 40) | ||
| 3675 | ``` | ||
| 3676 | |||
| 3677 | </YueDisplay> | ||
| 3678 | |||
| 3679 | Não deve haver espaço entre o parêntese de abertura e a função. | 1879 | Não deve haver espaço entre o parêntese de abertura e a função. |
| 3680 | 1880 | ||
| 3681 | As funções convertem a última instrução em seu corpo em uma instrução de retorno, isso é chamado de retorno implÃcito: | 1881 | As funções convertem a última instrução em seu corpo em uma instrução de retorno, isso é chamado de retorno implÃcito: |
| @@ -3685,29 +1885,12 @@ sum = (x, y) -> x + y | |||
| 3685 | print "The sum is ", sum 10, 20 | 1885 | print "The sum is ", sum 10, 20 |
| 3686 | ``` | 1886 | ``` |
| 3687 | 1887 | ||
| 3688 | <YueDisplay> | ||
| 3689 | |||
| 3690 | ```yue | ||
| 3691 | sum = (x, y) -> x + y | ||
| 3692 | print "The sum is ", sum 10, 20 | ||
| 3693 | ``` | ||
| 3694 | |||
| 3695 | </YueDisplay> | ||
| 3696 | |||
| 3697 | E se você precisar retornar explicitamente, pode usar a palavra-chave return: | 1888 | E se você precisar retornar explicitamente, pode usar a palavra-chave return: |
| 3698 | 1889 | ||
| 3699 | ```yuescript | 1890 | ```yuescript |
| 3700 | sum = (x, y) -> return x + y | 1891 | sum = (x, y) -> return x + y |
| 3701 | ``` | 1892 | ``` |
| 3702 | 1893 | ||
| 3703 | <YueDisplay> | ||
| 3704 | |||
| 3705 | ```yue | ||
| 3706 | sum = (x, y) -> return x + y | ||
| 3707 | ``` | ||
| 3708 | |||
| 3709 | </YueDisplay> | ||
| 3710 | |||
| 3711 | Assim como no Lua, as funções podem retornar múltiplos valores. A última instrução deve ser uma lista de valores separados por vÃrgulas: | 1894 | Assim como no Lua, as funções podem retornar múltiplos valores. A última instrução deve ser uma lista de valores separados por vÃrgulas: |
| 3712 | 1895 | ||
| 3713 | ```yuescript | 1896 | ```yuescript |
| @@ -3715,15 +1898,6 @@ mystery = (x, y) -> x + y, x - y | |||
| 3715 | a, b = mystery 10, 20 | 1898 | a, b = mystery 10, 20 |
| 3716 | ``` | 1899 | ``` |
| 3717 | 1900 | ||
| 3718 | <YueDisplay> | ||
| 3719 | |||
| 3720 | ```yue | ||
| 3721 | mystery = (x, y) -> x + y, x - y | ||
| 3722 | a, b = mystery 10, 20 | ||
| 3723 | ``` | ||
| 3724 | |||
| 3725 | </YueDisplay> | ||
| 3726 | |||
| 3727 | ## Setas fat | 1901 | ## Setas fat |
| 3728 | 1902 | ||
| 3729 | Como é um idioma em Lua enviar um objeto como primeiro argumento ao chamar um método, uma sintaxe especial é fornecida para criar funções que incluem automaticamente um argumento self. | 1903 | Como é um idioma em Lua enviar um objeto como primeiro argumento ao chamar um método, uma sintaxe especial é fornecida para criar funções que incluem automaticamente um argumento self. |
| @@ -3732,14 +1906,6 @@ Como é um idioma em Lua enviar um objeto como primeiro argumento ao chamar um m | |||
| 3732 | func = (num) => @value + num | 1906 | func = (num) => @value + num |
| 3733 | ``` | 1907 | ``` |
| 3734 | 1908 | ||
| 3735 | <YueDisplay> | ||
| 3736 | |||
| 3737 | ```yue | ||
| 3738 | func = (num) => @value + num | ||
| 3739 | ``` | ||
| 3740 | |||
| 3741 | </YueDisplay> | ||
| 3742 | |||
| 3743 | ## Valores padrão de argumentos | 1909 | ## Valores padrão de argumentos |
| 3744 | 1910 | ||
| 3745 | É possÃvel fornecer valores padrão para os argumentos de uma função. Um argumento é determinado como vazio se seu valor for nil. Qualquer argumento nil que tenha valor padrão será substituÃdo antes da execução do corpo da função. | 1911 | É possÃvel fornecer valores padrão para os argumentos de uma função. Um argumento é determinado como vazio se seu valor for nil. Qualquer argumento nil que tenha valor padrão será substituÃdo antes da execução do corpo da função. |
| @@ -3750,16 +1916,6 @@ my_function = (name = "something", height = 100) -> | |||
| 3750 | print "My height is", height | 1916 | print "My height is", height |
| 3751 | ``` | 1917 | ``` |
| 3752 | 1918 | ||
| 3753 | <YueDisplay> | ||
| 3754 | |||
| 3755 | ```yue | ||
| 3756 | my_function = (name = "something", height = 100) -> | ||
| 3757 | print "Hello I am", name | ||
| 3758 | print "My height is", height | ||
| 3759 | ``` | ||
| 3760 | |||
| 3761 | </YueDisplay> | ||
| 3762 | |||
| 3763 | Uma expressão de valor padrão de argumento é avaliada no corpo da função na ordem das declarações de argumentos. Por esse motivo, os valores padrão têm acesso aos argumentos declarados anteriormente. | 1919 | Uma expressão de valor padrão de argumento é avaliada no corpo da função na ordem das declarações de argumentos. Por esse motivo, os valores padrão têm acesso aos argumentos declarados anteriormente. |
| 3764 | 1920 | ||
| 3765 | ```yuescript | 1921 | ```yuescript |
| @@ -3767,15 +1923,6 @@ some_args = (x = 100, y = x + 1000) -> | |||
| 3767 | print x + y | 1923 | print x + y |
| 3768 | ``` | 1924 | ``` |
| 3769 | 1925 | ||
| 3770 | <YueDisplay> | ||
| 3771 | |||
| 3772 | ```yue | ||
| 3773 | some_args = (x = 100, y = x + 1000) -> | ||
| 3774 | print x + y | ||
| 3775 | ``` | ||
| 3776 | |||
| 3777 | </YueDisplay> | ||
| 3778 | |||
| 3779 | ## Considerações | 1926 | ## Considerações |
| 3780 | 1927 | ||
| 3781 | Devido à forma expressiva de chamar funções sem parênteses, algumas restrições devem ser colocadas para evitar ambiguidade de análise envolvendo espaço em branco. | 1928 | Devido à forma expressiva de chamar funções sem parênteses, algumas restrições devem ser colocadas para evitar ambiguidade de análise envolvendo espaço em branco. |
| @@ -3789,17 +1936,6 @@ c = x -y | |||
| 3789 | d = x- z | 1936 | d = x- z |
| 3790 | ``` | 1937 | ``` |
| 3791 | 1938 | ||
| 3792 | <YueDisplay> | ||
| 3793 | |||
| 3794 | ```yue | ||
| 3795 | a = x - 10 | ||
| 3796 | b = x-10 | ||
| 3797 | c = x -y | ||
| 3798 | d = x- z | ||
| 3799 | ``` | ||
| 3800 | |||
| 3801 | </YueDisplay> | ||
| 3802 | |||
| 3803 | A precedência do primeiro argumento de uma chamada de função pode ser controlada usando espaço em branco se o argumento for um literal de string. Em Lua, é comum omitir parênteses ao chamar uma função com uma única string ou literal de tabela. | 1939 | A precedência do primeiro argumento de uma chamada de função pode ser controlada usando espaço em branco se o argumento for um literal de string. Em Lua, é comum omitir parênteses ao chamar uma função com uma única string ou literal de tabela. |
| 3804 | 1940 | ||
| 3805 | Quando não há espaço entre uma variável e um literal de string, a chamada de função tem precedência sobre quaisquer expressões seguintes. Nenhum outro argumento pode ser passado para a função quando ela é chamada dessa forma. | 1941 | Quando não há espaço entre uma variável e um literal de string, a chamada de função tem precedência sobre quaisquer expressões seguintes. Nenhum outro argumento pode ser passado para a função quando ela é chamada dessa forma. |
| @@ -3811,15 +1947,6 @@ x = func"hello" + 100 | |||
| 3811 | y = func "hello" + 100 | 1947 | y = func "hello" + 100 |
| 3812 | ``` | 1948 | ``` |
| 3813 | 1949 | ||
| 3814 | <YueDisplay> | ||
| 3815 | |||
| 3816 | ```yue | ||
| 3817 | x = func"hello" + 100 | ||
| 3818 | y = func "hello" + 100 | ||
| 3819 | ``` | ||
| 3820 | |||
| 3821 | </YueDisplay> | ||
| 3822 | |||
| 3823 | ## Argumentos multilinha | 1950 | ## Argumentos multilinha |
| 3824 | 1951 | ||
| 3825 | Ao chamar funções que recebem um grande número de argumentos, é conveniente dividir a lista de argumentos em várias linhas. Devido à natureza sensÃvel a espaço em branco da linguagem, deve-se ter cuidado ao dividir a lista de argumentos. | 1952 | Ao chamar funções que recebem um grande número de argumentos, é conveniente dividir a lista de argumentos em várias linhas. Devido à natureza sensÃvel a espaço em branco da linguagem, deve-se ter cuidado ao dividir a lista de argumentos. |
| @@ -3836,20 +1963,6 @@ cool_func 1, 2, | |||
| 3836 | 7, 8 | 1963 | 7, 8 |
| 3837 | ``` | 1964 | ``` |
| 3838 | 1965 | ||
| 3839 | <YueDisplay> | ||
| 3840 | |||
| 3841 | ```yue | ||
| 3842 | my_func 5, 4, 3, | ||
| 3843 | 8, 9, 10 | ||
| 3844 | |||
| 3845 | cool_func 1, 2, | ||
| 3846 | 3, 4, | ||
| 3847 | 5, 6, | ||
| 3848 | 7, 8 | ||
| 3849 | ``` | ||
| 3850 | |||
| 3851 | </YueDisplay> | ||
| 3852 | |||
| 3853 | Este tipo de invocação pode ser aninhado. O nÃvel de indentação é usado para determinar a qual função os argumentos pertencem. | 1966 | Este tipo de invocação pode ser aninhado. O nÃvel de indentação é usado para determinar a qual função os argumentos pertencem. |
| 3854 | 1967 | ||
| 3855 | ```yuescript | 1968 | ```yuescript |
| @@ -3859,17 +1972,6 @@ my_func 5, 6, 7, | |||
| 3859 | 5, 4 | 1972 | 5, 4 |
| 3860 | ``` | 1973 | ``` |
| 3861 | 1974 | ||
| 3862 | <YueDisplay> | ||
| 3863 | |||
| 3864 | ```yue | ||
| 3865 | my_func 5, 6, 7, | ||
| 3866 | 6, another_func 6, 7, 8, | ||
| 3867 | 9, 1, 2, | ||
| 3868 | 5, 4 | ||
| 3869 | ``` | ||
| 3870 | |||
| 3871 | </YueDisplay> | ||
| 3872 | |||
| 3873 | Como as tabelas também usam vÃrgula como delimitador, esta sintaxe de indentação ajuda a deixar os valores fazerem parte da lista de argumentos em vez de fazerem parte da tabela. | 1975 | Como as tabelas também usam vÃrgula como delimitador, esta sintaxe de indentação ajuda a deixar os valores fazerem parte da lista de argumentos em vez de fazerem parte da tabela. |
| 3874 | 1976 | ||
| 3875 | ```yuescript | 1977 | ```yuescript |
| @@ -3880,18 +1982,6 @@ x = [ | |||
| 3880 | ] | 1982 | ] |
| 3881 | ``` | 1983 | ``` |
| 3882 | 1984 | ||
| 3883 | <YueDisplay> | ||
| 3884 | |||
| 3885 | ```yue | ||
| 3886 | x = [ | ||
| 3887 | 1, 2, 3, 4, a_func 4, 5, | ||
| 3888 | 5, 6, | ||
| 3889 | 8, 9, 10 | ||
| 3890 | ] | ||
| 3891 | ``` | ||
| 3892 | |||
| 3893 | </YueDisplay> | ||
| 3894 | |||
| 3895 | Embora incomum, observe como podemos dar uma indentação mais profunda para argumentos de função se soubermos que usaremos uma indentação menor mais adiante. | 1985 | Embora incomum, observe como podemos dar uma indentação mais profunda para argumentos de função se soubermos que usaremos uma indentação menor mais adiante. |
| 3896 | 1986 | ||
| 3897 | ```yuescript | 1987 | ```yuescript |
| @@ -3901,17 +1991,6 @@ y = [ my_func 1, 2, 3, | |||
| 3901 | ] | 1991 | ] |
| 3902 | ``` | 1992 | ``` |
| 3903 | 1993 | ||
| 3904 | <YueDisplay> | ||
| 3905 | |||
| 3906 | ```yue | ||
| 3907 | y = [ my_func 1, 2, 3, | ||
| 3908 | 4, 5, | ||
| 3909 | 5, 6, 7 | ||
| 3910 | ] | ||
| 3911 | ``` | ||
| 3912 | |||
| 3913 | </YueDisplay> | ||
| 3914 | |||
| 3915 | A mesma coisa pode ser feita com outras instruções em nÃvel de bloco como condicionais. Podemos usar o nÃvel de indentação para determinar a qual instrução um valor pertence: | 1994 | A mesma coisa pode ser feita com outras instruções em nÃvel de bloco como condicionais. Podemos usar o nÃvel de indentação para determinar a qual instrução um valor pertence: |
| 3916 | 1995 | ||
| 3917 | ```yuescript | 1996 | ```yuescript |
| @@ -3928,24 +2007,6 @@ if func 1, 2, 3, | |||
| 3928 | print "I am inside if" | 2007 | print "I am inside if" |
| 3929 | ``` | 2008 | ``` |
| 3930 | 2009 | ||
| 3931 | <YueDisplay> | ||
| 3932 | |||
| 3933 | ```yue | ||
| 3934 | if func 1, 2, 3, | ||
| 3935 | "hello", | ||
| 3936 | "world" | ||
| 3937 | print "hello" | ||
| 3938 | print "I am inside if" | ||
| 3939 | |||
| 3940 | if func 1, 2, 3, | ||
| 3941 | "hello", | ||
| 3942 | "world" | ||
| 3943 | print "hello" | ||
| 3944 | print "I am inside if" | ||
| 3945 | ``` | ||
| 3946 | |||
| 3947 | </YueDisplay> | ||
| 3948 | |||
| 3949 | ## Desestruturação de parâmetros | 2010 | ## Desestruturação de parâmetros |
| 3950 | 2011 | ||
| 3951 | YueScript agora suporta desestruturação de parâmetros de função quando o argumento é um objeto. Duas formas de literais de tabela de desestruturação estão disponÃveis: | 2012 | YueScript agora suporta desestruturação de parâmetros de função quando o argumento é um objeto. Duas formas de literais de tabela de desestruturação estão disponÃveis: |
| @@ -3967,23 +2028,6 @@ arg1 = {a: 0} | |||
| 3967 | f2 arg1, arg2 | 2028 | f2 arg1, arg2 |
| 3968 | ``` | 2029 | ``` |
| 3969 | 2030 | ||
| 3970 | <YueDisplay> | ||
| 3971 | |||
| 3972 | ```yue | ||
| 3973 | f1 = (:a, :b, :c) -> | ||
| 3974 | print a, b, c | ||
| 3975 | |||
| 3976 | f1 a: 1, b: "2", c: {} | ||
| 3977 | |||
| 3978 | f2 = ({a: a1 = 123, :b = 'abc'}, c = {}) -> | ||
| 3979 | print a1, b, c | ||
| 3980 | |||
| 3981 | arg1 = {a: 0} | ||
| 3982 | f2 arg1, arg2 | ||
| 3983 | ``` | ||
| 3984 | |||
| 3985 | </YueDisplay> | ||
| 3986 | |||
| 3987 | ## Expressão de retorno prefixada | 2031 | ## Expressão de retorno prefixada |
| 3988 | 2032 | ||
| 3989 | Ao trabalhar com corpos de função profundamente aninhados, pode ser tedioso manter a legibilidade e consistência do valor de retorno. Para resolver isso, YueScript introduz a sintaxe **Expressão de Retorno Prefixada**. Sua forma é a seguinte: | 2033 | Ao trabalhar com corpos de função profundamente aninhados, pode ser tedioso manter a legibilidade e consistência do valor de retorno. Para resolver isso, YueScript introduz a sintaxe **Expressão de Retorno Prefixada**. Sua forma é a seguinte: |
| @@ -3997,19 +2041,6 @@ findFirstEven = (list): nil -> | |||
| 3997 | return sub | 2041 | return sub |
| 3998 | ``` | 2042 | ``` |
| 3999 | 2043 | ||
| 4000 | <YueDisplay> | ||
| 4001 | |||
| 4002 | ```yue | ||
| 4003 | findFirstEven = (list): nil -> | ||
| 4004 | for item in *list | ||
| 4005 | if type(item) == "table" | ||
| 4006 | for sub in *item | ||
| 4007 | if sub % 2 == 0 | ||
| 4008 | return sub | ||
| 4009 | ``` | ||
| 4010 | |||
| 4011 | </YueDisplay> | ||
| 4012 | |||
| 4013 | Isso é equivalente a: | 2044 | Isso é equivalente a: |
| 4014 | 2045 | ||
| 4015 | ```yuescript | 2046 | ```yuescript |
| @@ -4022,20 +2053,6 @@ findFirstEven = (list) -> | |||
| 4022 | nil | 2053 | nil |
| 4023 | ``` | 2054 | ``` |
| 4024 | 2055 | ||
| 4025 | <YueDisplay> | ||
| 4026 | |||
| 4027 | ```yue | ||
| 4028 | findFirstEven = (list) -> | ||
| 4029 | for item in *list | ||
| 4030 | if type(item) == "table" | ||
| 4031 | for sub in *item | ||
| 4032 | if sub % 2 == 0 | ||
| 4033 | return sub | ||
| 4034 | nil | ||
| 4035 | ``` | ||
| 4036 | |||
| 4037 | </YueDisplay> | ||
| 4038 | |||
| 4039 | A única diferença é que você pode mover a expressão de retorno final antes do token `->` ou `=>` para indicar o valor de retorno implÃcito da função como última instrução. Dessa forma, mesmo em funções com múltiplos loops aninhados ou ramificações condicionais, você não precisa mais escrever uma expressão de retorno no final do corpo da função, tornando a estrutura lógica mais direta e fácil de seguir. | 2056 | A única diferença é que você pode mover a expressão de retorno final antes do token `->` ou `=>` para indicar o valor de retorno implÃcito da função como última instrução. Dessa forma, mesmo em funções com múltiplos loops aninhados ou ramificações condicionais, você não precisa mais escrever uma expressão de retorno no final do corpo da função, tornando a estrutura lógica mais direta e fácil de seguir. |
| 4040 | 2057 | ||
| 4041 | ## Varargs nomeados | 2058 | ## Varargs nomeados |
| @@ -4064,32 +2081,6 @@ process = (...args) -> | |||
| 4064 | process 1, nil, 3, nil, 5 | 2081 | process 1, nil, 3, nil, 5 |
| 4065 | ``` | 2082 | ``` |
| 4066 | 2083 | ||
| 4067 | <YueDisplay> | ||
| 4068 | |||
| 4069 | ```yue | ||
| 4070 | f = (...t) -> | ||
| 4071 | print "contagem de argumentos:", t.n | ||
| 4072 | print "comprimento da tabela:", #t | ||
| 4073 | for i = 1, t.n | ||
| 4074 | print t[i] | ||
| 4075 | |||
| 4076 | f 1, 2, 3 | ||
| 4077 | f "a", "b", "c", "d" | ||
| 4078 | f! | ||
| 4079 | |||
| 4080 | -- Tratando casos com valores nil | ||
| 4081 | process = (...args) -> | ||
| 4082 | sum = 0 | ||
| 4083 | for i = 1, args.n | ||
| 4084 | if args[i] != nil and type(args[i]) == "number" | ||
| 4085 | sum += args[i] | ||
| 4086 | sum | ||
| 4087 | |||
| 4088 | process 1, nil, 3, nil, 5 | ||
| 4089 | ``` | ||
| 4090 | |||
| 4091 | </YueDisplay> | ||
| 4092 | |||
| 4093 | # Espaço em branco | 2084 | # Espaço em branco |
| 4094 | 2085 | ||
| 4095 | YueScript é uma linguagem sensÃvel a espaço em branco. Você precisa escrever blocos de código na mesma indentação com espaço **' '** ou tabulação **'\t'**, como corpo de função, lista de valores e alguns blocos de controle. E expressões contendo diferentes espaços em branco podem significar coisas diferentes. Tabulação é tratada como 4 espaços, mas é melhor não misturar o uso de espaços e tabulações. | 2086 | YueScript é uma linguagem sensÃvel a espaço em branco. Você precisa escrever blocos de código na mesma indentação com espaço **' '** ou tabulação **'\t'**, como corpo de função, lista de valores e alguns blocos de controle. E expressões contendo diferentes espaços em branco podem significar coisas diferentes. Tabulação é tratada como 4 espaços, mas é melhor não misturar o uso de espaços e tabulações. |
| @@ -4102,14 +2093,6 @@ Uma instrução normalmente termina em uma quebra de linha. Você também pode u | |||
| 4102 | a = 1; b = 2; print a + b | 2093 | a = 1; b = 2; print a + b |
| 4103 | ``` | 2094 | ``` |
| 4104 | 2095 | ||
| 4105 | <YueDisplay> | ||
| 4106 | |||
| 4107 | ```yue | ||
| 4108 | a = 1; b = 2; print a + b | ||
| 4109 | ``` | ||
| 4110 | |||
| 4111 | </YueDisplay> | ||
| 4112 | |||
| 4113 | ## Encadeamento multilinha | 2096 | ## Encadeamento multilinha |
| 4114 | 2097 | ||
| 4115 | Você pode escrever chamadas de função encadeadas em múltiplas linhas com a mesma indentação. | 2098 | Você pode escrever chamadas de função encadeadas em múltiplas linhas com a mesma indentação. |
| @@ -4123,19 +2106,6 @@ Rx.Observable | |||
| 4123 | \subscribe print | 2106 | \subscribe print |
| 4124 | ``` | 2107 | ``` |
| 4125 | 2108 | ||
| 4126 | <YueDisplay> | ||
| 4127 | |||
| 4128 | ```yue | ||
| 4129 | Rx.Observable | ||
| 4130 | .fromRange 1, 8 | ||
| 4131 | \filter (x) -> x % 2 == 0 | ||
| 4132 | \concat Rx.Observable.of 'who do we appreciate' | ||
| 4133 | \map (value) -> value .. '!' | ||
| 4134 | \subscribe print | ||
| 4135 | ``` | ||
| 4136 | |||
| 4137 | </YueDisplay> | ||
| 4138 | |||
| 4139 | # Comentário | 2109 | # Comentário |
| 4140 | 2110 | ||
| 4141 | ```yuescript | 2111 | ```yuescript |
| @@ -4151,23 +2121,6 @@ Está OK. | |||
| 4151 | func --[[port]] 3000, --[[ip]] "192.168.1.1" | 2121 | func --[[port]] 3000, --[[ip]] "192.168.1.1" |
| 4152 | ``` | 2122 | ``` |
| 4153 | 2123 | ||
| 4154 | <YueDisplay> | ||
| 4155 | |||
| 4156 | ```yue | ||
| 4157 | -- Eu sou um comentário | ||
| 4158 | |||
| 4159 | str = --[[ | ||
| 4160 | Este é um comentário multilinha. | ||
| 4161 | Está OK. | ||
| 4162 | ]] strA \ -- comentário 1 | ||
| 4163 | .. strB \ -- comentário 2 | ||
| 4164 | .. strC | ||
| 4165 | |||
| 4166 | func --[[port]] 3000, --[[ip]] "192.168.1.1" | ||
| 4167 | ``` | ||
| 4168 | |||
| 4169 | </YueDisplay> | ||
| 4170 | |||
| 4171 | # Atributos | 2124 | # Atributos |
| 4172 | 2125 | ||
| 4173 | Suporte de sintaxe para atributos do Lua 5.4. E você ainda pode usar tanto a declaração `const` quanto `close` e obter verificação de constante e callback com escopo funcionando ao direcionar para versões do Lua abaixo da 5.4. | 2126 | Suporte de sintaxe para atributos do Lua 5.4. E você ainda pode usar tanto a declaração `const` quanto `close` e obter verificação de constante e callback com escopo funcionando ao direcionar para versões do Lua abaixo da 5.4. |
| @@ -4177,15 +2130,6 @@ const a = 123 | |||
| 4177 | close _ = <close>: -> print "Fora do escopo." | 2130 | close _ = <close>: -> print "Fora do escopo." |
| 4178 | ``` | 2131 | ``` |
| 4179 | 2132 | ||
| 4180 | <YueDisplay> | ||
| 4181 | |||
| 4182 | ```yue | ||
| 4183 | const a = 123 | ||
| 4184 | close _ = <close>: -> print "Fora do escopo." | ||
| 4185 | ``` | ||
| 4186 | |||
| 4187 | </YueDisplay> | ||
| 4188 | |||
| 4189 | Você pode fazer desestruturação com variáveis atribuÃdas como constante. | 2133 | Você pode fazer desestruturação com variáveis atribuÃdas como constante. |
| 4190 | 2134 | ||
| 4191 | ```yuescript | 2135 | ```yuescript |
| @@ -4193,15 +2137,6 @@ const {:a, :b, c, d} = tb | |||
| 4193 | -- a = 1 | 2137 | -- a = 1 |
| 4194 | ``` | 2138 | ``` |
| 4195 | 2139 | ||
| 4196 | <YueDisplay> | ||
| 4197 | |||
| 4198 | ```yue | ||
| 4199 | const {:a, :b, c, d} = tb | ||
| 4200 | -- a = 1 | ||
| 4201 | ``` | ||
| 4202 | |||
| 4203 | </YueDisplay> | ||
| 4204 | |||
| 4205 | Você também pode declarar uma variável global como `const`. | 2140 | Você também pode declarar uma variável global como `const`. |
| 4206 | 2141 | ||
| 4207 | ```yuescript | 2142 | ```yuescript |
| @@ -4209,15 +2144,6 @@ global const Constant = 123 | |||
| 4209 | -- Constant = 1 | 2144 | -- Constant = 1 |
| 4210 | ``` | 2145 | ``` |
| 4211 | 2146 | ||
| 4212 | <YueDisplay> | ||
| 4213 | |||
| 4214 | ```yue | ||
| 4215 | global const Constant = 123 | ||
| 4216 | -- Constant = 1 | ||
| 4217 | ``` | ||
| 4218 | |||
| 4219 | </YueDisplay> | ||
| 4220 | |||
| 4221 | # Operador | 2147 | # Operador |
| 4222 | 2148 | ||
| 4223 | Todos os operadores binários e unários do Lua estão disponÃveis. Além disso, **!=** é um alias para **~=**, e **\\** ou **::** podem ser usados para escrever uma chamada de função encadeada como `tb\func!` ou `tb::func!`. E o YueScript oferece alguns outros operadores especiais para escrever códigos mais expressivos. | 2149 | Todos os operadores binários e unários do Lua estão disponÃveis. Além disso, **!=** é um alias para **~=**, e **\\** ou **::** podem ser usados para escrever uma chamada de função encadeada como `tb\func!` ou `tb::func!`. E o YueScript oferece alguns outros operadores especiais para escrever códigos mais expressivos. |
| @@ -4227,15 +2153,6 @@ tb\func! if tb ~= nil | |||
| 4227 | tb::func! if tb != nil | 2153 | tb::func! if tb != nil |
| 4228 | ``` | 2154 | ``` |
| 4229 | 2155 | ||
| 4230 | <YueDisplay> | ||
| 4231 | |||
| 4232 | ```yue | ||
| 4233 | tb\func! if tb ~= nil | ||
| 4234 | tb::func! if tb != nil | ||
| 4235 | ``` | ||
| 4236 | |||
| 4237 | </YueDisplay> | ||
| 4238 | |||
| 4239 | ## Comparações encadeadas | 2156 | ## Comparações encadeadas |
| 4240 | 2157 | ||
| 4241 | Comparações podem ser encadeadas arbitrariamente: | 2158 | Comparações podem ser encadeadas arbitrariamente: |
| @@ -4249,19 +2166,6 @@ print 1 <= a <= 10 | |||
| 4249 | -- saÃda: true | 2166 | -- saÃda: true |
| 4250 | ``` | 2167 | ``` |
| 4251 | 2168 | ||
| 4252 | <YueDisplay> | ||
| 4253 | |||
| 4254 | ```yue | ||
| 4255 | print 1 < 2 <= 2 < 3 == 3 > 2 >= 1 == 1 < 3 != 5 | ||
| 4256 | -- saÃda: true | ||
| 4257 | |||
| 4258 | a = 5 | ||
| 4259 | print 1 <= a <= 10 | ||
| 4260 | -- saÃda: true | ||
| 4261 | ``` | ||
| 4262 | |||
| 4263 | </YueDisplay> | ||
| 4264 | |||
| 4265 | Observe o comportamento de avaliação das comparações encadeadas: | 2169 | Observe o comportamento de avaliação das comparações encadeadas: |
| 4266 | 2170 | ||
| 4267 | ```yuescript | 2171 | ```yuescript |
| @@ -4287,33 +2191,6 @@ print v(1) > v(2) <= v(3) | |||
| 4287 | ]] | 2191 | ]] |
| 4288 | ``` | 2192 | ``` |
| 4289 | 2193 | ||
| 4290 | <YueDisplay> | ||
| 4291 | |||
| 4292 | ```yue | ||
| 4293 | v = (x) -> | ||
| 4294 | print x | ||
| 4295 | x | ||
| 4296 | |||
| 4297 | print v(1) < v(2) <= v(3) | ||
| 4298 | --[[ | ||
| 4299 | saÃda: | ||
| 4300 | 2 | ||
| 4301 | 1 | ||
| 4302 | 3 | ||
| 4303 | true | ||
| 4304 | ]] | ||
| 4305 | |||
| 4306 | print v(1) > v(2) <= v(3) | ||
| 4307 | --[[ | ||
| 4308 | saÃda: | ||
| 4309 | 2 | ||
| 4310 | 1 | ||
| 4311 | false | ||
| 4312 | ]] | ||
| 4313 | ``` | ||
| 4314 | |||
| 4315 | </YueDisplay> | ||
| 4316 | |||
| 4317 | A expressão do meio é avaliada apenas uma vez, em vez de duas vezes como seria se a expressão fosse escrita como `v(1) < v(2) and v(2) <= v(3)`. No entanto, a ordem das avaliações em uma comparação encadeada é indefinida. É fortemente recomendado não usar expressões com efeitos colaterais (como impressão) em comparações encadeadas. Se efeitos colaterais forem necessários, o operador de curto-circuito `and` deve ser usado explicitamente. | 2194 | A expressão do meio é avaliada apenas uma vez, em vez de duas vezes como seria se a expressão fosse escrita como `v(1) < v(2) and v(2) <= v(3)`. No entanto, a ordem das avaliações em uma comparação encadeada é indefinida. É fortemente recomendado não usar expressões com efeitos colaterais (como impressão) em comparações encadeadas. Se efeitos colaterais forem necessários, o operador de curto-circuito `and` deve ser usado explicitamente. |
| 4318 | 2195 | ||
| 4319 | ## Anexar à tabela | 2196 | ## Anexar à tabela |
| @@ -4325,15 +2202,6 @@ tab = [] | |||
| 4325 | tab[] = "Value" | 2202 | tab[] = "Value" |
| 4326 | ``` | 2203 | ``` |
| 4327 | 2204 | ||
| 4328 | <YueDisplay> | ||
| 4329 | |||
| 4330 | ```yue | ||
| 4331 | tab = [] | ||
| 4332 | tab[] = "Value" | ||
| 4333 | ``` | ||
| 4334 | |||
| 4335 | </YueDisplay> | ||
| 4336 | |||
| 4337 | Você também pode usar o operador spread `...` para anexar todos os elementos de uma lista a outra: | 2205 | Você também pode usar o operador spread `...` para anexar todos os elementos de uma lista a outra: |
| 4338 | 2206 | ||
| 4339 | ```yuescript | 2207 | ```yuescript |
| @@ -4343,17 +2211,6 @@ tbA[] = ...tbB | |||
| 4343 | -- tbA agora é [1, 2, 3, 4, 5, 6] | 2211 | -- tbA agora é [1, 2, 3, 4, 5, 6] |
| 4344 | ``` | 2212 | ``` |
| 4345 | 2213 | ||
| 4346 | <YueDisplay> | ||
| 4347 | |||
| 4348 | ```yue | ||
| 4349 | tbA = [1, 2, 3] | ||
| 4350 | tbB = [4, 5, 6] | ||
| 4351 | tbA[] = ...tbB | ||
| 4352 | -- tbA agora é [1, 2, 3, 4, 5, 6] | ||
| 4353 | ``` | ||
| 4354 | |||
| 4355 | </YueDisplay> | ||
| 4356 | |||
| 4357 | ## Spread de tabela | 2214 | ## Spread de tabela |
| 4358 | 2215 | ||
| 4359 | Você pode concatenar tabelas de array ou tabelas hash usando o operador spread `...` antes de expressões em literais de tabela. | 2216 | Você pode concatenar tabelas de array ou tabelas hash usando o operador spread `...` antes de expressões em literais de tabela. |
| @@ -4375,27 +2232,6 @@ b = {4, 5, y: 1} | |||
| 4375 | merge = {...a, ...b} | 2232 | merge = {...a, ...b} |
| 4376 | ``` | 2233 | ``` |
| 4377 | 2234 | ||
| 4378 | <YueDisplay> | ||
| 4379 | |||
| 4380 | ```yue | ||
| 4381 | parts = | ||
| 4382 | * "shoulders" | ||
| 4383 | * "knees" | ||
| 4384 | lyrics = | ||
| 4385 | * "head" | ||
| 4386 | * ...parts | ||
| 4387 | * "and" | ||
| 4388 | * "toes" | ||
| 4389 | |||
| 4390 | copy = {...other} | ||
| 4391 | |||
| 4392 | a = {1, 2, 3, x: 1} | ||
| 4393 | b = {4, 5, y: 1} | ||
| 4394 | merge = {...a, ...b} | ||
| 4395 | ``` | ||
| 4396 | |||
| 4397 | </YueDisplay> | ||
| 4398 | |||
| 4399 | ## Indexação reversa de tabela | 2235 | ## Indexação reversa de tabela |
| 4400 | 2236 | ||
| 4401 | Você pode usar o operador **#** para obter os últimos elementos de uma tabela. | 2237 | Você pode usar o operador **#** para obter os últimos elementos de uma tabela. |
| @@ -4406,16 +2242,6 @@ second_last = data.items[#-1] | |||
| 4406 | data.items[#] = 1 | 2242 | data.items[#] = 1 |
| 4407 | ``` | 2243 | ``` |
| 4408 | 2244 | ||
| 4409 | <YueDisplay> | ||
| 4410 | |||
| 4411 | ```yue | ||
| 4412 | last = data.items[#] | ||
| 4413 | second_last = data.items[#-1] | ||
| 4414 | data.items[#] = 1 | ||
| 4415 | ``` | ||
| 4416 | |||
| 4417 | </YueDisplay> | ||
| 4418 | |||
| 4419 | ## Metatable | 2245 | ## Metatable |
| 4420 | 2246 | ||
| 4421 | O operador **<>** pode ser usado como atalho para manipulação de metatable. | 2247 | O operador **<>** pode ser usado como atalho para manipulação de metatable. |
| @@ -4440,26 +2266,6 @@ print d.value | |||
| 4440 | close _ = <close>: -> print "fora do escopo" | 2266 | close _ = <close>: -> print "fora do escopo" |
| 4441 | ``` | 2267 | ``` |
| 4442 | 2268 | ||
| 4443 | <YueDisplay> | ||
| 4444 | |||
| 4445 | ```yue | ||
| 4446 | mt = {} | ||
| 4447 | add = (right) => <>: mt, value: @value + right.value | ||
| 4448 | mt.__add = add | ||
| 4449 | |||
| 4450 | a = <>: mt, value: 1 | ||
| 4451 | -- definir campo com variável de mesmo nome | ||
| 4452 | b = :<add>, value: 2 | ||
| 4453 | c = <add>: mt.__add, value: 3 | ||
| 4454 | |||
| 4455 | d = a + b + c | ||
| 4456 | print d.value | ||
| 4457 | |||
| 4458 | close _ = <close>: -> print "fora do escopo" | ||
| 4459 | ``` | ||
| 4460 | |||
| 4461 | </YueDisplay> | ||
| 4462 | |||
| 4463 | ### Acesso à metatable | 2269 | ### Acesso à metatable |
| 4464 | 2270 | ||
| 4465 | Acesse a metatable com **<>** ou nome do metamétodo cercado por **<>** ou escrevendo alguma expressão em **<>**. | 2271 | Acesse a metatable com **<>** ou nome do metamétodo cercado por **<>** ou escrevendo alguma expressão em **<>**. |
| @@ -4474,19 +2280,6 @@ tb.<> = __index: {item: "hello"} | |||
| 4474 | print tb.item | 2280 | print tb.item |
| 4475 | ``` | 2281 | ``` |
| 4476 | 2282 | ||
| 4477 | <YueDisplay> | ||
| 4478 | |||
| 4479 | ```yue | ||
| 4480 | -- criar com metatable contendo campo "value" | ||
| 4481 | tb = <"value">: 123 | ||
| 4482 | tb.<index> = tb.<> | ||
| 4483 | print tb.value | ||
| 4484 | tb.<> = __index: {item: "hello"} | ||
| 4485 | print tb.item | ||
| 4486 | ``` | ||
| 4487 | |||
| 4488 | </YueDisplay> | ||
| 4489 | |||
| 4490 | ### Desestruturação de metatable | 2283 | ### Desestruturação de metatable |
| 4491 | 2284 | ||
| 4492 | Desestruture a metatable com chave de metamétodo cercada por **<>**. | 2285 | Desestruture a metatable com chave de metamétodo cercada por **<>**. |
| @@ -4496,15 +2289,6 @@ Desestruture a metatable com chave de metamétodo cercada por **<>**. | |||
| 4496 | print item, new, close, getter | 2289 | print item, new, close, getter |
| 4497 | ``` | 2290 | ``` |
| 4498 | 2291 | ||
| 4499 | <YueDisplay> | ||
| 4500 | |||
| 4501 | ```yue | ||
| 4502 | {item, :new, :<close>, <index>: getter} = tb | ||
| 4503 | print item, new, close, getter | ||
| 4504 | ``` | ||
| 4505 | |||
| 4506 | </YueDisplay> | ||
| 4507 | |||
| 4508 | ## Existência | 2292 | ## Existência |
| 4509 | 2293 | ||
| 4510 | O operador **?** pode ser usado em diversos contextos para verificar existência. | 2294 | O operador **?** pode ser usado em diversos contextos para verificar existência. |
| @@ -4524,25 +2308,6 @@ with? io.open "test.txt", "w" | |||
| 4524 | \close! | 2308 | \close! |
| 4525 | ``` | 2309 | ``` |
| 4526 | 2310 | ||
| 4527 | <YueDisplay> | ||
| 4528 | |||
| 4529 | ```yue | ||
| 4530 | func?! | ||
| 4531 | print abc?["hello world"]?.xyz | ||
| 4532 | |||
| 4533 | x = tab?.value | ||
| 4534 | len = utf8?.len or string?.len or (o) -> #o | ||
| 4535 | |||
| 4536 | if print and x? | ||
| 4537 | print x | ||
| 4538 | |||
| 4539 | with? io.open "test.txt", "w" | ||
| 4540 | \write "hello" | ||
| 4541 | \close! | ||
| 4542 | ``` | ||
| 4543 | |||
| 4544 | </YueDisplay> | ||
| 4545 | |||
| 4546 | ## Pipe | 2311 | ## Pipe |
| 4547 | 2312 | ||
| 4548 | Em vez de uma série de chamadas de função aninhadas, você pode encaminhar valores com o operador **|>**. | 2313 | Em vez de uma série de chamadas de função aninhadas, você pode encaminhar valores com o operador **|>**. |
| @@ -4561,24 +2326,6 @@ readFile "example.txt" | |||
| 4561 | 2326 | ||
| 4562 | ``` | 2327 | ``` |
| 4563 | 2328 | ||
| 4564 | <YueDisplay> | ||
| 4565 | |||
| 4566 | ```yue | ||
| 4567 | "hello" |> print | ||
| 4568 | 1 |> print 2 -- insere o item do pipe como primeiro argumento | ||
| 4569 | 2 |> print 1, _, 3 -- pipe com um placeholder | ||
| 4570 | |||
| 4571 | -- expressão pipe em multilinha | ||
| 4572 | readFile "example.txt" | ||
| 4573 | |> extract language, {} | ||
| 4574 | |> parse language | ||
| 4575 | |> emit | ||
| 4576 | |> render | ||
| 4577 | |||
| 4578 | ``` | ||
| 4579 | |||
| 4580 | </YueDisplay> | ||
| 4581 | |||
| 4582 | ## Coalescência de nil | 2329 | ## Coalescência de nil |
| 4583 | 2330 | ||
| 4584 | O operador de coalescência de nil **??** retorna o valor do operando esquerdo se não for **nil**; caso contrário, avalia o operando direito e retorna seu resultado. O operador **??** não avalia seu operando direito se o operando esquerdo avaliar para não-nil. | 2331 | O operador de coalescência de nil **??** retorna o valor do operando esquerdo se não for **nil**; caso contrário, avalia o operando direito e retorna seu resultado. O operador **??** não avalia seu operando direito se o operando esquerdo avaliar para não-nil. |
| @@ -4591,17 +2338,6 @@ func a ?? {} | |||
| 4591 | a ??= false | 2338 | a ??= false |
| 4592 | ``` | 2339 | ``` |
| 4593 | 2340 | ||
| 4594 | <YueDisplay> | ||
| 4595 | |||
| 4596 | ```yue | ||
| 4597 | local a, b, c, d | ||
| 4598 | a = b ?? c ?? d | ||
| 4599 | func a ?? {} | ||
| 4600 | a ??= false | ||
| 4601 | ``` | ||
| 4602 | |||
| 4603 | </YueDisplay> | ||
| 4604 | |||
| 4605 | ## Objeto implÃcito | 2341 | ## Objeto implÃcito |
| 4606 | 2342 | ||
| 4607 | Você pode escrever uma lista de estruturas implÃcitas que começa com o sÃmbolo **\*** ou **-** dentro de um bloco de tabela. Se você está criando objeto implÃcito, os campos do objeto devem estar com a mesma indentação. | 2343 | Você pode escrever uma lista de estruturas implÃcitas que começa com o sÃmbolo **\*** ou **-** dentro de um bloco de tabela. Se você está criando objeto implÃcito, os campos do objeto devem estar com a mesma indentação. |
| @@ -4649,52 +2385,6 @@ tb = | |||
| 4649 | 2385 | ||
| 4650 | ``` | 2386 | ``` |
| 4651 | 2387 | ||
| 4652 | <YueDisplay> | ||
| 4653 | |||
| 4654 | ```yue | ||
| 4655 | -- atribuição com objeto implÃcito | ||
| 4656 | list = | ||
| 4657 | * 1 | ||
| 4658 | * 2 | ||
| 4659 | * 3 | ||
| 4660 | |||
| 4661 | -- chamada de função com objeto implÃcito | ||
| 4662 | func | ||
| 4663 | * 1 | ||
| 4664 | * 2 | ||
| 4665 | * 3 | ||
| 4666 | |||
| 4667 | -- retorno com objeto implÃcito | ||
| 4668 | f = -> | ||
| 4669 | return | ||
| 4670 | * 1 | ||
| 4671 | * 2 | ||
| 4672 | * 3 | ||
| 4673 | |||
| 4674 | -- tabela com objeto implÃcito | ||
| 4675 | tb = | ||
| 4676 | name: "abc" | ||
| 4677 | |||
| 4678 | values: | ||
| 4679 | - "a" | ||
| 4680 | - "b" | ||
| 4681 | - "c" | ||
| 4682 | |||
| 4683 | objects: | ||
| 4684 | - name: "a" | ||
| 4685 | value: 1 | ||
| 4686 | func: => @value + 1 | ||
| 4687 | tb: | ||
| 4688 | fieldA: 1 | ||
| 4689 | |||
| 4690 | - name: "b" | ||
| 4691 | value: 2 | ||
| 4692 | func: => @value + 2 | ||
| 4693 | tb: { } | ||
| 4694 | ``` | ||
| 4695 | |||
| 4696 | </YueDisplay> | ||
| 4697 | |||
| 4698 | # Literais | 2388 | # Literais |
| 4699 | 2389 | ||
| 4700 | Todos os literais primitivos do Lua podem ser usados. Isso se aplica a números, strings, booleanos e **nil**. | 2390 | Todos os literais primitivos do Lua podem ser usados. Isso se aplica a números, strings, booleanos e **nil**. |
| @@ -4710,19 +2400,6 @@ some_string = "Aqui está uma string | |||
| 4710 | print "Tenho #{math.random! * 100}% de certeza." | 2400 | print "Tenho #{math.random! * 100}% de certeza." |
| 4711 | ``` | 2401 | ``` |
| 4712 | 2402 | ||
| 4713 | <YueDisplay> | ||
| 4714 | |||
| 4715 | ```yue | ||
| 4716 | some_string = "Aqui está uma string | ||
| 4717 | que tem uma quebra de linha." | ||
| 4718 | |||
| 4719 | -- Você pode misturar expressões em literais de string usando a sintaxe #{}. | ||
| 4720 | -- Interpolação de string está disponÃvel apenas em strings com aspas duplas. | ||
| 4721 | print "Tenho #{math.random! * 100}% de certeza." | ||
| 4722 | ``` | ||
| 4723 | |||
| 4724 | </YueDisplay> | ||
| 4725 | |||
| 4726 | ## Literais numéricos | 2403 | ## Literais numéricos |
| 4727 | 2404 | ||
| 4728 | Você pode usar underscores em um literal numérico para aumentar a legibilidade. | 2405 | Você pode usar underscores em um literal numérico para aumentar a legibilidade. |
| @@ -4733,16 +2410,6 @@ hex = 0xEF_BB_BF | |||
| 4733 | binary = 0B10011 | 2410 | binary = 0B10011 |
| 4734 | ``` | 2411 | ``` |
| 4735 | 2412 | ||
| 4736 | <YueDisplay> | ||
| 4737 | |||
| 4738 | ```yue | ||
| 4739 | integer = 1_000_000 | ||
| 4740 | hex = 0xEF_BB_BF | ||
| 4741 | binary = 0B10011 | ||
| 4742 | ``` | ||
| 4743 | |||
| 4744 | </YueDisplay> | ||
| 4745 | |||
| 4746 | ## String multilinha estilo YAML | 2413 | ## String multilinha estilo YAML |
| 4747 | 2414 | ||
| 4748 | O prefixo `|` introduz um literal de string multilinha no estilo YAML: | 2415 | O prefixo `|` introduz um literal de string multilinha no estilo YAML: |
| @@ -4755,18 +2422,6 @@ str = | | |||
| 4755 | - #{expr} | 2422 | - #{expr} |
| 4756 | ``` | 2423 | ``` |
| 4757 | 2424 | ||
| 4758 | <YueDisplay> | ||
| 4759 | |||
| 4760 | ```yue | ||
| 4761 | str = | | ||
| 4762 | key: value | ||
| 4763 | list: | ||
| 4764 | - item1 | ||
| 4765 | - #{expr} | ||
| 4766 | ``` | ||
| 4767 | |||
| 4768 | </YueDisplay> | ||
| 4769 | |||
| 4770 | Isso permite escrever texto estruturado multilinha convenientemente. Todas as quebras de linha e indentação são preservadas em relação à primeira linha não vazia, e expressões dentro de `#{...}` são interpoladas automaticamente como `tostring(expr)`. | 2425 | Isso permite escrever texto estruturado multilinha convenientemente. Todas as quebras de linha e indentação são preservadas em relação à primeira linha não vazia, e expressões dentro de `#{...}` são interpoladas automaticamente como `tostring(expr)`. |
| 4771 | 2426 | ||
| 4772 | A string multilinha YAML detecta automaticamente o prefixo comum de espaço em branco à esquerda (indentação mÃnima em todas as linhas não vazias) e remove-o de todas as linhas. Isso facilita a indentação visual do seu código sem afetar o conteúdo da string resultante. | 2427 | A string multilinha YAML detecta automaticamente o prefixo comum de espaço em branco à esquerda (indentação mÃnima em todas as linhas não vazias) e remove-o de todas as linhas. Isso facilita a indentação visual do seu código sem afetar o conteúdo da string resultante. |
| @@ -4779,18 +2434,6 @@ fn = -> | |||
| 4779 | return str | 2434 | return str |
| 4780 | ``` | 2435 | ``` |
| 4781 | 2436 | ||
| 4782 | <YueDisplay> | ||
| 4783 | |||
| 4784 | ```yue | ||
| 4785 | fn = -> | ||
| 4786 | str = | | ||
| 4787 | foo: | ||
| 4788 | bar: baz | ||
| 4789 | return str | ||
| 4790 | ``` | ||
| 4791 | |||
| 4792 | </YueDisplay> | ||
| 4793 | |||
| 4794 | A indentação interna é preservada em relação ao prefixo comum removido, permitindo estruturas aninhadas limpas. | 2437 | A indentação interna é preservada em relação ao prefixo comum removido, permitindo estruturas aninhadas limpas. |
| 4795 | 2438 | ||
| 4796 | Todos os caracteres especiais como aspas (`"`) e barras invertidas (`\`) no bloco YAML Multiline são escapados automaticamente para que a string Lua gerada seja sintaticamente válida e se comporte como esperado. | 2439 | Todos os caracteres especiais como aspas (`"`) e barras invertidas (`\`) no bloco YAML Multiline são escapados automaticamente para que a string Lua gerada seja sintaticamente válida e se comporte como esperado. |
| @@ -4801,16 +2444,6 @@ str = | | |||
| 4801 | note: 'Ele disse: "#{Hello}!"' | 2444 | note: 'Ele disse: "#{Hello}!"' |
| 4802 | ``` | 2445 | ``` |
| 4803 | 2446 | ||
| 4804 | <YueDisplay> | ||
| 4805 | |||
| 4806 | ```yue | ||
| 4807 | str = | | ||
| 4808 | path: "C:\Program Files\App" | ||
| 4809 | note: 'Ele disse: "#{Hello}!"' | ||
| 4810 | ``` | ||
| 4811 | |||
| 4812 | </YueDisplay> | ||
| 4813 | |||
| 4814 | # Módulo | 2447 | # Módulo |
| 4815 | 2448 | ||
| 4816 | ## Import | 2449 | ## Import |
| @@ -4842,35 +2475,6 @@ do | |||
| 4842 | import "export" as {one, two, Something:{umm:{ch}}} | 2475 | import "export" as {one, two, Something:{umm:{ch}}} |
| 4843 | ``` | 2476 | ``` |
| 4844 | 2477 | ||
| 4845 | <YueDisplay> | ||
| 4846 | |||
| 4847 | ```yue | ||
| 4848 | -- usado como desestruturação de tabela | ||
| 4849 | do | ||
| 4850 | import insert, concat from table | ||
| 4851 | -- reporta erro ao atribuir a insert, concat | ||
| 4852 | import C, Ct, Cmt from require "lpeg" | ||
| 4853 | -- atalho para require implÃcito | ||
| 4854 | import x, y, z from 'mymodule' | ||
| 4855 | -- import com estilo Python | ||
| 4856 | from 'module' import a, b, c | ||
| 4857 | |||
| 4858 | -- atalho para requerer um módulo | ||
| 4859 | do | ||
| 4860 | import 'module' | ||
| 4861 | import 'module_x' | ||
| 4862 | import "d-a-s-h-e-s" | ||
| 4863 | import "module.part" | ||
| 4864 | |||
| 4865 | -- requerer módulo com aliasing ou desestruturação de tabela | ||
| 4866 | do | ||
| 4867 | import "player" as PlayerModule | ||
| 4868 | import "lpeg" as :C, :Ct, :Cmt | ||
| 4869 | import "export" as {one, two, Something:{umm:{ch}}} | ||
| 4870 | ``` | ||
| 4871 | |||
| 4872 | </YueDisplay> | ||
| 4873 | |||
| 4874 | ## Import Global | 2478 | ## Import Global |
| 4875 | 2479 | ||
| 4876 | Você pode importar globais especÃficos para variáveis locais com `import`. Ao importar uma cadeia de acessos a variáveis globais, o último campo será atribuÃdo à variável local. | 2480 | Você pode importar globais especÃficos para variáveis locais com `import`. Ao importar uma cadeia de acessos a variáveis globais, o último campo será atribuÃdo à variável local. |
| @@ -4882,17 +2486,6 @@ do | |||
| 4882 | print concat ["a", tostring 1] | 2486 | print concat ["a", tostring 1] |
| 4883 | ``` | 2487 | ``` |
| 4884 | 2488 | ||
| 4885 | <YueDisplay> | ||
| 4886 | |||
| 4887 | ```yue | ||
| 4888 | do | ||
| 4889 | import tostring | ||
| 4890 | import table.concat | ||
| 4891 | print concat ["a", tostring 1] | ||
| 4892 | ``` | ||
| 4893 | |||
| 4894 | </YueDisplay> | ||
| 4895 | |||
| 4896 | ### Importação automática de variável global | 2489 | ### Importação automática de variável global |
| 4897 | 2490 | ||
| 4898 | Você pode colocar `import global` no topo de um bloco para importar automaticamente todos os nomes que não foram explicitamente declarados ou atribuÃdos no escopo atual como globais. Essas importações implÃcitas são tratadas como consts locais que referenciam os globais correspondentes na posição da instrução. | 2491 | Você pode colocar `import global` no topo de um bloco para importar automaticamente todos os nomes que não foram explicitamente declarados ou atribuÃdos no escopo atual como globais. Essas importações implÃcitas são tratadas como consts locais que referenciam os globais correspondentes na posição da instrução. |
| @@ -4914,25 +2507,6 @@ do | |||
| 4914 | FLAG = 123 | 2507 | FLAG = 123 |
| 4915 | ``` | 2508 | ``` |
| 4916 | 2509 | ||
| 4917 | <YueDisplay> | ||
| 4918 | |||
| 4919 | ```yue | ||
| 4920 | do | ||
| 4921 | import global | ||
| 4922 | print "hello" | ||
| 4923 | math.random 3 | ||
| 4924 | -- print = nil -- erro: globais importados são const | ||
| 4925 | |||
| 4926 | do | ||
| 4927 | -- variável global explÃcita não será importada | ||
| 4928 | import global | ||
| 4929 | global FLAG | ||
| 4930 | print FLAG | ||
| 4931 | FLAG = 123 | ||
| 4932 | ``` | ||
| 4933 | |||
| 4934 | </YueDisplay> | ||
| 4935 | |||
| 4936 | ## Export | 2510 | ## Export |
| 4937 | 2511 | ||
| 4938 | A instrução export oferece uma forma concisa de definir módulos. | 2512 | A instrução export oferece uma forma concisa de definir módulos. |
| @@ -4957,26 +2531,6 @@ export class Something | |||
| 4957 | umm: "cool" | 2531 | umm: "cool" |
| 4958 | ``` | 2532 | ``` |
| 4959 | 2533 | ||
| 4960 | <YueDisplay> | ||
| 4961 | |||
| 4962 | ```yue | ||
| 4963 | export a, b, c = 1, 2, 3 | ||
| 4964 | export cool = "cat" | ||
| 4965 | |||
| 4966 | export What = if this | ||
| 4967 | "abc" | ||
| 4968 | else | ||
| 4969 | "def" | ||
| 4970 | |||
| 4971 | export y = -> | ||
| 4972 | hallo = 3434 | ||
| 4973 | |||
| 4974 | export class Something | ||
| 4975 | umm: "cool" | ||
| 4976 | ``` | ||
| 4977 | |||
| 4978 | </YueDisplay> | ||
| 4979 | |||
| 4980 | Fazendo export nomeado com desestruturação. | 2534 | Fazendo export nomeado com desestruturação. |
| 4981 | 2535 | ||
| 4982 | ```yuescript | 2536 | ```yuescript |
| @@ -4984,15 +2538,6 @@ export :loadstring, to_lua: tolua = yue | |||
| 4984 | export {itemA: {:fieldA = 'default'}} = tb | 2538 | export {itemA: {:fieldA = 'default'}} = tb |
| 4985 | ``` | 2539 | ``` |
| 4986 | 2540 | ||
| 4987 | <YueDisplay> | ||
| 4988 | |||
| 4989 | ```yue | ||
| 4990 | export :loadstring, to_lua: tolua = yue | ||
| 4991 | export {itemA: {:fieldA = 'default'}} = tb | ||
| 4992 | ``` | ||
| 4993 | |||
| 4994 | </YueDisplay> | ||
| 4995 | |||
| 4996 | Exportar itens nomeados do módulo sem criar variáveis locais. | 2541 | Exportar itens nomeados do módulo sem criar variáveis locais. |
| 4997 | 2542 | ||
| 4998 | ```yuescript | 2543 | ```yuescript |
| @@ -5001,16 +2546,6 @@ export.<index> = items | |||
| 5001 | export["a-b-c"] = 123 | 2546 | export["a-b-c"] = 123 |
| 5002 | ``` | 2547 | ``` |
| 5003 | 2548 | ||
| 5004 | <YueDisplay> | ||
| 5005 | |||
| 5006 | ```yue | ||
| 5007 | export.itemA = tb | ||
| 5008 | export.<index> = items | ||
| 5009 | export["a-b-c"] = 123 | ||
| 5010 | ``` | ||
| 5011 | |||
| 5012 | </YueDisplay> | ||
| 5013 | |||
| 5014 | ### Export sem nome | 2549 | ### Export sem nome |
| 5015 | 2550 | ||
| 5016 | Export sem nome adicionará o item alvo na parte array da tabela exportada. | 2551 | Export sem nome adicionará o item alvo na parte array da tabela exportada. |
| @@ -5028,23 +2563,6 @@ export with tmp | |||
| 5028 | j = 2000 | 2563 | j = 2000 |
| 5029 | ``` | 2564 | ``` |
| 5030 | 2565 | ||
| 5031 | <YueDisplay> | ||
| 5032 | |||
| 5033 | ```yue | ||
| 5034 | d, e, f = 3, 2, 1 | ||
| 5035 | export d, e, f | ||
| 5036 | |||
| 5037 | export if this | ||
| 5038 | 123 | ||
| 5039 | else | ||
| 5040 | 456 | ||
| 5041 | |||
| 5042 | export with tmp | ||
| 5043 | j = 2000 | ||
| 5044 | ``` | ||
| 5045 | |||
| 5046 | </YueDisplay> | ||
| 5047 | |||
| 5048 | ### Export padrão | 2566 | ### Export padrão |
| 5049 | 2567 | ||
| 5050 | Usar a palavra-chave **default** na instrução export para substituir a tabela exportada por qualquer coisa. | 2568 | Usar a palavra-chave **default** na instrução export para substituir a tabela exportada por qualquer coisa. |
| @@ -5055,16 +2573,6 @@ export default -> | |||
| 5055 | 123 | 2573 | 123 |
| 5056 | ``` | 2574 | ``` |
| 5057 | 2575 | ||
| 5058 | <YueDisplay> | ||
| 5059 | |||
| 5060 | ```yue | ||
| 5061 | export default -> | ||
| 5062 | print "hello" | ||
| 5063 | 123 | ||
| 5064 | ``` | ||
| 5065 | |||
| 5066 | </YueDisplay> | ||
| 5067 | |||
| 5068 | # Licença: MIT | 2576 | # Licença: MIT |
| 5069 | 2577 | ||
| 5070 | Copyright (c) 2017-2026 Li Jin \<dragon-fly@qq.com\> | 2578 | Copyright (c) 2017-2026 Li Jin \<dragon-fly@qq.com\> |
