Voir le flux RSS

nothus

[LISP] Disposer d'un décorateur de fonction

Noter ce billet
par , 10/02/2019 à 23h27 (103 Affichages)
Bonjour à tous,

Pour ceux qui apprécient la souplesse des décorateurs comme on les connaît sous Python :
http://sametmax.com/comprendre-les-d...-pas-partie-1/ (et articles suivants)

... Et qui débutent en LISP ; n'ont pas masse de documentation française ; aiment bien retrouver des habitudes de confort (pour le log ou autre)...

... Vous avez bien évidemment la possibilité de retrouver cela sous Lisp. Ayant cherché un moment, voici un exemple utilisable conçu pour mes besoins propres (à adapter) :
Code lisp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
(defun 
	additionner 
	(a b) 
	(+ a b) 
) 
 
(defun logger 
	(fct args) 
	(print "on me demande :") 
	(apply fct args) 
) 
 
(defmacro decorer (fct avec deco nom fctDeco) 
	"décorer une fonction avec une autre" 
	`(setf 
		(fdefinition ,fctDeco) 
		(lambda 
			(&rest args) 
			(funcall 
				(function ,deco) 
				(function ,fct) 
				args 
			) 
	 	) 
	) 
) 
 
(decorer 
	additionner 
avec 
	logger 
nom 
	'add_et_log 
) 
 
(print (additionner 1 2)) ; 3 
 
(print (add_et_log 3 4)) ; on me demande : 7

L'intérêt est de produire une nouvelle fonction qui utilisera en arguments la fonction initiale qui doit être décorée ainsi que les arguments lors de l'appel. Charge à la fonction qui décore - wrap, soit "emballage" - de savoir quoi faire. N'oubliez pas que vous pouvez écraser la fonction appelée via son symbole, provoquant potentiellement (et même certainement) une succession d'appels sans fin si la fonction décoratrice appelle une fonction décorée qui est alors en réalité... la fonction décoratrice elle-même.

Pour davantage d'informations, et la possibilité d'utiliser des signes directement dans le code, comme l'évoque cet échange glané :
https://softwareengineering.stackexchange.com/a/214201

Bon code !

PS : SBCL.

Envoyer le billet « [LISP] Disposer d'un décorateur de fonction » dans le blog Viadeo Envoyer le billet « [LISP] Disposer d'un décorateur de fonction » dans le blog Twitter Envoyer le billet « [LISP] Disposer d'un décorateur de fonction » dans le blog Google Envoyer le billet « [LISP] Disposer d'un décorateur de fonction » dans le blog Facebook Envoyer le billet « [LISP] Disposer d'un décorateur de fonction » dans le blog Digg Envoyer le billet « [LISP] Disposer d'un décorateur de fonction » dans le blog Delicious Envoyer le billet « [LISP] Disposer d'un décorateur de fonction » dans le blog MySpace Envoyer le billet « [LISP] Disposer d'un décorateur de fonction » dans le blog Yahoo

Catégories
Programmation , Python

Commentaires