Je cherche actuellement un langage de programmation pour écrire une classe de mathématiques. Je sais qu'il y a beaucoup d'entre eux partout, mais comme je vais commencer à étudier les mathématiques suivant, je pensais que cela pourrait être un bon moyen d'obtenir une idée plus profonde de ce que j'ai appris. p>
Merci pour vos réponses. P>
BTW: Si vous vous demandez ce que je voulais demander: p>
"Y a-t-il un langage de programmation fortement typé qui vous permet de définir de nouveaux opérateurs?" P>
13 Réponses :
Peut-être haskell? Vous permet de définir des opérateurs infixsieurs arbitraires. P>
en C ++, vous pouvez définir des opérateurs qui fonctionnent sur d'autres classes, mais je ne pense pas aux autres types primitifs comme des INT, car ils ne peuvent pas avoir de méthodes d'instance. Vous pouvez soit créer votre propre classe de numéro en C ++ et redéfinir tous les opérateurs, y compris + * etc. p>
Pour faire de nouveaux opérateurs sur des types primitifs, vous devez passer à la programmation fonctionnelle (semble des autres réponses). C'est bon, gardez simplement à l'esprit que la programmation fonctionnelle est très différente de l'OOP. Mais ce sera un excellent défi et une programmation fonctionnelle est idéal pour les mathématiques, car il vient de Lambda Calc. L'apprentissage de la programmation fonctionnelle vous apprendra des compétences différentes et vous aidera considérablement avec les mathématiques et la programmation en général. : D p>
bonne chance! p>
Comme Efraimam a déclaré , Haskell rend cette assez simple: Vous pouvez définir de nouveaux opérateurs infixes (symboles uniquement) à l'aide d'une syntaxe d'infixe. Vous pouvez ensuite utiliser
comme des opérateurs d'infixe, ou les joignez-les dans des parens pour les utiliser comme une fonction normale. P> Vous pouvez également utiliser des fonctions normales (lettres, chiffres, sous-traitants et citations unique) en tant qu'opérateurs
en les enfermant dans des backtsks. p> p>
Est-ce que cela vous permet-il de bricoler avec la priorité?
Ouais! Utilisez infixr code> et
infixl code>: zvon.org/other/haskell/OutputSyntax/...
ADA a la prise en charge des opérateurs d'infixe primordiaux: Voici le Manuel de référence Chapitre .
Malheureusement, vous ne pouvez pas créer vos propres nouveaux opérateurs, il semble que vous ne pouvez plus remplacer les utilisateurs existants. P>
type wobble is new integer range 23..89; function "+" (A, B: wobble) return wobble is begin ... end "+";
Dans la mesure où la procédure que vous appliquez sur les arguments d'une combinaison LISP s'appelle un "opérateur", puis oui, vous pouvez définir de nouveaux opérateurs jusqu'à ce que les vaches rentrent chez les vaches. P>
Je pense que vous devriez probablement penser profondément sur la raison pour laquelle vous souhaitez utiliser cette fonctionnalité. Il me semble qu'il y a des considérations beaucoup plus importantes lors du choix d'une langue. P>
Je ne peux que penser à une seule signification possible pour le mot "opérateur" dans ce contexte, qui est juste du sucre syntaxique pour un appel de la fonction, par ex. Ceci est parfois utile, mais pas souvent. Je peux penser à très peu d'instances où j'ai surchargé / défini un opérateur. P>
Comme indiqué dans les autres réponses, Haskell vous permet de définir de nouveaux opérateurs d'infixes. Cependant, une langue purement fonctionnelle avec une évaluation paresseuse peut être un peu une bouchée. Je recommanderais probablement SML sur Haskell, si vous avez envie d'essayer une langue fonctionnelle pour la première fois. Le système de type est un peu plus simple, vous pouvez utiliser des effets secondaires et ce n'est pas paresseux. P>
f # est également très intéressant et fonctionnent également Unités de Mesurer , que Afaik est unique à cette langue. Si vous avez besoin de la fonctionnalité, cela peut être inestimable. P>
Sur le dessus de ma tête, je ne peux penser à aucune langue impérative typée de manière statique avec les opérateurs d'infixe, mais vous voudrez peut-être utiliser une langue fonctionnelle pour la programmation mathématique, car il est beaucoup plus facile de prouver des faits sur un programme fonctionnel . p>
Vous pouvez également créer une petite DSL si des problèmes de syntaxe tels que les opérateurs d'infixes sont si importants pour vous. Ensuite, vous pouvez écrire le programme dans n'importe quelle langue souhaitée et spécifier toujours le calcul de manière pratique. P> FOO + BAR CODE> serait traduit par appel à une fonction
+ (a, b) code>. p>.
La bibliothèque C ++ Boost "Unités" fournit une analyse dimensionnelle du temps de compilation similaire à celle des unités de mesure F #.
ecaml et F # avoir des opérateurs infixsieurs. Ils ont un ensemble spécial de caractères autorisés dans leur syntaxe, mais les deux peuvent être utilisés pour manipuler d'autres symboles pour utiliser n'importe quel infixe de fonction (voir le Discussion OCAML ). P>
Vous pouvez réellement faire ce dont vous avez besoin avec C # par surcharge de l'opérateur.
Exemple:
p> p> code> p>
Ouais, c'est vrai, mais vous ne pouvez pas définir de nouveaux opérateurs, de sorte que vous êtes limité à +, -, *, /, les opérateurs de comparaison et d'autres autres. Mais que se passe-t-il si vous avez deux ensembles et que vous voulez obtenir l'union des deux? Si vous devez vraiment aller et définir une fonction statique set.Union (SETA, SETB)?
Que voulez-vous dire par une frappe forte? Voulez-vous dire le typage statique (où tout a un type connu au moment de la compilation, et les conversions sont restreintes) ou une tape forte (tout a un type connu au moment de l'exécution et les conversions sont restreintes)? P>
J'irais avec des Lisp communs. Il n'a pas vraiment d'opérateurs (par exemple, l'ajout d'A et B est (+ a b) code>), mais plutôt des fonctions, qui peuvent être définies librement. Il a une frappe forte dans ce que chaque objet a un type définitif, même s'il ne peut pas être connu au moment de la compilation, et les conversions sont restreintes. C'est une langue vraiment grande pour la programmation exploratoire et cela ressemble à c'est ce que vous allez faire. P>
«Opérateur» est un terme assez bien défini.