Bonjour à tous !
Je m'excuse par avance de ce post qui risque d'être long, et plutôt technique... Elle s'adresse plutôt aux fans de la programmation fonctionnelle.
J'essaie de reproduire un simulacre de Blitz++, permettant d'effectuer des calculs vectoriels à la sauce Matlab / J.
Je pense avoir bien compris l'intérêt des template expressions permettant de regrouper les boucles for et ainsi éviter les allocations de données superflus qui plombent la RAM.
(exemple extrait du livre Techniques for Scientific C++, Todd Veldhuizen)
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Je me pose maintenant la question de savoir comment introduire dans ce schéma les fonctions du second ordre, comme la réduction, qui prend une fonction et renvoie une fonction dérivée. J'ai déjà réalisé un modèle qui permettait de le faire :
Une fonction du premier ordre prend un vector (ou array) ou deux vectors et retourne un vector.
Si elle prend un vector alors elle est monadique, si elle en prend deux elle est dyadique.
Une fonction du second ordre prend une fonction du premier ordre et en renvoie une fonction du premier ordre dérivée. Cette fonction dérivée peut potentiellement prendre un argument (monadique), ou bien deux (dyadique).
"plus" est une fonction du premier ordre, la réduction une fonction du second ordre.
En C++14 (merci à jo_link_noir pour ton aide !)
Comment traduire ça en template expression ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part 
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
Je prends le symbole / pour la réduction, qui prend son argument-fonction à gauche (syntaxe J).
Pour les classes template, j'appelle :
X un nœud d'application d'une fonction du 1er ordre, en mode dyadique : X<Left, Function, Right>
Y un nœud d'application d'une fonction du 1er ordre, en mode monadique : Y<Function, Right>
Z un nœud d'application d'une fonction du 2ème ordre, en mode monadique : Z<Left, Function>
Je sais qu'un expression du type C=A+(+/)B, avec A, B et C des tableaux, pourrait être parsée ainsi :
- C= A + Z<plus, reduce>() B
- C= A + Y<Z<plus, reduce>, array>()
- C= Z<array, Y<Z<plus, reduce>, array>()
Comment effectuer l'évaluation paresseuse pour pouvoir affecter C à la dernière ligne ? Que mettre dans la classe Z ?
Auriez-vous des idées, ne serait-ce qu'un début de piste que je pourrais creuser ? Je sais que ce que je demande est plutôt compliqué, mais je n'ai trouvé aucune référence en la matière, et pour le moment je sèche lamentablement...
Merci beaucoup !
Jean
PS : En effet, en me relisant, c'est long et technique...

 

 
		
		 
        

 
			
			


 
   
 


 Template metaprogramming et fonctions du second ordre
 Template metaprogramming et fonctions du second ordre
				 Répondre avec citation
  Répondre avec citation
Partager