14 Stimmen

Ist Mathematica eine untypisierte Sprache?

Im Gegensatz zu den meisten Programmiersprachen ist in Mathematica jeder Wert ein Ausdruck. Die Anwendung einer beliebigen Operation auf einen beliebigen Ausdruck führt immer zu einem anderen Ausdruck. Folglich gibt es in Mathematica eigentlich nur einen Typ. Mathematica führt keine statische Typprüfung durch und prüft Typen wohl nicht einmal dynamisch (zur Laufzeit).

Zum Beispiel, indem man den ganzzahligen Ausdruck 1 zu dem String-Ausdruck "foo" in Mathematica ergibt den (unsinnigen) Ausdruck 1 + "foo" aber kein Fehler. In anderen Fällen gibt Mathematica eine Rückmeldung über unsinnige Eingaben, aber die Prüfungen, die diese Rückmeldung erzeugen, müssen explizit vom Programmierer durchgeführt werden.

Ist es also fair, Mathematica als eine untypisierte Sprache zu bezeichnen, im Gegensatz zu einer statisch oder dynamisch typisierten Sprache?

7voto

WReach Punkte 17728

Wenn wir die Ausdrücke "statisch typisiert" und "dynamisch typisiert" als Jargon betrachten, der sich darauf bezieht, dass eine Sprache die Gültigkeit von Operationen gegen Typen prüft, dann denke ich, dass es fair ist, Mathematica mit dem Jargon "untypisiert" zu charakterisieren - in dem Sinne, dass es "nie" prüft, ob eine Operation für einen Typ gültig ist.

Mir gefällt jedoch Belisarius' Verwendung des Begriffs "typagnostisch". Ich sage dies, weil fast alle Typüberprüfungen in der Sprache idiomatisch sind (d.h. vom Programmierer und nicht von der Sprache implementiert), so auch das Konzept der Anwendung eines Operators auf typisierte Operanden!

Nehmen wir das "unsinnige" Beispiel von 1 + "foo" . Ich denke, man kann mit Fug und Recht behaupten, dass ein signifikanter Anteil aller Mathematica-Benutzer beim Erlernen der Sprache über Fälle wie diesen stolpert (fast die Hälfte). Das Problem wird besonders deutlich, wenn man Code im Stil von z.B. C schreibt. In Mathematica-Kreisen wird viel darüber diskutiert, wie man mit solchen Situationen umgehen soll.

Andererseits ist diese Schwäche auch die größte Stärke von Mathematica. Mathematica ist für die Erstellung neuer Notationen optimiert. Viele, viele Notationen haben das Konzept der + die sich sehr ähnlich verhält wie die Addition in der Grundrechenart. Beim Aufbau einer solchen Notation wäre es sehr unangenehm, wenn Mathematica sich einmischen und beanstanden würde, dass die Operanden zu + waren keine Zahlen. In einer solchen übergeordneten Anwendung von Mathematica ist das "unsinnige" Beispiel nicht nur "sinnvoll", sondern sogar entscheidend.

In diesem Sinne ist die Frage nach dem Typ häufig überflüssig. Daher mag ich Belisarius ' "typ-agnostische" Charakterisierung. Upvote ihn, ich habe ;)

Editer

Ich werde versuchen zu verdeutlichen, was ich im Sinn hatte, als ich zwischen "untypisiert" und "typagnostisch" unterschied.

Beim Lesen der verschiedenen Antworten und Kommentare habe ich versucht herauszufinden, was der Unterschied zwischen Mathematica und LISP ist. Letzteres wird im Allgemeinen als Beispiel für "dynamisch typisiert" angeführt, obwohl der LISP-Kernauswerter sehr ähnlich wie Mathematica ist und kaum eine Typüberprüfung durchführt. Die Typfehler, die wir in LISP-Programmen sehen, werden meist durch hart kodierte Prüfungen in (typischerweise eingebauten) Funktionen verursacht. + akzeptiert beispielsweise nur numerische Argumente, obwohl es dem Auswerter selbst völlig gleichgültig ist, ob es sich um eine oder eine andere Variante handelt. Abgesehen davon unterscheidet sich das "Gefühl" der Programmierung in LISP stark von dem "Gefühl" von Mathematica (zumindest für mich). Die 1 + "foo" Beispiel macht diesen Unterschied deutlich.

Ich stimme zwar im Großen und Ganzen mit "untyped" als Charakterisierung von Mathematica überein, hatte aber dennoch das Gefühl, dass etwas fehlt. Assembler scheint mir untypisiert zu sein, ebenso wie das frühe FORTRAN und das prä-ANSI C. In diesen Fällen war das Bitmuster der Argumente alles, was zählte, und die Programme machten munter weiter, wenn ich ein String-Argument übergab, wo eine ganze Zahl benötigt wurde. Mathematica hat dieses untypisierte Verhalten mit Sicherheit. Aber es gibt einen Unterschied: In Assembler, FORTRAN und C ist es extrem selten, dass diese fehlende Typüberprüfung zu einem guten Ergebnis führt. Wie ich bereits erwähnt habe, ist es in Mathematica möglich und manchmal sogar üblich, sich auf diese Art von Verhalten zu verlassen.

Geben Sie "typ-agnostisch" ein. Ich mochte seine unverbindliche Haltung, die weniger drastisch klang als "untyped". Ich hatte das Gefühl, dass es die im Wesentlichen untypisierte Natur von Mathematica widerspiegelt, aber einen gewissen Spielraum für die Sprachfunktionen lässt, die eine idiomatische Typüberprüfung im dynamischen LISP-Stil unterstützen (z.B. das "head"-Idiom und unterstützende Funktionen).

Kurzum, ich habe das Gefühl, dass Mathematica zwischen völlig untypisiert und dynamisch typisiert schwankt. "Type-agnostic" fängt dieses Gefühl für mich ein. YMMV :)

Ich gebe bereitwillig zu, dass niemand etwas von dem, was ich in dieser Antwort geschrieben habe, einfach aus der Inspektion der Ausdrücke "untyped" und "type-agnostic" rekonstruieren kann. Ich betone nochmals, dass ich denke, dass "untyped" eine faire Charakterisierung von Mathematica ist, aber ich mag auch die Tatsache, dass "type-agnostic" viele der Fragen aufwirft, die in den verschiedenen Antworten auf diese SO-Frage angesprochen werden.

5voto

arsenm Punkte 2853

Mathematica hat einige Typen, und es ist dynamisch. Sie haben die Typen String , Integer , Real , Complex , List y Symbol . Sie können Funktionen erstellen, die nur auf einen Typ wirken, indem Sie etwas wie folgt tun

f[x_Integer]:=x+1

um eine Funktion zu erstellen, die nur mit ganzen Zahlen arbeitet.

Mathematica basiert in hohem Maße auf Mustern und Substitutionen; die Typen scheinen mir immer eine weitere Möglichkeit zu sein, Ihnen bei der Entwicklung von Mustern zu helfen. Im Fall von 1 + "foo" gibt es kein Muster für die Auswertung einer zu einer Zeichenkette hinzugefügten Zahl, so dass das Ergebnis nur der Ausdruck selbst ist. Im Fall von 1 + 2 gibt es ein Muster, um die Zahlen zu addieren, und es wird ausgewertet. Die Muster und Substitutionsregeln von Mathematica können viel komplexer sein, und es ist am besten, ein Buch zu lesen, wenn Sie daran interessiert sind.

5voto

Dr. belisarius Punkte 59702

Mehr von der praktischen als von der theoretischen Seite her kann man wohl sagen, dass Mathematica eher typagnostisch als untypisiert ist.

Außerdem kann man leicht eine typisierte Untersprache konstruieren, indem man Dinge wie (es folgt ein sehr einfaches Beispiel) verwendet:

Unprotect[Set]; 

Set[a, x_] := If[Element[x, Integers], x, 0, 0];  

und dann versuchen:

a = 1; (*runs ok*) 

y

a = "caca"  (*assigns zero to a*)

Editer

Außerdem können Sie benutzerdefinierte Typen als benannte Muster konstruieren und sie bei der Neudefinition von Satz anstelle von Ganzzahlen.
Die Schriftgestaltung sollte auf die gleiche Weise funktionieren.

4voto

Samsdram Punkte 1605

Die kurze Antwort: Untypisiert oder typlos. So beschreibt Wolfram Research das Produkt selbst. Siehe hier.

Lange Antwort: Jon, ich denke, Ihre Frage hängt wirklich davon ab, was Sie mit "untypisiert" meinen. Um an die endgültige Ressource zu appellieren, die ist Wikipedia "Im Gegensatz dazu erlaubt eine untypisierte Sprache, wie die meisten Assemblersprachen, die Durchführung beliebiger Operationen mit beliebigen Daten, die im Allgemeinen als Folgen von Bits unterschiedlicher Länge betrachtet werden.

Wenn man die früheren Antworten liest, scheint der Kern der Debatte zu sein, was ein Typprüfprogramm tun sollte, wenn es auf einen Fehler stößt. Die übliche Antwort ist, die Auswertung zu STOPPEN und eine Art Fehler zu melden. Aus mehreren früheren Fragen (1) y (2) auf Stackoverflow, können wir sehen, dass es keine elegante Möglichkeit gibt, dies in Mathematica zu tun. (Ich würde den Vorbehalt hinzufügen, dass es mit der stärkeren Betonung der Kompilierung nach C in Version 8 möglich ist, typgeprüften Code zu schreiben, aber ich bin mir nicht sicher, ob dies als Teil der Hauptsprache gezählt werden sollte).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X