alegioit
23-02-2011, 21:34
ciao, sto scrivendo il progetto per un esame e mi sto davvero incasinando sulle chiusure ( che credevo di aver capito, ma sto incontrando alcuni problemi ).
In sintesi per il progetto ho una lista che contiene delle funzioni ( che, come sapete sono liste anch'esse ) ad ognuna di esse ci devo aggiungere un argomento ( in sintesi se una funzione è " (princ (+ x y) " gli devo poter aggiungere z ); questo mi serve per creare un piccolo linguaggio ad oggetti in lisp, in particolare nel caso in cui chiamo una funzione che contiene il riferimento all'oggetto stesso ( il this di java ).
Avevo pensato di creare questo utilizzando due chiusure successive, ma non riesco proprio a venirne a capo.
Il problema che sto incontrando è riassumibile nel seguente esempio.
Costruisco la seguente funzione:
(defun prova (x y z)
(funcall (lambda (x y) (funcall (lambda (z) (+ x y z)) z)) x y))
in sintesi dovrei chiudere successivamente z e x y.
Fin qui tutto ok dato che se do nel listener:
(prova 1 2 3)
ottengo 6 che è il risultato aspettato.
Se invece definisco:
(defun prova2 (x y z metodo)
(funcall (lambda (x y) (funcall (eval (list 'lambda '(z) metodo)) z)) x y))
e do nel listener:
(prova 1 2 3 '(+ x y z))
mi da errore dicendomi che le variabili x ed y sono unbound, però non riesco assolutamente a capire perchè........:doh: :doh: :doh: :doh:
In sintesi per il progetto ho una lista che contiene delle funzioni ( che, come sapete sono liste anch'esse ) ad ognuna di esse ci devo aggiungere un argomento ( in sintesi se una funzione è " (princ (+ x y) " gli devo poter aggiungere z ); questo mi serve per creare un piccolo linguaggio ad oggetti in lisp, in particolare nel caso in cui chiamo una funzione che contiene il riferimento all'oggetto stesso ( il this di java ).
Avevo pensato di creare questo utilizzando due chiusure successive, ma non riesco proprio a venirne a capo.
Il problema che sto incontrando è riassumibile nel seguente esempio.
Costruisco la seguente funzione:
(defun prova (x y z)
(funcall (lambda (x y) (funcall (lambda (z) (+ x y z)) z)) x y))
in sintesi dovrei chiudere successivamente z e x y.
Fin qui tutto ok dato che se do nel listener:
(prova 1 2 3)
ottengo 6 che è il risultato aspettato.
Se invece definisco:
(defun prova2 (x y z metodo)
(funcall (lambda (x y) (funcall (eval (list 'lambda '(z) metodo)) z)) x y))
e do nel listener:
(prova 1 2 3 '(+ x y z))
mi da errore dicendomi che le variabili x ed y sono unbound, però non riesco assolutamente a capire perchè........:doh: :doh: :doh: :doh: