"It's 2002, and programming languages
have almost caught up with 1958"
Paul Graham - Revenge of the Nerds
Ronie Uliana
Alan Turing
Alonzo Church
Máquina de Turing
Lambda Calculus
<=equivalentes=>
Menos "charmoso", mais simples
Só "variáveis" e funções
(λa.a) x = x
(λab.ba) xz = zx
(λab.b) x = (λb.b)
(λab.ba) (yz) = (λb.b(yz))
x = x
x (λa.b) z = xb
(λ abc.b( abc)) (λab.b)
(λbc.b((λ ab. b)bc))
(λbc.b(c))
(λ abc.b( abc)) (λbc.b(c))
(λbc.b((λ bc. b( c))bc))
(λbc.b(b(c)))
2 + 3?
(λab.a (a (b ) ) ) (λabc.b(abc)) (λab.a(a(a(b))))
(λb. (λabc.b(abc)) ( (λabc.b(abc)) (b ) ) ) (λab.a(a(a(b))))
(λabc.b(abc)) ( (λabc.b(abc)) ((λab.a(a(a(b)))) ) )
(λabc.b(abc)) ( (λbc.b( (λ ab.a(a(a(b))))bc)) )
(λabc.b(abc)) (λbc.b(b(b(b(c)))))
(λbc.b( (λbc.b(b(b(b(c))))) bc))
(λbc.b(b(b(b(b(c))))))
0 = (λab.b)
1 = (λab.a(b))
2 = (λab.a(a(b)))
3 = (λab.a(a(a(b))))
...
Toda a sintaxe do Lisp
em uma linha:
Sério... essa é toda a sintaxe =/
1 + 2 = (+ 1 2)
1 + 2 + 3 + 4= (+ 1 2 3 4)
1 < 2 = (< 1 2)
x > 1 && x < 3 = (< 1 x 3)
(AST)
Abstract Syntax Tree é com um programa é representado depois do "parsing".
É como o computador sabe o que fazer primeiro.
a + b * 3
(+ a (* b 3))
(raiz nó
(raiz nó nó))
O código é uma lista
Posso manipular listas
Posso manipular o código
#lang racket
(require (for-syntax syntax/parse))
(define-syntax (: stx)
(syntax-parse stx #:datum-literals (+ - * / ^)
[(_ l ... + r ...) #'(+ (: l ...) (: r ...))]
[(_ l ... - r ...) #'(- (: l ...) (: r ...))]
[(_ l ... * r ...) #'(* (: l ...) (: r ...))]
[(_ l ... / r ...) #'(/ (: l ...) (: r ...))]
[(_ l ^ r ...) #'(expt l (: r ...))]
[(_ x) #'x]))
(: 1 + 4 ^ 2)
Uma linguagem
para criar linguagens
Um Lisp moderno
(foco em imutabilidade)
Novos dialetos de Lisp nos últimos 10 anos