Sto implementando una versione rudimentale di LISP in Ruby solo per familiarizzare con alcuni concetti. Sto basando la mia implementazione su Lispy di Peter Norvig (http://norvig.com/lispy.html).Aiutami a scrivere il mio LISP :) Ambienti LISP, Ruby Hashes
C'è qualcosa che mi manca qui, però, e mi farebbe piacere un po 'di aiuto ...
Egli sottoclassi dict di Python come segue:
class Env(dict):
"An environment: a dict of {'var':val} pairs, with an outer Env."
def __init__(self, parms=(), args=(), outer=None):
self.update(zip(parms,args))
self.outer = outer
def find(self, var):
"Find the innermost Env where var appears."
return self if var in self else self.outer.find(var)
Si passa poi a spiegare perché lo fa questo piuttosto che usare semplicemente un ditt. Tuttavia, per qualche ragione, la sua spiegazione continua a passare attraverso i miei occhi e fuori attraverso la parte posteriore della mia testa.
Perché non utilizzare un dict e quindi all'interno della funzione eval, quando è necessario creare un nuovo "sub-environment", basta prendere il dict esistente e aggiornare le coppie chiave/valore che devono essere aggiornate e passare quel nuovo dettato alla prossima eval?
L'interprete Python non tiene traccia dei precedenti "esterni"? E la natura della ricorsione non garantirà che i valori vengano estratti da "interiore" a "esterno"?
Sto usando Ruby e ho cercato di implementare le cose in questo modo. Tuttavia, qualcosa non funziona, e potrebbe essere a causa di ciò, o forse no. Ecco la mia funzione eval, ENV essere un Hash regolare:
def eval(x, env = $global_env)
........
elsif x[0] == "lambda" then
->(*args) { eval(x[2], env.merge(Hash[*x[1].zip(args).flatten(1)])) }
........
end
La linea che conta, naturalmente, è il "lambda" uno.
Se c'è una differenza funzionale, cosa c'è di diverso tra ciò che sto facendo qui e ciò che Norvig ha fatto con la sua classe Env? Qualcuno può descrivermi un caso in cui i due si discosteranno?
Se non c'è differenza, forse qualcuno può illuminarmi sul perché Norvig usi la classe Env. Grazie :)
Il modo migliore per comprendere Scheme è implementare Scheme! – erjiang
Oh, così vero ... :) – MikeC8