Bonjour tout le monde,
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmation de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'aimerais avoir un système pour créer toutes les combinaisons possibles
d'éléments piochés dans des listes,
le filtrage de ses combinaisons pour
celles qui n'ont pas de sens,
puis le classement des combinaisons
restantes, selon 1 ou plusieurs critères.
Qui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système,
et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulement en
mémoire),
et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banque
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plus.
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couples dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}). Il faudrait ensuite pourvoir simplement redonner deux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir deux
couples).
Bonjour tout le monde,
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmation de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'aimerais avoir un système pour créer toutes les combinaisons possibles
d'éléments piochés dans des listes,
le filtrage de ses combinaisons pour
celles qui n'ont pas de sens,
puis le classement des combinaisons
restantes, selon 1 ou plusieurs critères.
Qui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système,
et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulement en
mémoire),
et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banque
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plus.
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couples dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}). Il faudrait ensuite pourvoir simplement redonner deux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir deux
couples).
Bonjour tout le monde,
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmation de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'aimerais avoir un système pour créer toutes les combinaisons possibles
d'éléments piochés dans des listes,
le filtrage de ses combinaisons pour
celles qui n'ont pas de sens,
puis le classement des combinaisons
restantes, selon 1 ou plusieurs critères.
Qui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système,
et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulement en
mémoire),
et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banque
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plus.
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couples dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}). Il faudrait ensuite pourvoir simplement redonner deux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir deux
couples).
Bonjour tout le monde,
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmation de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'aimerais avoir un système pour créer toutes les combinaisons possibles
d'éléments piochés dans des listes, le filtrage de ses combinaisons pour
celles qui n'ont pas de sens, puis le classement des combinaisons
restantes, selon 1 ou plusieurs critères. Qui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système, et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulement en
mémoire), et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banque
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plus.
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couples dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}). Il faudrait ensuite pourvoir simplement redonner deux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir deux
couples).
Je ne sais pas si j'expose mon problème très clairement. Dans tous les
cas, je serais ravi d'entendre que c'était parfaitement faisable en C++,
parce que je ne vois pas comment, sans passer par une lib comme la MPL
(tout en étant typesafe, puisqu'on est en C++...).
Bonjour tout le monde,
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmation de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'aimerais avoir un système pour créer toutes les combinaisons possibles
d'éléments piochés dans des listes, le filtrage de ses combinaisons pour
celles qui n'ont pas de sens, puis le classement des combinaisons
restantes, selon 1 ou plusieurs critères. Qui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système, et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulement en
mémoire), et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banque
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plus.
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couples dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}). Il faudrait ensuite pourvoir simplement redonner deux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir deux
couples).
Je ne sais pas si j'expose mon problème très clairement. Dans tous les
cas, je serais ravi d'entendre que c'était parfaitement faisable en C++,
parce que je ne vois pas comment, sans passer par une lib comme la MPL
(tout en étant typesafe, puisqu'on est en C++...).
Bonjour tout le monde,
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmation de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'aimerais avoir un système pour créer toutes les combinaisons possibles
d'éléments piochés dans des listes, le filtrage de ses combinaisons pour
celles qui n'ont pas de sens, puis le classement des combinaisons
restantes, selon 1 ou plusieurs critères. Qui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système, et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulement en
mémoire), et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banque
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plus.
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couples dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}). Il faudrait ensuite pourvoir simplement redonner deux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir deux
couples).
Je ne sais pas si j'expose mon problème très clairement. Dans tous les
cas, je serais ravi d'entendre que c'était parfaitement faisable en C++,
parce que je ne vois pas comment, sans passer par une lib comme la MPL
(tout en étant typesafe, puisqu'on est en C++...).
Pour donner un exemple numérique, donc testable si quelqu'un a le courage
d'aller jusqu'à implémenter son idée, on peut prendre les listes {1 2 3}
et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout nombre
supérieur à 6 de la deuxième liste, en refusant les couples dont un seul
nombre est impair, et comme classement, les couples dont la différence
est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus grand ({3
5}). Il faudrait ensuite pourvoir simplement redonner deux autres
listes, et que toutes les opérations soient refaites (modifier la seconde
liste si nécessaire, combiner, filtrer les couples, sortir deux couples).
Pour donner un exemple numérique, donc testable si quelqu'un a le courage
d'aller jusqu'à implémenter son idée, on peut prendre les listes {1 2 3}
et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout nombre
supérieur à 6 de la deuxième liste, en refusant les couples dont un seul
nombre est impair, et comme classement, les couples dont la différence
est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus grand ({3
5}). Il faudrait ensuite pourvoir simplement redonner deux autres
listes, et que toutes les opérations soient refaites (modifier la seconde
liste si nécessaire, combiner, filtrer les couples, sortir deux couples).
Pour donner un exemple numérique, donc testable si quelqu'un a le courage
d'aller jusqu'à implémenter son idée, on peut prendre les listes {1 2 3}
et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout nombre
supérieur à 6 de la deuxième liste, en refusant les couples dont un seul
nombre est impair, et comme classement, les couples dont la différence
est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus grand ({3
5}). Il faudrait ensuite pourvoir simplement redonner deux autres
listes, et que toutes les opérations soient refaites (modifier la seconde
liste si nécessaire, combiner, filtrer les couples, sortir deux couples).
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmati on de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'ai surement pas compris où était le problème, car je vois pas
en quoi c'est difficile à faire en C++.
J'aimerais avoir un système pour créer toutes les combinaisons poss ibles
d'éléments piochés dans des listes,
OK, 3 boucles imbriquées.
le filtrage de ses combinaisons pour
celles qui n'ont pas de sens,
remove_ifpuis le classement des combinaisons
restantes, selon 1 ou plusieurs critères.
sortQui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système,
transform
et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulem ent en
mémoire),
Là, j'ai pas compris.
et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banq ue
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plu s.
Où est le problème ?
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couple s dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}). Il faudrait ensuite pourvoir simplement redonner de ux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir de ux
couples).
Pas vraiment le temps là ce matin, mais je vois pas de pb majeur.
J'ai peut-être raté quelque chose.
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmati on de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'ai surement pas compris où était le problème, car je vois pas
en quoi c'est difficile à faire en C++.
J'aimerais avoir un système pour créer toutes les combinaisons poss ibles
d'éléments piochés dans des listes,
OK, 3 boucles imbriquées.
le filtrage de ses combinaisons pour
celles qui n'ont pas de sens,
remove_if
puis le classement des combinaisons
restantes, selon 1 ou plusieurs critères.
sort
Qui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système,
transform
et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulem ent en
mémoire),
Là, j'ai pas compris.
et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banq ue
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plu s.
Où est le problème ?
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couple s dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}=15). Il faudrait ensuite pourvoir simplement redonner de ux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir de ux
couples).
Pas vraiment le temps là ce matin, mais je vois pas de pb majeur.
J'ai peut-être raté quelque chose.
j'ai une question, qui est en fait un défi à réaliser ce qui m'a semblé
impossible en C++. Ou plutôt, difficilement possible. J'ai galéré
pendant 6 moix à essayer de tourner le truc dans tous les sens, et il
m'a semblé que ce ne serait possible qu'avec de la méta-programmati on de
templates. L'utilisation d'une bibliothèque existante semblait tout à
fait possible, heureusement (la MPL). Néanmoins, quand je me suis mis à
Common Lisp, j'ai refait un essai avec ce nouveau langage, et là, en
quelques heures, j'avais un code qui marchait partiellement, et qui en
particulier implémentait ce qui m'avait semblé le plus inaccessible en
C++ :
J'ai surement pas compris où était le problème, car je vois pas
en quoi c'est difficile à faire en C++.
J'aimerais avoir un système pour créer toutes les combinaisons poss ibles
d'éléments piochés dans des listes,
OK, 3 boucles imbriquées.
le filtrage de ses combinaisons pour
celles qui n'ont pas de sens,
remove_ifpuis le classement des combinaisons
restantes, selon 1 ou plusieurs critères.
sortQui plus est, je voudrais
pouvoir définir des opérations qui altèrent les listes avant leur
passage dans le système,
transform
et que la combinaison de ces opérations puisse
être gardée pour plus tard (pas forcément sérialisées, seulem ent en
mémoire),
Là, j'ai pas compris.
et que l'utilisateur puisse choisir ces opérations.
Exemple : j'ai trois listes {client}, {lot1, ..., lotN} et {banque1,
..., banqueN} et je veux que dans la première on ajoute une version
modifiée du client et que dans la troisième on remplace chaque banq ue
par une liste des offres de financement qu'elle propose. On doit
construire tous les triplets {client, lot, financement}, en virant ceux
pour lesquels on sait que la banque refuserait (le client ou le lot) ou
que le client ne peux payer (le lot). Ensuite, on veut le meilleur
triplet dans deux classements : celui où le financement fait sortir le
moins d'argent chaque mois, celui où l'investissement rapporte le plu s.
Où est le problème ?
Pour donner un exemple numérique, donc testable si quelqu'un a le
courage d'aller jusqu'à implémenter son idée, on peut prendre les listes
{1 2 3} et {4 5 6 7 8 9}, avec comme opération préalable d'enlever tout
nombre supérieur à 6 de la deuxième liste, en refusant les couple s dont
un seul nombre est impair, et comme classement, les couples dont la
différence est la plus petite ({3 5}=2 ou {2 4}=2) et le produit le plus
grand ({3 5}). Il faudrait ensuite pourvoir simplement redonner de ux
autres listes, et que toutes les opérations soient refaites (modifier la
seconde liste si nécessaire, combiner, filtrer les couples, sortir de ux
couples).
Pas vraiment le temps là ce matin, mais je vois pas de pb majeur.
J'ai peut-être raté quelque chose.
Une partie du problème vient déjà de sa formulation : il a des listes.
D'abord ne faut-il pas définir la structures des données ? Comment
représenter une combinaison ? Et où en stocker les résultats ?
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a qu'une
seule structure de données, la liste.)
À l'encontre de Lisp, on n'aurait typiquement pas une solution
générique en C++ (au moins que le besoin s'en fait sentir par la
suite). A priori, je m'attendrais à quelque chose du genre :
struct Something
{
std::string fromSetA ;
int fromSetB ;
double fromSetC ;
} ;
et que l'utilisateur puisse choisir ces opérations.
Et c'est là que ça se corse. Si j'ai bien compris, il veut un
interpréteur. Ou un mini langage, ou quelque chose du genre. Que c'est
à l'exécution que l'utilisateur spécifie les ensembles qui lui
intéressent, les conditions de filtrage et les transformations à
effectuer.
En Lisp, tu converis la requête utilisateur en source Lisp, et tu
l'exécutes.
En fait, ce genre de problème se résoud la plupart du temps en SQL.
Une partie du problème vient déjà de sa formulation : il a des listes.
D'abord ne faut-il pas définir la structures des données ? Comment
représenter une combinaison ? Et où en stocker les résultats ?
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a qu'une
seule structure de données, la liste.)
À l'encontre de Lisp, on n'aurait typiquement pas une solution
générique en C++ (au moins que le besoin s'en fait sentir par la
suite). A priori, je m'attendrais à quelque chose du genre :
struct Something
{
std::string fromSetA ;
int fromSetB ;
double fromSetC ;
} ;
et que l'utilisateur puisse choisir ces opérations.
Et c'est là que ça se corse. Si j'ai bien compris, il veut un
interpréteur. Ou un mini langage, ou quelque chose du genre. Que c'est
à l'exécution que l'utilisateur spécifie les ensembles qui lui
intéressent, les conditions de filtrage et les transformations à
effectuer.
En Lisp, tu converis la requête utilisateur en source Lisp, et tu
l'exécutes.
En fait, ce genre de problème se résoud la plupart du temps en SQL.
Une partie du problème vient déjà de sa formulation : il a des listes.
D'abord ne faut-il pas définir la structures des données ? Comment
représenter une combinaison ? Et où en stocker les résultats ?
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a qu'une
seule structure de données, la liste.)
À l'encontre de Lisp, on n'aurait typiquement pas une solution
générique en C++ (au moins que le besoin s'en fait sentir par la
suite). A priori, je m'attendrais à quelque chose du genre :
struct Something
{
std::string fromSetA ;
int fromSetB ;
double fromSetC ;
} ;
et que l'utilisateur puisse choisir ces opérations.
Et c'est là que ça se corse. Si j'ai bien compris, il veut un
interpréteur. Ou un mini langage, ou quelque chose du genre. Que c'est
à l'exécution que l'utilisateur spécifie les ensembles qui lui
intéressent, les conditions de filtrage et les transformations à
effectuer.
En Lisp, tu converis la requête utilisateur en source Lisp, et tu
l'exécutes.
En fait, ce genre de problème se résoud la plupart du temps en SQL.
et que la combinaison de ces opérations puisse être gardée pour plus
tard (pas forcément sérialisées, seulement en mémoire), et que
l'utilisateur puisse choisir ces opérations.
google Memoisation.
Effectivement, c'est un sujet difficile pour C++ compare a d'autres
langages. Comme tu as mentionne Common Lisp, je me permets de
mentionner Haskell, qui est tres approprie pour ce genre d'exercice.
Comme le domaine est apparament lie aux contrats en finance, je peux
te conseiller la lecture du papier:
http://research.microsoft.com/Users/simonpj/Papers/financial-contracts/contracts-icfp.htm
Dans les groupes de discussion de Haskell, il est recurrent de voir
des personnes demander comment resoudre ce type de probleme en
C++/Java/C# en ayant un protoype en Haskell qui marche (et en general
en qques lignes). La reponse est rarement a la hauteur des esperances
du demandeur.
Mais la comprehension des concepts cites ci-dessus t'aidera
certainement a mieux le programmer en C++ etant donne qu'a qqchose
pres, il te faut refaire a la main ce que Haskell supporte nativement.
[...]
Je sais, c'est une reponse de normand ;-)
et que la combinaison de ces opérations puisse être gardée pour plus
tard (pas forcément sérialisées, seulement en mémoire), et que
l'utilisateur puisse choisir ces opérations.
google Memoisation.
Effectivement, c'est un sujet difficile pour C++ compare a d'autres
langages. Comme tu as mentionne Common Lisp, je me permets de
mentionner Haskell, qui est tres approprie pour ce genre d'exercice.
Comme le domaine est apparament lie aux contrats en finance, je peux
te conseiller la lecture du papier:
http://research.microsoft.com/Users/simonpj/Papers/financial-contracts/contracts-icfp.htm
Dans les groupes de discussion de Haskell, il est recurrent de voir
des personnes demander comment resoudre ce type de probleme en
C++/Java/C# en ayant un protoype en Haskell qui marche (et en general
en qques lignes). La reponse est rarement a la hauteur des esperances
du demandeur.
Mais la comprehension des concepts cites ci-dessus t'aidera
certainement a mieux le programmer en C++ etant donne qu'a qqchose
pres, il te faut refaire a la main ce que Haskell supporte nativement.
[...]
Je sais, c'est une reponse de normand ;-)
et que la combinaison de ces opérations puisse être gardée pour plus
tard (pas forcément sérialisées, seulement en mémoire), et que
l'utilisateur puisse choisir ces opérations.
google Memoisation.
Effectivement, c'est un sujet difficile pour C++ compare a d'autres
langages. Comme tu as mentionne Common Lisp, je me permets de
mentionner Haskell, qui est tres approprie pour ce genre d'exercice.
Comme le domaine est apparament lie aux contrats en finance, je peux
te conseiller la lecture du papier:
http://research.microsoft.com/Users/simonpj/Papers/financial-contracts/contracts-icfp.htm
Dans les groupes de discussion de Haskell, il est recurrent de voir
des personnes demander comment resoudre ce type de probleme en
C++/Java/C# en ayant un protoype en Haskell qui marche (et en general
en qques lignes). La reponse est rarement a la hauteur des esperances
du demandeur.
Mais la comprehension des concepts cites ci-dessus t'aidera
certainement a mieux le programmer en C++ etant donne qu'a qqchose
pres, il te faut refaire a la main ce que Haskell supporte nativement.
[...]
Je sais, c'est une reponse de normand ;-)
Le Thu, 14 Dec 2006 06:06:01 -0800, James Kanze a écrit:Une partie du problème vient déjà de sa formulation : il a des li stes.
Effectivement, l'implémentation de mon prototype déteint sur ma
formulation du problème...D'abord ne faut-il pas définir la structures des données ? Comment
représenter une combinaison ? Et où en stocker les résultats ?
Dans l'implémentation C++, je comptais me servir de tuples pour stocker
les combinaisons.
Il me semblait judicieux d'utiliser la structure la
plus légère de la STL pour stocker les tuples retenus, donc une liste
doublement chainée (simple aurait suffit, mais si mes souvenirs sont
bons, slist est une extension de la STL...).
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a qu'une
seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
À l'encontre de Lisp, on n'aurait typiquement pas une solution
générique en C++ (au moins que le besoin s'en fait sentir par la
suite). A priori, je m'attendrais à quelque chose du genre :
struct Something
{
std::string fromSetA ;
int fromSetB ;
double fromSetC ;
} ;
La solution non générique, je sais l'écrire. En deux coups de cuill er à
pot, même. Et à ce prix-là, je ne m'emmerde pas, et j'écris trois ou
quatres boucles imbriquées et c'est torché.
Mais je me posais la question de savoir si c'est réalisable de façon
générique.
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici un
code capable de s'adapter à un nombre inconnu (éventuellement borné)
d'éléments dans les tuples qui vont être produits, de types inconnu s à
l'avance.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
et que l'utilisateur puisse choisir ces opérations.
Et c'est là que ça se corse. Si j'ai bien compris, il veut un
interpréteur. Ou un mini langage, ou quelque chose du genre. Que c'est
à l'exécution que l'utilisateur spécifie les ensembles qui lui
intéressent, les conditions de filtrage et les transformations à
effectuer.
Oui, mais cette partie-là peut être gérée par une forme de machin e à
états, et ne nécessite d'interprêter qu'un langage vraiment minimal iste.
Pour des tuples à trois éléments, par exemple, les opérations pou rraient
être spécifiées ainsi :
"op1,op2,op3::op4,op5"
Où les opérations "op1", "op2" et "op3" seraient appliquées au cont eneur
destiné à fournir les premiers éléments des tuples et "op4" et "o p5"
seraient appliqués au conteneur fournissant les troisièmes élémen ts des
tuples, le second étant utilisé intouché.
Si les opérations peuvent
manipuler une pile de registres, on peut même « compliquer » notre
syntaxe en permettant de spécifier la pile initiale, toujours par des
chaînes de caractères qui sont mappées par l'application à des do nnées
qu'elle manipule.
Loin de moi l'idée de constuire un interpréteur Turing-complete pour
ça... (quoique qu'une fois que je suis passé à Lisp, étant donn é la
présence en standard d'une fonction eval et même de la fonction compi le,
ça devenait envisageable)
En Lisp, tu converis la requête utilisateur en source Lisp, et tu
l'exécutes.
Oui, c'est possible. Pas forcément une bonne idée, mais possible.En fait, ce genre de problème se résoud la plupart du temps en SQL.
<illumination mode="Je m'en étais pas rendu comtpe">
Tiens, c'est vrai...
</illumination>
Le Thu, 14 Dec 2006 06:06:01 -0800, James Kanze a écrit:
Une partie du problème vient déjà de sa formulation : il a des li stes.
Effectivement, l'implémentation de mon prototype déteint sur ma
formulation du problème...
D'abord ne faut-il pas définir la structures des données ? Comment
représenter une combinaison ? Et où en stocker les résultats ?
Dans l'implémentation C++, je comptais me servir de tuples pour stocker
les combinaisons.
Il me semblait judicieux d'utiliser la structure la
plus légère de la STL pour stocker les tuples retenus, donc une liste
doublement chainée (simple aurait suffit, mais si mes souvenirs sont
bons, slist est une extension de la STL...).
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a qu'une
seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
À l'encontre de Lisp, on n'aurait typiquement pas une solution
générique en C++ (au moins que le besoin s'en fait sentir par la
suite). A priori, je m'attendrais à quelque chose du genre :
struct Something
{
std::string fromSetA ;
int fromSetB ;
double fromSetC ;
} ;
La solution non générique, je sais l'écrire. En deux coups de cuill er à
pot, même. Et à ce prix-là, je ne m'emmerde pas, et j'écris trois ou
quatres boucles imbriquées et c'est torché.
Mais je me posais la question de savoir si c'est réalisable de façon
générique.
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici un
code capable de s'adapter à un nombre inconnu (éventuellement borné)
d'éléments dans les tuples qui vont être produits, de types inconnu s à
l'avance.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
et que l'utilisateur puisse choisir ces opérations.
Et c'est là que ça se corse. Si j'ai bien compris, il veut un
interpréteur. Ou un mini langage, ou quelque chose du genre. Que c'est
à l'exécution que l'utilisateur spécifie les ensembles qui lui
intéressent, les conditions de filtrage et les transformations à
effectuer.
Oui, mais cette partie-là peut être gérée par une forme de machin e à
états, et ne nécessite d'interprêter qu'un langage vraiment minimal iste.
Pour des tuples à trois éléments, par exemple, les opérations pou rraient
être spécifiées ainsi :
"op1,op2,op3::op4,op5"
Où les opérations "op1", "op2" et "op3" seraient appliquées au cont eneur
destiné à fournir les premiers éléments des tuples et "op4" et "o p5"
seraient appliqués au conteneur fournissant les troisièmes élémen ts des
tuples, le second étant utilisé intouché.
Si les opérations peuvent
manipuler une pile de registres, on peut même « compliquer » notre
syntaxe en permettant de spécifier la pile initiale, toujours par des
chaînes de caractères qui sont mappées par l'application à des do nnées
qu'elle manipule.
Loin de moi l'idée de constuire un interpréteur Turing-complete pour
ça... (quoique qu'une fois que je suis passé à Lisp, étant donn é la
présence en standard d'une fonction eval et même de la fonction compi le,
ça devenait envisageable)
En Lisp, tu converis la requête utilisateur en source Lisp, et tu
l'exécutes.
Oui, c'est possible. Pas forcément une bonne idée, mais possible.
En fait, ce genre de problème se résoud la plupart du temps en SQL.
<illumination mode="Je m'en étais pas rendu comtpe">
Tiens, c'est vrai...
</illumination>
Le Thu, 14 Dec 2006 06:06:01 -0800, James Kanze a écrit:Une partie du problème vient déjà de sa formulation : il a des li stes.
Effectivement, l'implémentation de mon prototype déteint sur ma
formulation du problème...D'abord ne faut-il pas définir la structures des données ? Comment
représenter une combinaison ? Et où en stocker les résultats ?
Dans l'implémentation C++, je comptais me servir de tuples pour stocker
les combinaisons.
Il me semblait judicieux d'utiliser la structure la
plus légère de la STL pour stocker les tuples retenus, donc une liste
doublement chainée (simple aurait suffit, mais si mes souvenirs sont
bons, slist est une extension de la STL...).
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a qu'une
seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
À l'encontre de Lisp, on n'aurait typiquement pas une solution
générique en C++ (au moins que le besoin s'en fait sentir par la
suite). A priori, je m'attendrais à quelque chose du genre :
struct Something
{
std::string fromSetA ;
int fromSetB ;
double fromSetC ;
} ;
La solution non générique, je sais l'écrire. En deux coups de cuill er à
pot, même. Et à ce prix-là, je ne m'emmerde pas, et j'écris trois ou
quatres boucles imbriquées et c'est torché.
Mais je me posais la question de savoir si c'est réalisable de façon
générique.
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici un
code capable de s'adapter à un nombre inconnu (éventuellement borné)
d'éléments dans les tuples qui vont être produits, de types inconnu s à
l'avance.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
et que l'utilisateur puisse choisir ces opérations.
Et c'est là que ça se corse. Si j'ai bien compris, il veut un
interpréteur. Ou un mini langage, ou quelque chose du genre. Que c'est
à l'exécution que l'utilisateur spécifie les ensembles qui lui
intéressent, les conditions de filtrage et les transformations à
effectuer.
Oui, mais cette partie-là peut être gérée par une forme de machin e à
états, et ne nécessite d'interprêter qu'un langage vraiment minimal iste.
Pour des tuples à trois éléments, par exemple, les opérations pou rraient
être spécifiées ainsi :
"op1,op2,op3::op4,op5"
Où les opérations "op1", "op2" et "op3" seraient appliquées au cont eneur
destiné à fournir les premiers éléments des tuples et "op4" et "o p5"
seraient appliqués au conteneur fournissant les troisièmes élémen ts des
tuples, le second étant utilisé intouché.
Si les opérations peuvent
manipuler une pile de registres, on peut même « compliquer » notre
syntaxe en permettant de spécifier la pile initiale, toujours par des
chaînes de caractères qui sont mappées par l'application à des do nnées
qu'elle manipule.
Loin de moi l'idée de constuire un interpréteur Turing-complete pour
ça... (quoique qu'une fois que je suis passé à Lisp, étant donn é la
présence en standard d'une fonction eval et même de la fonction compi le,
ça devenait envisageable)
En Lisp, tu converis la requête utilisateur en source Lisp, et tu
l'exécutes.
Oui, c'est possible. Pas forcément une bonne idée, mais possible.En fait, ce genre de problème se résoud la plupart du temps en SQL.
<illumination mode="Je m'en étais pas rendu comtpe">
Tiens, c'est vrai...
</illumination>
Dans l'implémentation C++, je comptais me servir de tuples pour
stocker les combinaisons.
Par tuples, entends-tu boost::tuples, ou quelque chose maison ?
Il me semblait judicieux d'utiliser la structure la plus légère de
la STL pour stocker les tuples retenus, donc une liste doublement
chainée
Selon les opérations envisagées, vector ou deque pourrait être
nettement plus legers.
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a
qu'une seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
Qui en a ajouté des tableaux, etc. Mais la structure dynamique de base
en Lisp, c'est bien une liste.
Mais je me posais la question de savoir si c'est réalisable de façon
générique.
À quel niveau ? Jusqu'au niveau des types dans les tuples ?
Générique résolue à l'exécution, ou lors de la compilation ?
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici
un code capable de s'adapter à un nombre inconnu (éventuellement
borné) d'éléments dans les tuples qui vont être produits, de types
inconnus à l'avance.
Lors de l'exécution, s'entend.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
Mais il faudrait savoir lequel lors de l'écriture du programme.
Loin de moi l'idée de constuire un interpréteur Turing-complete pour
ça...
Même en C++, avec lex et yacc, ce n'est pas la fin du monde. Je le
fais souvent. Dans la mesure où le langage ne permet pas de structures
de boucles ou des sous-programmes, c'est ultra simple.
Maintenant, s'il s'agit de manipuler des ensembles d'une dizaine
d'éléments, mettre en jeu toute une base de données, ce n'est
peut-être pas la solution la plus légère. (Mais s'il y a une base déjà
installée sur ta machine...)
Dans l'implémentation C++, je comptais me servir de tuples pour
stocker les combinaisons.
Par tuples, entends-tu boost::tuples, ou quelque chose maison ?
Il me semblait judicieux d'utiliser la structure la plus légère de
la STL pour stocker les tuples retenus, donc une liste doublement
chainée
Selon les opérations envisagées, vector ou deque pourrait être
nettement plus legers.
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a
qu'une seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
Qui en a ajouté des tableaux, etc. Mais la structure dynamique de base
en Lisp, c'est bien une liste.
Mais je me posais la question de savoir si c'est réalisable de façon
générique.
À quel niveau ? Jusqu'au niveau des types dans les tuples ?
Générique résolue à l'exécution, ou lors de la compilation ?
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici
un code capable de s'adapter à un nombre inconnu (éventuellement
borné) d'éléments dans les tuples qui vont être produits, de types
inconnus à l'avance.
Lors de l'exécution, s'entend.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
Mais il faudrait savoir lequel lors de l'écriture du programme.
Loin de moi l'idée de constuire un interpréteur Turing-complete pour
ça...
Même en C++, avec lex et yacc, ce n'est pas la fin du monde. Je le
fais souvent. Dans la mesure où le langage ne permet pas de structures
de boucles ou des sous-programmes, c'est ultra simple.
Maintenant, s'il s'agit de manipuler des ensembles d'une dizaine
d'éléments, mettre en jeu toute une base de données, ce n'est
peut-être pas la solution la plus légère. (Mais s'il y a une base déjà
installée sur ta machine...)
Dans l'implémentation C++, je comptais me servir de tuples pour
stocker les combinaisons.
Par tuples, entends-tu boost::tuples, ou quelque chose maison ?
Il me semblait judicieux d'utiliser la structure la plus légère de
la STL pour stocker les tuples retenus, donc une liste doublement
chainée
Selon les opérations envisagées, vector ou deque pourrait être
nettement plus legers.
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a
qu'une seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
Qui en a ajouté des tableaux, etc. Mais la structure dynamique de base
en Lisp, c'est bien une liste.
Mais je me posais la question de savoir si c'est réalisable de façon
générique.
À quel niveau ? Jusqu'au niveau des types dans les tuples ?
Générique résolue à l'exécution, ou lors de la compilation ?
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici
un code capable de s'adapter à un nombre inconnu (éventuellement
borné) d'éléments dans les tuples qui vont être produits, de types
inconnus à l'avance.
Lors de l'exécution, s'entend.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
Mais il faudrait savoir lequel lors de l'écriture du programme.
Loin de moi l'idée de constuire un interpréteur Turing-complete pour
ça...
Même en C++, avec lex et yacc, ce n'est pas la fin du monde. Je le
fais souvent. Dans la mesure où le langage ne permet pas de structures
de boucles ou des sous-programmes, c'est ultra simple.
Maintenant, s'il s'agit de manipuler des ensembles d'une dizaine
d'éléments, mettre en jeu toute une base de données, ce n'est
peut-être pas la solution la plus légère. (Mais s'il y a une base déjà
installée sur ta machine...)
Le Sat, 16 Dec 2006 02:22:46 -0800, James Kanze a écrit:Dans l'implémentation C++, je comptais me servir de tuples pour
stocker les combinaisons.
Par tuples, entends-tu boost::tuples, ou quelque chose maison ?
Je pensais à Boost, pour que les tuples soient typés. Sinon, si on
abandonne la typesafety, il y std::vector<boost::any>.
Il me semblait judicieux d'utiliser la structure la plus légère de
la STL pour stocker les tuples retenus, donc une liste doublement
chainée
Selon les opérations envisagées, vector ou deque pourrait être
nettement plus legers.
Instinctivement, j'évite vector quand je vais faire une tripotée d'aj out
sans savoir à l'avance la taille... Deque, par contre, serait bien.
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a
qu'une seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
Qui en a ajouté des tableaux, etc. Mais la structure dynamique de base
en Lisp, c'est bien une liste.
Il y un fossé entre « structure dynamique de base » et « seule
structure ».
Mais je me posais la question de savoir si c'est réalisable de fa çon
générique.
À quel niveau ? Jusqu'au niveau des types dans les tuples ?
OuiGénérique résolue à l'exécution, ou lors de la compilation ?
À la compilation.
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici
un code capable de s'adapter à un nombre inconnu (éventuellement
borné) d'éléments dans les tuples qui vont être produits, de types
inconnus à l'avance.
Lors de l'exécution, s'entend.
Non, à la compilation. C'est déjà assez compliqué comme ça. ;-)Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
Mais il faudrait savoir lequel lors de l'écriture du programme.
Non, justement. Je voudrais que le même code puisse être appelé ave c ces
deux déclarations. C'est là que la MPL entrait en action (et que je
déclarais forfait)...
Loin de moi l'idée de constuire un interpréteur Turing-complete p our
ça...
Même en C++, avec lex et yacc, ce n'est pas la fin du monde. Je le
fais souvent. Dans la mesure où le langage ne permet pas de structures
de boucles ou des sous-programmes, c'est ultra simple.
C'est vrai que je ne suis pas un habitué de ces outils.
Maintenant, s'il s'agit de manipuler des ensembles d'une dizaine
d'éléments, mettre en jeu toute une base de données, ce n'est
peut-être pas la solution la plus légère. (Mais s'il y a une base déjà
installée sur ta machine...)
Ça se discute, puisque les infos seront de toutes façon déjà dans une
base de données.
Reste que je veux pouvoir exprimer des contraintes
arbitrairement complexes.
D'un autre côté, Postgresql dispose d'un
PL/scheme, je devrais y trouver mon bonheur...
Le Sat, 16 Dec 2006 02:22:46 -0800, James Kanze a écrit:
Dans l'implémentation C++, je comptais me servir de tuples pour
stocker les combinaisons.
Par tuples, entends-tu boost::tuples, ou quelque chose maison ?
Je pensais à Boost, pour que les tuples soient typés. Sinon, si on
abandonne la typesafety, il y std::vector<boost::any>.
Il me semblait judicieux d'utiliser la structure la plus légère de
la STL pour stocker les tuples retenus, donc une liste doublement
chainée
Selon les opérations envisagées, vector ou deque pourrait être
nettement plus legers.
Instinctivement, j'évite vector quand je vais faire une tripotée d'aj out
sans savoir à l'avance la taille... Deque, par contre, serait bien.
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a
qu'une seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
Qui en a ajouté des tableaux, etc. Mais la structure dynamique de base
en Lisp, c'est bien une liste.
Il y un fossé entre « structure dynamique de base » et « seule
structure ».
Mais je me posais la question de savoir si c'est réalisable de fa çon
générique.
À quel niveau ? Jusqu'au niveau des types dans les tuples ?
Oui
Générique résolue à l'exécution, ou lors de la compilation ?
À la compilation.
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici
un code capable de s'adapter à un nombre inconnu (éventuellement
borné) d'éléments dans les tuples qui vont être produits, de types
inconnus à l'avance.
Lors de l'exécution, s'entend.
Non, à la compilation. C'est déjà assez compliqué comme ça. ;-)
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
Mais il faudrait savoir lequel lors de l'écriture du programme.
Non, justement. Je voudrais que le même code puisse être appelé ave c ces
deux déclarations. C'est là que la MPL entrait en action (et que je
déclarais forfait)...
Loin de moi l'idée de constuire un interpréteur Turing-complete p our
ça...
Même en C++, avec lex et yacc, ce n'est pas la fin du monde. Je le
fais souvent. Dans la mesure où le langage ne permet pas de structures
de boucles ou des sous-programmes, c'est ultra simple.
C'est vrai que je ne suis pas un habitué de ces outils.
Maintenant, s'il s'agit de manipuler des ensembles d'une dizaine
d'éléments, mettre en jeu toute une base de données, ce n'est
peut-être pas la solution la plus légère. (Mais s'il y a une base déjà
installée sur ta machine...)
Ça se discute, puisque les infos seront de toutes façon déjà dans une
base de données.
Reste que je veux pouvoir exprimer des contraintes
arbitrairement complexes.
D'un autre côté, Postgresql dispose d'un
PL/scheme, je devrais y trouver mon bonheur...
Le Sat, 16 Dec 2006 02:22:46 -0800, James Kanze a écrit:Dans l'implémentation C++, je comptais me servir de tuples pour
stocker les combinaisons.
Par tuples, entends-tu boost::tuples, ou quelque chose maison ?
Je pensais à Boost, pour que les tuples soient typés. Sinon, si on
abandonne la typesafety, il y std::vector<boost::any>.
Il me semblait judicieux d'utiliser la structure la plus légère de
la STL pour stocker les tuples retenus, donc une liste doublement
chainée
Selon les opérations envisagées, vector ou deque pourrait être
nettement plus legers.
Instinctivement, j'évite vector quand je vais faire une tripotée d'aj out
sans savoir à l'avance la taille... Deque, par contre, serait bien.
(Ce sont deux questions qui ne se posent pas en Lisp, qui n'a
qu'une seule structure de données, la liste.)
Le LISP de 1958, peut-être. Mais j'utilise Common Lisp...
Qui en a ajouté des tableaux, etc. Mais la structure dynamique de base
en Lisp, c'est bien une liste.
Il y un fossé entre « structure dynamique de base » et « seule
structure ».
Mais je me posais la question de savoir si c'est réalisable de fa çon
générique.
À quel niveau ? Jusqu'au niveau des types dans les tuples ?
OuiGénérique résolue à l'exécution, ou lors de la compilation ?
À la compilation.
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici
un code capable de s'adapter à un nombre inconnu (éventuellement
borné) d'éléments dans les tuples qui vont être produits, de types
inconnus à l'avance.
Lors de l'exécution, s'entend.
Non, à la compilation. C'est déjà assez compliqué comme ça. ;-)Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
Mais il faudrait savoir lequel lors de l'écriture du programme.
Non, justement. Je voudrais que le même code puisse être appelé ave c ces
deux déclarations. C'est là que la MPL entrait en action (et que je
déclarais forfait)...
Loin de moi l'idée de constuire un interpréteur Turing-complete p our
ça...
Même en C++, avec lex et yacc, ce n'est pas la fin du monde. Je le
fais souvent. Dans la mesure où le langage ne permet pas de structures
de boucles ou des sous-programmes, c'est ultra simple.
C'est vrai que je ne suis pas un habitué de ces outils.
Maintenant, s'il s'agit de manipuler des ensembles d'une dizaine
d'éléments, mettre en jeu toute une base de données, ce n'est
peut-être pas la solution la plus légère. (Mais s'il y a une base déjà
installée sur ta machine...)
Ça se discute, puisque les infos seront de toutes façon déjà dans une
base de données.
Reste que je veux pouvoir exprimer des contraintes
arbitrairement complexes.
D'un autre côté, Postgresql dispose d'un
PL/scheme, je devrais y trouver mon bonheur...
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici un
code capable de s'adapter à un nombre inconnu (éventuellement borné)
d'éléments dans les tuples qui vont être produits, de types inconnus à
l'avance.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici un
code capable de s'adapter à un nombre inconnu (éventuellement borné)
d'éléments dans les tuples qui vont être produits, de types inconnus à
l'avance.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;
C'est là qu'on tombe sur des problèmes de type. Il faut écrire ici un
code capable de s'adapter à un nombre inconnu (éventuellement borné)
d'éléments dans les tuples qui vont être produits, de types inconnus à
l'avance.
Je voudrais pouvoir l'utiliser ainsi :
TupleFactory<Client,Lot,Financement> tf1;
aussi bien que :
TupleFactory<int,int,double,float> tf2;