Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Entenda LISP em 15 minutos

Entenda LISP em 15 minutos

Apresentação feita no 23º GURU-SP, em 18/05/2012 no auditório da Editora Abril

Plínio Balduino

May 21, 2012
Tweet

More Decks by Plínio Balduino

Other Decks in Programming

Transcript

  1. Um pouco de história Criada em 1958 por John McCarthy

    Implementada pela primeira vez por Steve Russell, como LISP 1
  2. Definição LISP significa LISt Processing A estrutura básica do LISP

    são listas ligadas, limitadas por parênteses (S-Expression) O código é composto de, basicamente, uma lista de listas Agora você entende o porquê daquele monte de parenteses ( o p e r a d o r v a l o r v a l o r v a l o r . . . v a l o r ) ( o p e r a d o r v a l o r ( o p e r a d o r v a l o r v a l o r . . . v a l o r ) )
  3. Definição Atualmente LISP se refere a toda uma família de

    linguagens: AutoLISP Arc EmacsLISP Lucio Common Lisp Scheme Clojure Racket Chicken
  4. Essa tal notação prefixa # R u b y 1

    + 2 + 3 + 4 + 5 + 6 1 + ( 2 * 3 ) + ( 4 * 5 ) [ 1 , 2 , 3 , 4 , 5 , 6 ] . r e d u c e ( : + ) ; L I S P ( + 1 2 3 4 5 6 ) ( + 1 ( * 2 3 ) ( * 4 5 ) ) ; m a i s l e g í v e l ( + 1 ( * 2 3 ) ( * 4 5 ) )
  5. Ainda estão bocejando LISP trabalha diretamente na árvore sintática (notação

    prefixa) Não existe o conceito de precedência de operadores
  6. Código e dados recebem o mesmo tratamento ; C l

    o j u r e ( d e f n s o m a [ x y ] ( + x y ) ) ( d e f n m e d i a [ x y ] ( / ( + x y ) 2 ) ) ( d e f n c a l c u l a r [ o p e r a d o r v a l o r 1 v a l o r 2 ] ( o p e r a d o r v a l o r 1 v a l o r 2 ) ) ( c a l c u l a r s o m a 3 5 ) ; r e s u l t a d o : 8 ( c a l c u l a r m e d i a 3 5 ) ; r e s u l t a d o : 4
  7. / / J a v a S c r i

    p t f u n c t i o n s o m a ( x , y ) { r e t u r n x + y ; } f u n c t i o n m e d i a ( x , y ) { r e t u r n ( x + y ) / 2 ; } f u n c t i o n c a l c u l a r ( o p e r a d o r , v a l o r 1 , v a l o r 2 ) { r e t u r n o p e r a d o r ( v a l o r 1 , v a l o r 2 ) ; } c a l c u l a r ( s o m a , 3 , 5 ) / / r e s u l t a d o : 8 c a l c u l a r ( m e d i a , 3 , 5 ) / / r e s u l t a d o : 4
  8. Macros ; C l o j u r e (

    d e f n u n l e s s [ c o n d i t i o n f a l s y t r u e y ] ( i f c o n d i t i o n f a l s y t r u e y ) ) ( u n l e s s a u t h o r i z e d ( s h o w - a l e r t " A c e s s o n e g a d o " ) ( d r o p - d a t a b a s e ) ) Não rolou. O que aconteceu?
  9. Macros ; C l o j u r e (

    d e f m a c r o u n l e s s [ c o n d i t i o n t r u e y f a l s y ] ` ( i f ~ c o n d i t i o n ~ f a l s y ~ t r u e y ) ) ( u n l e s s a u t h o r i z e d ( s h o w - a l e r t " A c e s s o n e g a d o " ) ( d r o p - d a t a b a s e ) ) ( m a c r o e x p a n d ' ( u n l e s s f a l s e " E h t r u e " " E h f a l s e " ) ) ; ( i f f a l s e " E h f a l s e " " E h t r u e " ) Código é passado como parâmetro e avaliado condicionalmente
  10. Macros Seu código é avaliado (compilado) em tempo de execução

    Na prática, você interfere no compilador em tempo de execução Let Over Lambda trata apenas disso. É um livrinho com menos de 400 páginas
  11. Macros permitem que você crie sua própria DSL https://github.com/pbalduino/north (

    d e s c r i b e " N o r t h " ( c o n t e x t " u s i n g c o n t e x t " ( i t " s h o u l d t e s t s i m p l e a s s e r t i o n s " ( s h o u l d ( = 1 1 ) b e - t r u e ) ( s h o u l d ( = 1 1 ) b e - t r u e ) ( s h o u l d ( = 1 0 ) b e - f a l s e ) ( s h o u l d ( + 1 1 ) b e - e q u a l s 2 ) ( s h o u l d ( + 1 1 ) b e - n o t - e q u a l s 1 ) ) ) )
  12. E no final você vai aprender a Dividir seu código

    em blocos pequenos e reutilizáveis Reduzir as partes móveis e evitar estados globais Entender melhor como funciona um compilador/interpretador E de repente vai ter vontade de criar sua própria linguagem