Gibt es eine stark typisierte Programmiersprache, mit der Sie neue Operatoren definieren können?

7

Ich bin derzeit auf der Suche nach einer Programmiersprache, in die ich einen Mathematikunterricht schreiben kann. Ich weiß, dass es überall sehr viele gibt, aber da ich im nächsten Semester Mathematik studieren werde, dachte ich, dass dies eine sein könnte gute Möglichkeit, einen tieferen Einblick in das zu bekommen, was ich gelernt habe.

Danke für Ihre Antworten.

BTW: Wenn Sie sich fragen, was ich fragen wollte:

"Gibt es eine stark typisierte Programmiersprache, mit der Sie neue Operatoren definieren können?"

    
niklasfi 26.07.2009, 12:53
quelle

13 Antworten

19

Wie Efraim sagte , macht Haskell das ziemlich einfach:

%Vor%

Sie können neue Infix-Operatoren (nur Symbole) mit einer Infix-Syntax definieren. Sie können dann verwenden Sie als Infix-Operatoren, oder schließen Sie sie in Parens ein, um sie als normale Funktion zu verwenden.

Sie können auch normale Funktionen (Buchstaben, Zahlen, Unterstriche und einfache Anführungszeichen) als Operatoren verwenden indem Sie sie in Backticks einschließen.

    
rampion 26.07.2009, 16:49
quelle
10

Nun, Sie können eine feste Menge von Operatoren in vielen Sprachen neu definieren, wie C ++ oder C# . Andere, wie F # oder Scala ermöglicht es Ihnen, sogar neue Operatoren zu definieren (sogar als Infix-Operatoren), die für mathematische Dinge noch netter sein könnten.

    
Joey 26.07.2009 12:55
quelle
9

Vielleicht Haskell? Ermöglicht die Definition beliebiger Infix-Operatoren.

    
EFraim 26.07.2009 12:54
quelle
8

Ted Neward schrieb eine Artikelserie über Scala, die auf Java-Entwickler abzielte, und er beendete das Ganze, indem er demonstrierte, wie man eine mathematische Domänensprache in Scala schreibt (die übrigens eine statisch typisierte Sprache ist)

Teil 1

Teil 2

Teil 3

    
skaffman 26.07.2009 13:01
quelle
3

In C ++ können Sie Operatoren definieren, die an anderen Klassen arbeiten, aber ich denke nicht an andere primitive Typen wie Ints, da sie keine Instanzmethoden haben können. Sie könnten entweder Ihre eigene Zahlenklasse in C ++ erstellen und ALLE Operatoren neu definieren, einschließlich + * etc.

Um neue Operatoren für primitive Typen zu erstellen, müssen Sie sich der funktionalen Programmierung zuwenden (es scheint von den anderen Antworten zu sein). Das ist in Ordnung, denken Sie daran, dass die funktionale Programmierung sich sehr von der OOP unterscheidet. Aber es wird eine große neue Herausforderung und funktionale Programmierung ist ideal für Mathematik, da es von Lambda Calc kommt. Das Lernen von funktionaler Programmierung bringt dir verschiedene Fähigkeiten bei und hilft dir sehr bei Mathematik und Programmierung im Allgemeinen. : D

viel Glück!

    
Gordon Gustafson 26.07.2009 13:07
quelle
2

Mit Eiffel können Sie neue Operatoren definieren.

Ссылка

    
clemahieu 26.07.2009 17:02
quelle
2

Wenn die Prozedur, die Sie auf die Argumente in einer Lisp-Kombination anwenden, als "Operator" bezeichnet wird, dann können Sie neue Operatoren definieren, bis die Kühe nach Hause kommen.

    
Nietzche-jou 26.07.2009 17:31
quelle
2

Ada unterstützt das Überschreiben von Infix-Operatoren: Hier finden Sie das Referenzhandbuch .

Leider können Sie keine eigenen neuen Operatoren erstellen, es scheint, Sie können nur die bestehenden außer Kraft setzen.

%Vor%

Ada ist keine sehr populäre Sprache, das muss man sagen, aber was das starke Tippen betrifft, kann man nicht viel stärker werden.

BEARBEITEN:

Eine andere Sprache, die noch nicht erwähnt wurde, ist D . Es ist auch eine stark typisierte Sprache und unterstützt das Überladen von Operatoren . Auch hier unterstützt es keine benutzerdefinierten Infix-Operatoren.

Von Ссылка

  

Warum nicht benutzerdefinierbare Operatoren zulassen?

     

Dies kann sehr nützlich sein, um neue Infix-Operationen an verschiedene Unicode-Symbole anzuhängen. Das Problem ist, dass in D die Token von der semantischen Analyse völlig unabhängig sein sollen. Benutzerdefinierbare Operatoren würden das brechen.

    
Mike Houston 26.07.2009 17:30
quelle
2

Sowohl ocaml als auch f # haben Infix-Operatoren. Sie haben einen speziellen Satz von Zeichen, die innerhalb ihrer Syntax erlaubt sind, aber beide können verwendet werden, um andere Symbole zu manipulieren, um eine beliebige Funktion zu verwenden (siehe ocaml Diskussion ).

    
nlucaroni 27.07.2009 13:27
quelle
1

Ich denke, Sie sollten wahrscheinlich genau darüber nachdenken, warum Sie diese Funktion verwenden möchten. Es scheint mir, dass es viel wichtigere Überlegungen gibt, wenn man eine Sprache wählt.

Ich denke nur an eine mögliche Bedeutung für das Wort "Operator" in diesem Zusammenhang, die nur syntaktischer Zucker für einen Funktionsaufruf ist, z.B. foo + bar würde als Aufruf in eine Funktion +(a, b) übersetzt werden.

Dies ist manchmal nützlich, aber nicht oft. Ich kann mir sehr wenige Fälle vorstellen, in denen ich einen Operator überladen / definiert habe.

Wie in den anderen Antworten erwähnt, können Sie mit Haskell neue Infix-Operatoren definieren. Eine rein funktionale Sprache mit fauler Bewertung kann jedoch ein bisschen wie ein Bissen sein. Ich würde SML wahrscheinlich über Haskell empfehlen, wenn Sie zum ersten Mal eine funktionale Sprache ausprobieren möchten. Das Typsystem ist ein bisschen einfacher, Sie können Nebenwirkungen verwenden und es ist nicht faul.

F # ist auch sehr interessant und bietet auch Maßeinheiten , welches AFAIK ist einzigartig in dieser Sprache. Wenn Sie das Feature benötigen, kann es von unschätzbarem Wert sein.

Von meinem Kopf her kann ich mir keine statisch getippten Imperativ-Sprachen mit Infix-Operatoren vorstellen, aber Sie könnten sowieso eine funktionale Sprache für die Mathematik-Programmierung verwenden, da es viel einfacher ist, Fakten über ein funktionales Programm zu beweisen .

Vielleicht möchten Sie auch eine kleine DSL erstellen, wenn Syntaxprobleme wie Infix-Operatoren für Sie so wichtig sind. Dann können Sie das Programm in der gewünschten Sprache schreiben und die Mathematik auf eine bequeme Weise spezifizieren.

    
Jørgen Fogh 26.07.2009 17:55
quelle
1

Was meinst du mit starker Typisierung? Meinst du statische Typisierung (wo alles einen Typ hat, der zur Kompilierungszeit bekannt ist, und Conversions sind eingeschränkt) oder starke Typisierung (alles hat einen zur Laufzeit bekannten Typ und Konvertierungen sind eingeschränkt)?

Ich würde mit Common Lisp gehen. Es hat tatsächlich keine Operatoren (zum Beispiel das Hinzufügen von a und b ist (+ a b) ), sondern Funktionen, die frei definiert werden können. Es ist stark typisierend, dass jedes Objekt einen bestimmten Typ hat, auch wenn es zur Kompilierzeit nicht bekannt sein kann und Conversions eingeschränkt sind. Es ist eine wirklich großartige Sprache für exploratives Programmieren, und es hört sich so an, als würden Sie das tun.

    
David Thornley 27.07.2009 14:09
quelle
1

Ruby does.

%Vor%     
Stefan Monov 28.07.2009 11:52
quelle
0

Sie können tatsächlich mit C # durch Überladen des Operators tun, was Sie brauchen.

Beispiel:

%Vor%

    
Alex 27.07.2009 13:33
quelle