2015-01-08 17:28:11 +03:00
|
|
|
---
|
2024-10-21 00:46:35 +03:00
|
|
|
language: Hy
|
2017-08-25 11:13:28 +03:00
|
|
|
filename: learnhy-pt.hy
|
2015-01-08 17:28:11 +03:00
|
|
|
contributors:
|
|
|
|
- ["Abhishek L", "http://twitter.com/abhishekl"]
|
|
|
|
translators:
|
|
|
|
- ["Miguel Araújo", "https://github.com/miguelarauj1o"]
|
|
|
|
lang: pt-br
|
|
|
|
---
|
|
|
|
|
|
|
|
Hy é um dialeto de Lisp escrito sobre Python. Isto é possível convertendo
|
2024-04-25 21:27:55 +03:00
|
|
|
código Hy em árvore sintática abstrata Python (ast). Portanto, isto permite
|
|
|
|
Hy chamar código Python nativo e vice-versa.
|
2015-01-08 17:28:11 +03:00
|
|
|
|
2024-04-25 21:27:55 +03:00
|
|
|
```hylang
|
|
|
|
;; Isso dá uma introdução básica em Hy, como uma preliminar para o link abaixo
|
|
|
|
;; https://hylang.org/try-hy
|
2015-01-08 17:28:11 +03:00
|
|
|
;;
|
2024-04-25 21:27:55 +03:00
|
|
|
; Comentários em ponto-e-vírgula, como em outros Lisps
|
2015-01-08 17:28:11 +03:00
|
|
|
|
|
|
|
;; s-noções básicas de expressão
|
|
|
|
; programas Lisp são feitos de expressões simbólicas ou sexps que se assemelham
|
|
|
|
(some-function args)
|
|
|
|
; agora o essencial "Olá mundo"
|
|
|
|
(print "hello world")
|
|
|
|
|
|
|
|
;; Tipos de dados simples
|
2024-04-25 21:27:55 +03:00
|
|
|
; Todos os tipos de dados simples são exatamente semelhantes aos seus homólogos
|
|
|
|
; em Python que
|
2015-01-08 17:28:11 +03:00
|
|
|
42 ; => 42
|
|
|
|
3.14 ; => 3.14
|
|
|
|
True ; => True
|
|
|
|
4+10j ; => (4+10j) um número complexo
|
|
|
|
|
|
|
|
; Vamos começar com um pouco de aritmética muito simples
|
|
|
|
(+ 4 1) ;=> 5
|
2024-04-25 21:27:55 +03:00
|
|
|
; o operador é aplicado a todos os argumentos, como outros Lisps
|
2015-01-08 17:28:11 +03:00
|
|
|
(+ 4 1 2 3) ;=> 10
|
|
|
|
(- 2 1) ;=> 1
|
|
|
|
(* 4 2) ;=> 8
|
|
|
|
(/ 4 1) ;=> 4
|
|
|
|
(% 4 2) ;=> 0 o operador módulo
|
2024-04-25 21:27:55 +03:00
|
|
|
; exponenciação é representado pelo operador ** como Python
|
2015-01-08 17:28:11 +03:00
|
|
|
(** 3 2) ;=> 9
|
|
|
|
; formas aninhadas vão fazer a coisa esperada
|
|
|
|
(+ 2 (* 4 2)) ;=> 10
|
|
|
|
; também operadores lógicos e ou não e igual etc. faz como esperado
|
|
|
|
(= 5 4) ;=> False
|
|
|
|
(not (= 5 4)) ;=> True
|
|
|
|
|
|
|
|
;; variáveis
|
|
|
|
; variáveis são definidas usando SETV, nomes de variáveis podem usar utf-8, exceto
|
|
|
|
; for ()[]{}",'`;#|
|
|
|
|
(setv a 42)
|
|
|
|
(setv π 3.14159)
|
|
|
|
(def *foo* 42)
|
|
|
|
;; outros tipos de dados de armazenamento
|
|
|
|
; strings, lists, tuples & dicts
|
2024-04-25 21:27:55 +03:00
|
|
|
; estes são exatamente os mesmos tipos de armazenamento de Python
|
2015-01-08 17:28:11 +03:00
|
|
|
"hello world" ;=> "hello world"
|
2024-04-25 21:27:55 +03:00
|
|
|
; operações de string funcionam semelhante em Python
|
2015-01-08 17:28:11 +03:00
|
|
|
(+ "hello " "world") ;=> "hello world"
|
|
|
|
; Listas são criadas usando [], a indexação começa em 0
|
|
|
|
(setv mylist [1 2 3 4])
|
|
|
|
; tuplas são estruturas de dados imutáveis
|
|
|
|
(setv mytuple (, 1 2))
|
|
|
|
; dicionários são pares de valores-chave
|
|
|
|
(setv dict1 {"key1" 42 "key2" 21})
|
2024-04-25 21:27:55 +03:00
|
|
|
; :nome pode ser utilizado para definir palavras-chave em Hy que podem ser utilizados para as chaves
|
2015-01-08 17:28:11 +03:00
|
|
|
(setv dict2 {:key1 41 :key2 20})
|
|
|
|
; usar 'get' para obter o elemento em um índice/key
|
|
|
|
(get mylist 1) ;=> 2
|
|
|
|
(get dict1 "key1") ;=> 42
|
|
|
|
; Alternativamente, se foram utilizadas palavras-chave que podem ser chamadas diretamente
|
|
|
|
(:key1 dict2) ;=> 41
|
|
|
|
|
|
|
|
;; funções e outras estruturas de programa
|
|
|
|
; funções são definidas usando defn, o último sexp é devolvido por padrão
|
|
|
|
(defn greet [name]
|
|
|
|
"A simple greeting" ; uma docstring opcional
|
|
|
|
(print "hello " name))
|
|
|
|
|
|
|
|
(greet "bilbo") ;=> "hello bilbo"
|
|
|
|
|
|
|
|
; funções podem ter argumentos opcionais, bem como argumentos-chave
|
|
|
|
(defn foolists [arg1 &optional [arg2 2]]
|
|
|
|
[arg1 arg2])
|
|
|
|
|
|
|
|
(foolists 3) ;=> [3 2]
|
|
|
|
(foolists 10 3) ;=> [10 3]
|
|
|
|
|
|
|
|
; funções anônimas são criados usando construtores 'fn' ou 'lambda'
|
|
|
|
; que são semelhantes para 'defn'
|
|
|
|
(map (fn [x] (* x x)) [1 2 3 4]) ;=> [1 4 9 16]
|
|
|
|
|
|
|
|
;; operações de sequência
|
2024-04-25 21:27:55 +03:00
|
|
|
; Hy tem algumas utils embutidas para operações de sequência, etc.
|
2015-01-08 17:28:11 +03:00
|
|
|
; recuperar o primeiro elemento usando 'first' ou 'car'
|
|
|
|
(setv mylist [1 2 3 4])
|
|
|
|
(setv mydict {"a" 1 "b" 2})
|
|
|
|
(first mylist) ;=> 1
|
|
|
|
|
2024-04-25 21:27:55 +03:00
|
|
|
; corte listas usando 'cut'
|
|
|
|
(cut mylist 1 3) ;=> [2 3]
|
2015-01-08 17:28:11 +03:00
|
|
|
|
|
|
|
; obter elementos de uma lista ou dict usando 'get'
|
|
|
|
(get mylist 1) ;=> 2
|
|
|
|
(get mydict "b") ;=> 2
|
2024-04-25 21:27:55 +03:00
|
|
|
; lista de indexação começa a partir de 0, igual em Python
|
2015-01-08 17:28:11 +03:00
|
|
|
; assoc pode definir elementos em chaves/índices
|
|
|
|
(assoc mylist 2 10) ; faz mylist [1 2 10 4]
|
|
|
|
(assoc mydict "c" 3) ; faz mydict {"a" 1 "b" 2 "c" 3}
|
2024-04-25 21:27:55 +03:00
|
|
|
; há toda uma série de outras funções essenciais que torna o trabalho com
|
2015-01-08 17:28:11 +03:00
|
|
|
; sequências uma diversão
|
|
|
|
|
|
|
|
;; Python interop
|
2024-04-25 21:27:55 +03:00
|
|
|
;; importação funciona exatamente como em Python
|
2015-01-08 17:28:11 +03:00
|
|
|
(import datetime)
|
2024-04-25 21:27:55 +03:00
|
|
|
(import functools [partial reduce]) ; importa fun1 e fun2 do module1
|
|
|
|
(import matplotlib.pyplot :as plt) ; fazendo uma importação em foo como em bar
|
|
|
|
; todos os métodos de Python embutidas etc. são acessíveis a partir Hy
|
2015-01-08 17:28:11 +03:00
|
|
|
; a.foo(arg) is called as (.foo a arg)
|
|
|
|
(.split (.strip "hello world ")) ;=> ["hello" "world"]
|
|
|
|
|
|
|
|
;; Condicionais
|
|
|
|
; (if condition (body-if-true) (body-if-false)
|
|
|
|
(if (= passcode "moria")
|
|
|
|
(print "welcome")
|
|
|
|
(print "Speak friend, and Enter!"))
|
|
|
|
|
|
|
|
; aninhe múltiplas cláusulas 'if else if' com cond
|
|
|
|
(cond
|
2024-04-25 21:27:55 +03:00
|
|
|
(= someval 42) (print "Life, universe and everything else!")
|
|
|
|
(> someval 42) (print "val too large")
|
|
|
|
(< someval 42) (print "val too small"))
|
2015-01-08 17:28:11 +03:00
|
|
|
|
|
|
|
; declarações de grupo com 'do', essas são executadas sequencialmente
|
|
|
|
; formas como defn tem um 'do' implícito
|
|
|
|
(do
|
|
|
|
(setv someval 10)
|
|
|
|
(print "someval is set to " someval)) ;=> 10
|
|
|
|
|
|
|
|
; criar ligações lexicais com 'let', todas as variáveis definidas desta forma
|
|
|
|
; tem escopo local
|
|
|
|
(let [[nemesis {"superman" "lex luther"
|
|
|
|
"sherlock" "moriarty"
|
|
|
|
"seinfeld" "newman"}]]
|
|
|
|
(for [(, h v) (.items nemesis)]
|
2024-04-25 21:27:55 +03:00
|
|
|
(print (.format "{0}'s nemesis was {1}" h v))))
|
2015-01-08 17:28:11 +03:00
|
|
|
|
|
|
|
;; classes
|
|
|
|
; classes são definidas da seguinte maneira
|
|
|
|
(defclass Wizard [object]
|
2024-04-25 21:27:55 +03:00
|
|
|
(defn __init__ [self spell]
|
|
|
|
(setv self.spell spell)) ; init a mágica attr
|
2015-01-08 17:28:11 +03:00
|
|
|
|
2024-04-25 21:27:55 +03:00
|
|
|
(defn get-spell [self]
|
|
|
|
self.spell))
|
2015-01-08 17:28:11 +03:00
|
|
|
```
|
|
|
|
|
|
|
|
### Outras Leituras
|
|
|
|
|
2024-04-25 21:27:55 +03:00
|
|
|
Este tutorial é apenas uma introdução básica para Hy/Lisp/Python.
|
2015-01-08 17:28:11 +03:00
|
|
|
|
2024-04-25 21:27:55 +03:00
|
|
|
Docs Hy: [https://hylang.org/hy/doc](https://hylang.org/hy/doc)
|
2015-01-08 17:28:11 +03:00
|
|
|
|
2024-04-25 21:27:55 +03:00
|
|
|
Repo Hy no GitHub: [https://github.com/hylang/hy](https://github.com/hylang/hy)
|
2015-01-08 17:28:11 +03:00
|
|
|
|
|
|
|
Acesso ao freenode irc com #hy, hashtag no twitter: #hylang
|