Discussione:Riflessione (informatica)
Lisp e Scheme
[modifica wikitesto]Né Lisp né Scheme offrono funzionalità riflessive. La confusione può nascere dal fatto che in Lisp i programmi sono rappresentati come liste e quindi un programma può manipolare codice. Ma si tratta di codice terzo, non del suo stesso codice, che viene passato esplicitamente com argomento, anche nel caso del meccanismo sofisticato di macro presenti in Lisp. Se manipolare codice fosse da considerare Reflection, allora qualunque compilatore sarebbe un programma riflessivo. Quindi bisogna distinguere tra programmi che manipolano altri programmi e programmi riflessivi.
Scheme offre il meccanismo delle continuazioni, con le quali si può modificare il flusso di esecuzione del programma. Anche questo non è un aspetto riflessivo, perché le continuazioni non sono oggetti ispezionabili. Si può utilizzare la current continuation e sostituirla con un altra. È assimilable a un meccanismo di call-back, che non rientra nella tipologia della Reflection.
Maes Ferber
[modifica wikitesto]Nel paragrafo applicazioni, si nomina il java come il linguaggio che più si avvicina al modello di Maes e Ferber. A parer mio questo aspetto è maggiore nel linguaggio ruby.
Il linguaggio java necessita di un package per effettuare la riflessione (java.lang.reflection). Il linguaggio ruby invece è naturalmente predisposto per la riflessione:
Object.methods fornisce tutti i metodi di un oggetto, in questo caso i class method della classe object.
Object.new.methods fornisce invece gli instance methods di un object.
String.methods(false) fornisce tutti i metodi implementati direttamente dalla classe String, quindi sono esclusi i metodi derivati da Object.
Infine,
Object.class_eval do
.. codice ..
end
aggiunge tutto ciò che si trova tra do-end alla definizione della classe. In questo modo è possibile aggiungere un metodo o un attributo direttametne alla classe Object (con conseguente ereditazione degli stessi da tutte le sottoclassi)
Che ne dite?