diff options
| author | Zachary Ferguson <zfergus2@users.noreply.github.com> | 2015-10-15 14:48:59 -0400 | 
|---|---|---|
| committer | Zachary Ferguson <zfergus2@users.noreply.github.com> | 2015-10-15 14:48:59 -0400 | 
| commit | 65bb71f4bde383a4d0b8cd6fd49901bb6e2cfa5f (patch) | |
| tree | 03802f50ac31b295ace0585ccb6bc1ea6ef9b612 /pt-br | |
| parent | a4ea3961744c3c1ee6fcf654f011caa8dbadf56e (diff) | |
| parent | 68953bd9d97328b8660dad06edd8acb8ff330ede (diff) | |
Merge remote-tracking branch 'refs/remotes/adambard/master'
Conflicts:
	c.html.markdown
Diffstat (limited to 'pt-br')
| -rw-r--r-- | pt-br/c-pt.html.markdown | 19 | ||||
| -rw-r--r-- | pt-br/clojure-macros-pt.html.markdown | 154 | 
2 files changed, 165 insertions, 8 deletions
diff --git a/pt-br/c-pt.html.markdown b/pt-br/c-pt.html.markdown index 451df4f3..43688724 100644 --- a/pt-br/c-pt.html.markdown +++ b/pt-br/c-pt.html.markdown @@ -6,6 +6,7 @@ contributors:      - ["Árpád Goretity", "http://twitter.com/H2CO3_iOS"]  translators:      - ["João Farias", "https://github.com/JoaoGFarias"] +    - ["Elton Viana", "https://github.com/eltonvs"]  lang: pt-br  filename: c-pt.el  --- @@ -139,13 +140,13 @@ int main() {      int var_length_array[size]; // declara o VLA      printf("sizeof array = %zu\n", sizeof var_length_array); -	//Uma possível saída para esse programa seria: -    // > Entre o tamanho do array:: 10 +    // Uma possível saída para esse programa seria: +    // > Entre o tamanho do array: 10      // > sizeof array = 40  	// String são apenas arrays de caracteres terminados por um  -	// byte NUL (0x00), representado em string pelo caracter especial '\0'. -	// (Não precisamos incluir o byte NUL em literais de string; o compilador +	// byte nulo (0x00), representado em string pelo caracter especial '\0'. +	// (Não precisamos incluir o byte nulo em literais de string; o compilador  	// o insere ao final do array para nós.)      char uma_string[20] = "Isto é uma string";   	// Observe que 'é' não está na tabela ASCII @@ -153,8 +154,8 @@ int main() {  	// Porém, comentários podem conter acentos       printf("%s\n", uma_string); // %s formata a string -    printf("%d\n", uma_string[16]); // => 0 -    // i.e., byte #17 é 0 (assim como 18, 19, e 20) +    printf("%d\n", uma_string[17]); // => 0 +    // i.e., byte #18 é 0 (assim como o 19°, 20°, 21°...)  	// Se temos caracteres entre aspas simples, temos um caracter literal.  	// Seu tipo é `int`, *não* `char` (por razões históricas). @@ -220,11 +221,11 @@ int main() {      0 || 1; // => 1 (Ou lógico)      0 || 0; // => 0 -    //Expressão condicional ( ? : ) +    //Expressão condicional ternária ( ? : )      int a = 5;      int b = 10;      int z; -    z = (a > b) ? a : b; // => 10 "se a > b retorne a, senão retorne b."  +    z = (a > b) ? a : b; // => 10 "se a > b retorne a, senão retorne b."      //Operadores de incremento e decremento:      char *s = "iLoveC"; @@ -290,6 +291,8 @@ int main() {      for (i = 0; i <= 5; i++) {          ; // Use ponto e vírgula para agir como um corpo (declaração nula)      } +    // Ou +    for (i = 0; i <= 5; i++);  	// Criando branchs com escolhas múltiplas: switch()      switch (alguma_expressao_integral) { diff --git a/pt-br/clojure-macros-pt.html.markdown b/pt-br/clojure-macros-pt.html.markdown new file mode 100644 index 00000000..dbc0c25c --- /dev/null +++ b/pt-br/clojure-macros-pt.html.markdown @@ -0,0 +1,154 @@ +--- +language: clojure +filename: learnclojure-pt.clj +contributors: +    - ["Adam Bard", "http://adambard.com/"] +translators: +    - ["Raphael Bezerra do Nascimento"] +lang: pt-br +--- + +Como todas as Lisps, a inerente [homoiconicity](https://en.wikipedia.org/wiki/Homoiconic) +do Clojure lhe dá acesso a toda a extensão da linguagem  +para escrever rotinas de geração de código chamados "macros". Macros fornecem uma poderosa forma de adequar a linguagem  +às suas necessidades. + +Pórem Tenha cuidado. É considerado má pratica escrever uma macro quando uma função vai fazer. Use uma macro apenas  +quando você precisar do controle sobre quando ou se os argumentos para um formulário será avaliado. + +Você vai querer estar familiarizado com Clojure. Certifique-se de entender tudo em  +[Clojure em Y Minutos](/docs/clojure/). + +```clojure +;; Defina uma macro utilizando defmacro. Sua macro deve ter como saida uma lista que possa +;; ser avaliada como codigo Clojure. +;; +;; Essa macro é a mesma coisa que se você escrever (reverse "Hello World") +(defmacro my-first-macro [] +  (list reverse "Hello World")) + +;; Inspecione o resultado de uma macro utilizando macroexpand or macroexpand-1. +;; +;; Note que a chamada deve utilizar aspas simples. +(macroexpand '(my-first-macro)) +;; -> (#<core$reverse clojure.core$reverse@xxxxxxxx> "Hello World") + +;; Você pode avaliar o resultad de macroexpand diretamente: +(eval (macroexpand '(my-first-macro))) +; -> (\d \l \o \r \W \space \o \l \l \e \H) + +;; mas você deve usar esse mais suscinto, sintax como de função: +(my-first-macro)  ; -> (\d \l \o \r \W \space \o \l \l \e \H) + +;; Você pode tornar as coisas mais faceis pra você, utilizando a sintaxe de citação mais suscinta +;; para criar listas nas suas macros: +(defmacro my-first-quoted-macro [] +  '(reverse "Hello World")) + +(macroexpand '(my-first-quoted-macro)) +;; -> (reverse "Hello World") +;; Note que reverse não é mais uma função objeto, mas um simbolo. + +;; Macros podem ter argumentos. +(defmacro inc2 [arg] +  (list + 2 arg)) + +(inc2 2) ; -> 4 + +;; Mas se você tentar fazer isso com uma lista entre aspas simples, você vai receber um erro, por que o  +;; argumento irá entra aspas simples também. Para contornar isso, Clojure prover uma maneira de utilizar aspas simples  +;; em macros: `. Dentro `, você pode usar ~ para chegar ao escopo externo. +(defmacro inc2-quoted [arg] +  `(+ 2 ~arg)) + +(inc2-quoted 2) + +;; Você pode usar os argumentos de destruturação habituais. Expandir lista de variaveis usando ~@ +(defmacro unless [arg & body] +  `(if (not ~arg) +     (do ~@body))) ; Lembrar o do! + +(macroexpand '(unless true (reverse "Hello World"))) +;; -> +;; (if (clojure.core/not true) (do (reverse "Hello World"))) + +;; (unless) avalia e retorna seu corpo, se o primeiro argumento é falso. +;; caso contrario, retorna nil + +(unless true "Hello") ; -> nil +(unless false "Hello") ; -> "Hello" + +;; Usado sem cuidados, macros podem fazer muito mal por sobreporem suas variaveis +(defmacro define-x [] +  '(do +     (def x 2) +     (list x))) + +(def x 4) +(define-x) ; -> (2) +(list x) ; -> (2) + +;;s Para evitar isso, use gensym para receber um identificador unico +(gensym 'x) ; -> x1281 (ou outra coisa) + +(defmacro define-x-safely [] +  (let [sym (gensym 'x)] +    `(do +       (def ~sym 2) +       (list ~sym)))) + +(def x 4) +(define-x-safely) ; -> (2) +(list x) ; -> (4) + +;; Você pode usar # dentro de ` para produzir uma gensym para cada simbolo automaticamente +(defmacro define-x-hygenically [] +  `(do +     (def x# 2) +     (list x#))) + +(def x 4) +(define-x-hygenically) ; -> (2) +(list x) ; -> (4) + +;; É típico o uso de funções de auxilio com macros. Vamos criar um pouco +;; Vamos criar um pouco para nos ajudar a suportar uma sintaxe aritmética inline (estupida) +(declare inline-2-helper) +(defn clean-arg [arg] +  (if (seq? arg) +    (inline-2-helper arg) +    arg)) + +(defn apply-arg +  "Given args [x (+ y)], return (+ x y)" +  [val [op arg]] +  (list op val (clean-arg arg))) + +(defn inline-2-helper +  [[arg1 & ops-and-args]] +  (let [ops (partition 2 ops-and-args)] +    (reduce apply-arg (clean-arg arg1) ops))) + +;; Podemos testar isso imediatamente, sem criar uma macro +(inline-2-helper '(a + (b - 2) - (c * 5))) ; -> (- (+ a (- b 2)) (* c 5)) + +; Entretanto, temos que tornar isso uma macro caso quisermos que isso seja rodado em tempo de compilação +(defmacro inline-2 [form] +  (inline-2-helper form))) + +(macroexpand '(inline-2 (1 + (3 / 2) - (1 / 2) + 1))) +; -> (+ (- (+ 1 (/ 3 2)) (/ 1 2)) 1) + +(inline-2 (1 + (3 / 2) - (1 / 2) + 1)) +; -> 3 (Na verdade, 3N, desde que o numero ficou convertido em uma fração racional com / + +### Leitura adicional + +Escrevendo Macros de [Clojure para o Brave e True](http://www.braveclojure.com/) +[http://www.braveclojure.com/writing-macros/](http://www.braveclojure.com/writing-macros/) + +Documentos oficiais  +[http://clojure.org/macros](http://clojure.org/macros) + +Quando utilizar macros?  +[http://dunsmor.com/lisp/onlisp/onlisp_12.html](http://dunsmor.com/lisp/onlisp/onlisp_12.html)  | 
