|
|
Regras de abrangência
function1() :=
block ( [var],
var: 1,
function2(),
var);
function2() :=
block( [],
var: var + 1,
nil);
para fazer a mesma coisa no Lisp moderno, temos que usar a então chamada proclamação:
(declaim special var)
(defun f1
()
(prog (var)
(setq var 1)
(f2)
(return var)
) )
(defun f2
()
(setq var (+ 1 var))
)
Regras de abrangência era uma coisa simples nos tempos passados do Lisp: Lisp foi dinamicamente enchido por regras de abrangência. Lamentavelmente, regras de abrangência fosse mais tarde complicada como uma conseqüêcia de discurssões como elas podem ajudar somente entre cientista ou entre os menbros de um comitê de padronização. Como uma conseqüência de padronização, Lisp foi modificado para abrangê léxica com abrangência dinâmica opcional para variáveis proclamadas.
Maxima foi escrito quando LIsp era uma linguagem de abangência dinâmica. Largas partes do Maxima ainda requerem a disponibilidade de regras de abrangência dinâmicas. As mudanças que foram introduzidas em sistemas Lisp comercialmente disponíveis certamente não facilitam a manutensão do Macsyma (e Maxima) e existem razões para assumir que a completa ideologia conduz discurssões sobre as regras corretas de abrangência para o Lisp encoraja os criadores do Maple e do Mathematica a escolher C como a linguagem de implementação de seus programas. (C era também mais barato de obter que um dos grandes Lisps nos anos oitenta do século vinte.)
A situação com Maxima é difícil: um rápido exame do integrador simbólico (no arquivo sinint.lisp) mostra que as rotinas de integração para funções racionais ainda usam regras de abrangência dinâmica. O arquivo sinint.lisp contém essa declaração para reforçar associação dinâmica para as variáveis selecionadas:
(declare-top (SPECIAL RISCHPF GENVAR $SAVEFACTORS CHECKFACTORS
EXP VAR $FACTORFLAG $RATFAC $LOGABS $EXPOP $EXPON
$KEEPFLOAT RATFORM ROOTFACTOR PARDENOM $ALGEBRAIC
WHOLEPART PARNUMER VARLIST LOGPTDX SWITCH1))
SPECIAL é a 'palavra mágica' que precisamos para manter aquele velho código executando em um ambiente CommonLisp.
|
|