kann das eigentlich keine andere Programmiersprache?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

kann das eigentlich keine andere Programmiersprache?

Beitrag von BeS » 09.12.2005 20:21:08

Hallo,
in Ada95 kann ich eigene Typen auf der Basis von vorhandenen Typen deklarieren.
Zum Beispiel:
type meter is new float;
oder
subtype geburtsjahr is integer range 1900..integer'last;

Ist sowas in irgendeiner anderen Sprachen möglich? In C, C++, Java und C# konnte ich bisher nichts vergleichbares finden. Will aber auch nicht ausschließen, dass ich was übersehen habe.

Kennt jemand eine Sprache außer Ada95 wo dies möglich ist?
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 09.12.2005 20:34:08

Hallo,

da java objektorientiert ist (und c++ natürlich auch) kannst du beliebige typen mit beliebigen eigenschaften und methoden erzeugen.
sogar sooo beliebig, daß man sie objekte nennt ;)
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 09.12.2005 20:36:12

Hallo finupsen,
ich will aber keine "komplizierten" Klassen oder Strukturen sondern ganz einfache eigene Datentypen. Das geht ja afaik mit deinem Ansatz nicht.
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
finupsen
Beiträge: 1327
Registriert: 21.04.2004 20:07:05
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Dortmund
Kontaktdaten:

Beitrag von finupsen » 09.12.2005 20:47:52

Ja , das stimmt wenn wir über primitive datentypen sprechen.
Aber da es die möglichkeit gibt aus prototypen ein objekt zuerzeugen ,
ist deine forderung eigentlich hinfällig.
Du kannst ja ein objekt erzeugen , das die selben eigenschaften wie ein
primitiver datentyp hat.
Niemand hat vor eine zentrale Datensammelbehörde aufzubauen. Es handelt sich vielmehr um dezentrale IT-Systeme die miteinander vernetzt werden.
... und Wasser ist naß.

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 09.12.2005 20:56:36

finupsen hat geschrieben: Du kannst ja ein objekt erzeugen , das die selben eigenschaften wie ein
primitiver datentyp hat.
jein.
Ich kann natürlich eine Klasse Meter mit der Variable value erstellen. Dann muß ich aber immer mit foo.value darauf zugreifen und nicht einfach mit foo wie bei einem einfachen Datentyp und Eingränzungen wie beim zweiten Beispiel sind auch nicht möglich.
Dazu kommt, dass bei java afaik jede instanz einer Klasse auf den heap kommt, was bei vielen Variablen dieses types natürlich nicht unbedingt optimal ist, da wäre ein einfacher Datentyp welcher auf den stack kann deutlich besser.
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 09.12.2005 20:56:37

also etwas so "schönes" wie subtype kannte ich bis jetzt noch nicht, das habe ich noch in keiner sprache gesehen. zumindest nicht auf so einfache art und weise. klar, du kannst dir wie schon gesagt einen eigenen typ mittels vererbung definieren oder auch aliase setzen (in c z.b. einen typ "meineKleineZahl" als short int setzen (wie in deinem ersten beispiel), aber etwas wie subtype kenne ich auch nicht..
mfg
mauser

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 09.12.2005 21:05:44

mauser hat geschrieben:zumindest nicht auf so einfache art und weise. klar, du kannst dir wie schon gesagt einen eigenen typ mittels vererbung definieren oder auch aliase setzen (in c z.b. einen typ "meineKleineZahl" als short int setzen (wie in deinem ersten beispiel), aber etwas wie subtype kenne ich auch nicht..
ok, in C gibt es
typedef int meter;
typedef int foot;

aber das ist bei C nur "syntactic sugar", da ich z.B. bei diesem Beispiel weiterhin "foot" und "meter" miteinander verrechnen kann und z.B. auch "meter" an eine Funktion die "foot" erwartet übergeben kann. Das schöne an Ada95 ist, dass ich so mit einer sauberen Deklaration von vornherein dumme Fehler verhindern kann, da Ada dann eben nichtmehr so einfach "foot" und "meter" miteinander verrechnet.

Eigentlich ein ganz einfacher Mechanismus um Programme übersichtlicher und sicherer zu machen, aber es scheint (fast) keine Sprache neben Ada95 zu geben die einem dieses Möglichkeit gibt.
Zuletzt geändert von BeS am 09.12.2005 21:07:06, insgesamt 1-mal geändert.
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
ruwen
Beiträge: 389
Registriert: 06.04.2003 18:37:25

Re: kann das eigentlich keine andere Programmiersprache?

Beitrag von ruwen » 09.12.2005 21:06:54

BeS hat geschrieben:Hallo,
in Ada95 kann ich eigene Typen auf der Basis von vorhandenen Typen deklarieren.
Kennt jemand eine Sprache außer Ada95 wo dies möglich ist?
Moin,
also für dein zweites Beispiel passen meine Beispiele nicht.

Aber man in Turbo Pascal mit dem Record Befehl einen neuen Datentyp erstellen, der aus bisherigen besteht.

Zum Beispiel

Code: Alles auswählen

TYPE Tkarteikarte = RECORD
                      name   : STRING[20];
                      lk     : STRING[3];
                      punkte : INTEGER
                    END;

VAR schuelerdb : Tkarteikarte;
Ansonsten kann man bei Cobol mit den Stufennummern viel machen.
zb (X=alphanumerisch | 9 = nummerisch):

Code: Alles auswählen

01 meinlinux.
   05 distri                     PIC X(6).
   05 version                 PIC 9(2).
Man könnte ein String nach distri packen und ne Zahl nach Version. Wenn man auf meinlinux zugreift, hat man dann beides.
Wenn könnte auch "Debian31" nach meinlinux packen und kann sich dann Version ausgeben lassen.

Außerdem kann ich in Cobol ein Feld redifinieren. Dann kann man ein Feld als String oder als Zahl anfassen.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 18.12.2005 02:00:58

Python kann das, allerdings geht das dort etwas anders, da Python weakly typed ist, d.h. nicht Variablen haben einen Typ, sondern Werte.
Beispiel:

Code: Alles auswählen

class Foo(object):
  def __setattr__(self,name,value):
    if name == "x":
      if 0<x<10:
        object.__setattr__(self,name,value)
      else:
        raise ValueError,"value must be between 0 and 10"
Jetzt kann x nur Werte zwischen 0 und 10 annehmen. Man kann auch mittels Metaclassen neue Typen definieren, die bestimmte Bedingungen erfüllen. Man müsste dann natürlich schreiben

Code: Alles auswählen

foobar.x = MeinTyp(42)
da "x" ja keinen Typ hat.

Wenn man das ganze wirklich nutzt, würde man natürlich Metaclassen definieren.
Kurz gesagt: es geht, und zwar noch eleganter als hier beschrieben, aber ich wollte jetzt nicht den Metaclassenhammer rausholen :wink:

Antworten