aide

missyN
aide

bonjour j'ai un problemme avec l'interprete lisp de MccArthy
precisement la fonction eval.
qui est la suivante:
(defun eval.(e a)
(cond
((atom e) (assoc. e a))
((atom (car e))
(cond
((eq (car e) 'quote) (cadr e))
((eq (car e)'atom) (atom (eval. (cadr e) a)))
((eq (car e) 'eq ) (eq (eval. (cadr e) a)
(eval. (caddr e) a)))
((eq (car e) 'car) (car (eval. (cadr e) a)))
((eq (car e) 'cdr) (cdr (eval. (cadr e) a)))
((eq (car e) 'cons.) (cons (eval. (cadr e) a)
(eval. (caddr e) a)))
((eq (car e)'cond) (evcon. (cdr e) a))
(t (eval. (cons (assoc. (car e) a)
(cdr e))
a))))
((eq (caar e) 'lambda)
(eval. (caddar e)
(append. (pair. (cadar e) (evlis. (cdr e) a))
a))))))
mon probleme est que je doit y rajouter defun pour que l'execution de eval. definisse immediatement une nouvelle fonction

et donc j'ai essayer sa:
((eq (caar e) 'defun) (defun bar (l) (eval. (cadr (cdar e))
(append. (pair.
(cadar e)(evlis. (cdr e) a))
a))))))
et je lance eval. comme suite:

(eval. '((defun (x) (cons. x ())) n) '((n (if l (cons (car l) l) l)) (t t) ( () ())))
le hic est que ma fonction definie donc "bar" ne marche pas comme je veux

fredericmazue

Quote:
mon probleme est que je doit y rajouter defun pour que l'execution de eval. definisse immediatement une nouvelle fonction

Je ne comprends rien à la question pour au moins deux raisons.

- On ne peut pas te lire. Comme chacun sait, C'est l'indentation conventionnelle du code Lisp qui le rend lisible. Là c'est illisible même quand on aime Lisp, ce qui est mon cas. Donc je n'ai pas tout lu, loin s'en faut

- Je ne comprends pas ce que tu as essayé de faire. Tu définis defun en fonction de defun :?:

Normalement defun est une macro. Tu devrais peut être définir defun à partir de defmacro. Si tu as droit à defmacro dans ce qui semble un exercice d'école ?

missyN
raison

c'est un exo.
mais je suppose ke tu connais l'interprete lisp de McCarthy
donc tu devrais la fonction eval. ki y figure.
bon c'est a partir de cette fonction eval. ke je doit redefinir une nouvelle fonction l'orsque je l'execute.
tu vois now j'esper.et c'est sa mon probleme

fredericmazue

Quote:
c'est un exo.
mais je suppose ke tu connais l'interprete lisp de McCarthy

J'en ai entendu parler un petit peu 8)
Quoique pas à l'école, parce que moi à l'école je n'y suis pas allé. :)

Mais que je connaisse le sujet n'implique pas que tout le monde le connaisse et (là c'est le modérateur qui parle) en aucun cas ça ne te dispense de poser ta question soigneusement. D'autant qu'il s'agit de faire ton exercice (au moins un peu) à ta place. La moindre des choses, il me semble, est de faire un petit effort pour être intelligible par tous.

Quote:
donc tu devrais la fonction eval. ki y figure.
bon c'est a partir de cette fonction eval. ke je doit redefinir une nouvelle fonction l'orsque je l'execute.
tu vois now j'esper.et c'est sa mon probleme

Je ne comprends rien à ce charabia :evil:

missyN

ok
je vais etre plus claire.
tu connais surement l'interprete lisp de McCArthy.dans cet interprete il se trouve la fonction eval.
et c'est avec cette fonction que je doit redefinir un nouvelle fonction a l'aide de "defun". :( :cry:

missyN

bon ok voila la fonction eval de MacCarthy: que je doit transformer

(defun eval.(e a)
(cond

((atom e) (assoc. e a))

((atom (car e))

(cond

((eq (car e) 'quote) (cadr e))

((eq (car e)'atom) (atom (eval. (cadr e) a)))

((eq (car e) 'eq ) (eq (eval. (cadr e) a)
(eval. (caddr e) a)))

((eq (car e) 'car) (car (eval. (cadr e) a)))

((eq (car e) 'cdr) (cdr (eval. (cadr e) a)))

((eq (car e) 'cons.) (cons (eval. (cadr e) a)
(eval. (caddr e) a)))

((eq (car e)'cond) (evcon. (cdr e) a))
(t (eval. (cons (assoc. (car e) a) (cdr e))
a)))))))

donc c'est dans ce même contexte que je doit utiliser un moyen pour definir un nouvelle fonction quand j'execute la fonction eval.
j'esper etre mainrenant assez claire pour pouvoir avoir de l'aide

fredericmazue

Quote:
bon ok voila la fonction eval de MacCarthy: que je doit transformer

Avec un code qui n'est toujours pas indenté, donc toujours pas lisible. Ca te tuerait de mettre ton code entre les balises codes prévues à cet effet ? Comme ça l'indentation resterait sans doute visible ...

A ceux que le sujet intéresse et qui voudrait savoir de quoi on parle et à quoi ressemble l'interpréteur de MacCarthy, voici deux liens intéressants:
http://lib.store.yahoo.net/lib/paulgraham/jmc.lisp
http://www.lrde.epita.fr/dload/20020619-Seminar/verna0602_slides.pdf

Quote:
donc c'est dans ce même contexte que je doit utiliser un moyen pour definir un nouvelle fonction quand j'execute la fonction eval.
j'esper etre mainrenant assez claire pour pouvoir avoir de l'aide

Disons que c'est un peu moins obscur. En tous cas je comprends que je n'avais pas compris la première fois :)

Bon je vais essayer de t'aider un peu. Ton premier essai était tout faux il me semble. Je pense que le code que tu dois écrire doit commencer ainsi:

((eq (car e) 'defun)  ;; à continuer ici... )