Processamento Simbólico
O procedimento eval
(complementado por apply
) é a principal ferramenta para abstração metalinguística em Scheme.
Para utilizá-lo, basta fornecer uma expressão simbólica válida e um objeto representando o ambiente computacional onde ela será avaliada; o retorno de eval
será o valor resultante da interpretação daquela expressão.
(define env (scheme-report-environment 5))
'(+ 1 1) ; => (+ 1 1)
(list '+ 1 1) ; => (+ 1 1)
(+ 1 1) ; => 2
(eval '(+ 1 1) env) ; => 2
(define x 7)
(define y 5)
'(- x y) ; => (- x y)
(list '- x y) ; => (- 7 5)
(- x y) ; => 2
`(- ,x ,y) ; => (- 7 5)
(eval `(- ,x ,y) env) ; => 2
(eval '(- x y) env) ; => Unbound variable: x
Com base nos exemplos anteriores, explique como funcionam as citações parciais com os símbolos
`
e,
O método de Horner costuma ser utilizado para calcular o valor de um polinômio de forma a evitar exponenciações; efetua apenas n adições e n multiplicações para um polinômio de grau n.
\[ Pn(x) = a_0 + a_1 x + a_2 x^2 + ... + a_n x^n \] \[ Pn(x) = a_0 + x (a_1 + x (a_2 + x(...a_n...))) \]
Vamos aplicar o método de uma maneira um tanto não-convencional, em um algoritmo que "compila" uma lista de coeficientes e gera um procedimento que calcula o polinômio equivalente na forma de Horner:
(define (horner x pn)
(if (null? (cdr pn))
(car pn)
`(+ ,(car pn) (* ,x ,(horner x (cdr pn))))))
(define (make-polynomial x first-coef . rest-coefs)
(let ((polynomial (horner x (cons first-coef rest-coefs))))
(eval
(list 'lambda (list x) polynomial)
(interaction-environment))))