PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Scheme] - und generelle Hilfe gebraucht!


radi
2005-10-31, 10:14:43
Servus!

Studier zur Zeit "Computational Engineering" an der TU-Darmstadt und in Informatik fangen wir mit "Scheme" an.

Da ich noch nie zuvor programmiert hab find ich das Tempo schon ziemlich stramm :(

Koennt ihr tipps geben -egal ob für scheme oder generell- um einem Rookie da vielleicht das Programmieren etwas einleuchtender zu machen? Wär euch super dankbar! :)

Grüße,

radi

HellHorse
2005-10-31, 11:51:24
Scheme!!!!1111einself
Sinnvoll ist sicher, wenn du dir etwas wie DrScheme (http://www.plt-scheme.org/software/drscheme/) zulegst.
Einrücken ist sehr wichtig für die Leserlichkeit des Codes.

Ansonsten findest du hier mehr:
http://schemers.org/

Coda
2005-10-31, 14:04:26
Mein Beileid. Das hab ich zum Glück schon hinter mir....

Vor allem weil Scheme eine funktionale Sprache ist. Mir kann keiner erzählen dass das für Anfänger einfacher ist.

radi
2005-10-31, 18:49:34
Dr Scheme habe ich.

Naja werd mal die Übungen abwarten. Hoffe da lern ich wie ich an das programmieren rangehe weil das is mir irgendwie total fremd!

Coda
2005-10-31, 19:28:36
In Scheme zu programmieren ist auch für 99% aller Programmierer fremd.

Aqualon
2005-10-31, 19:47:54
In Scheme zu programmieren ist auch für 99% aller Programmierer fremd.
Wobei es wahrscheinlich einfacher ist, wenn man noch nicht vorversaut an Scheme rangeht. Und so schlimm ist es auch nicht, da fand ich Prolog übler.

@radi: leg dir am besten den Scheme-Interpreter zu, den ihr auch in der Uni verwendet, das spart viel Stress.

Aqua

Coda
2005-10-31, 20:51:37
@radi: leg dir am besten den Scheme-Interpreter zu, den ihr auch in der Uni verwendet, das spart viel Stress.Gerade bei Scheme sollte es doch eigentlich kaum Unterschiede zwischen den Versionen geben dachte ich.

Aqualon
2005-10-31, 21:21:31
Gerade bei Scheme sollte es doch eigentlich kaum Unterschiede zwischen den Versionen geben dachte ich.
Leider nicht ganz. Beispiel:
(define (dbp x y z)
(string-append
(begin (set! x y) (string-append "x=" x)) ", "
(begin (set! y z) (string-append "y=" y)) ", "
(begin (set! z x) (string-append "z=" z))))
(dbp "3" "2" "1")Da kommen STklos und MIT Scheme auf andere Ergebnisse, weil die Reihenfolge, in der die set! abgearbeitet werden unterschiedlich ist.

Ob es auch noch andere Unterschiede gibt bzw. woran das liegt, weiß ich auch nicht, war mir dann aber auch egal ;)

Aqua

Coda
2005-10-31, 21:31:00
Öh, wurde da die BNF nicht eindeutig geschrieben oder wie?

Trap
2005-10-31, 21:58:29
Öh, wurde da die BNF nicht eindeutig geschrieben oder wie?
BNF ist bei Sprachen die auf s-expressions basieren trivial...

Nein, Scheme ist doch die "ich hab die kleinste Sprachspezifikation"-Angebersprache und deshalb ist die Auswertungsreihenfolge innerhalb der Funktionsparameter nicht spezifiziert. In C ist es ähnlich (siehe sequence-points).

Nebenwirkungen in Ausdrücken die als Funktionsparameter verwendet werden sollte man daher vermeiden (sollte man sonst auch).

Mein Beileid. Das hab ich zum Glück schon hinter mir....
Vor allem weil Scheme eine funktionale Sprache ist.
Offensichtlich ohne jegliche Auswirkungen, du hast nichtmal mitbekommen das Scheme nicht funktional ist... (siehe set!)

Scheme hat eine ungewöhnliche Syntax (bzw hat eigentlich keine Syntax), sonst ist es wenig anders als die verbreiteten andere Sprachen. (Closure ~ anonyme Klasse in Java, Funktion als Wert übergeben ~ Funktionsobjekt übergeben)

Haskell oder ML wären funktionale Sprachen im engen Sinn.



@radi:
Leg dir unbedingt irgendein Programm zu, dass beim Eintippen von Code die zusammengehörigen Klammern markiert und automatisch den Code einrückt. Bzw. den Code auf Tastendruck neu richtig einrückt.

Der Rest ist Übungssache. Achso, ich studier auch an der TUD, hab allerdings im Moment keine Zeit (hab mir meinen Stundenplan bis oben vollgeladen und muss noch für http://icpc.baylor.edu/icpc/Regionals/NWERC05/ trainieren).

HellHorse
2005-10-31, 22:09:11
Trap, wir müssen dagegen halten, die Ungläubigen wollen nicht einsehen, dass Scheme regelt. :P

Vor allem weil Scheme eine funktionale Sprache ist. Mir kann keiner erzählen dass das für Anfänger einfacher ist.
Ja, aber nicht pur funktional wie Haskell. Du hast Nebeneffekte.

IMHO ist es deutlich einfach zu lernen als C. (funktionsname argument1 .... argumentN), das war's dann auch schon. Die ganze Spec ist bloss 50 Seiten, bei anderen Sprachen ist das Inhaltsverzeichnis grösser. Bei C kommt auch nie jemand `C ist schwer zu lernen, lass es besser' sondern immer `Lerne C, das ist gut, das lernst du was richitg abgeht und so'.
In Scheme zu programmieren ist auch für 99% aller Programmierer fremd.
Ein guter Grund es zu ändern. Hier im Forum sieht's zum Glück besser aus.

Mad-Marty
2005-10-31, 22:42:33
Für eienn einstieg in OO programmierung schau dir mal Python (http://python.org) an.
Macht spass, ist einfach am anfang und trotzdem sehr komplex.
Es kann auch mehr als viele sprachen. z.B. Multivererbung.


Allerdings frage ich mich ob scheme überhaupt noch gebraucht wird ? ^^

http://swiss.csail.mit.edu/projects/scheme/

sieht auch irgendwie unprofessionell aus ;D


(define (dbp x y z)
(string-append
(begin (set! x y) (string-append "x=" x)) ", "
(begin (set! y z) (string-append "y=" y)) ", "
(begin (set! z x) (string-append "z=" z))))
(dbp "3" "2" "1")


Boah ist das pervers, da dreht sich mir mein Python / C++ / Java Hirn weg ...
ihhhhhhh

(Ich hab keine ahnung was das ding da tut ....
rateversuch : string X Y Z zusammenfügen ? )

Auch kann ich mir in keinster weise vorstellen wozu man sowas brauchen könnte ? Was kann Scheme besonders gut ????

radi
2005-11-01, 09:21:36
Also ich hab dieses DrScheme, das wird auch in der UNI verwendet. obs den text selbst einrückt weiß ich net, glaub aber nicht, aber das mit den klammern machts. das is praktisch und man quasi keine vergessen zu schließen.

Aqualon
2005-11-01, 10:54:27
Boah ist das pervers, da dreht sich mir mein Python / C++ / Java Hirn weg ...Als erster Hinweis, das ist ne Klausuraufgabe gewesen, also möglicherweise nicht unbedingt ein Beispiel für schönen Scheme-Code ;)

Der Code ist eigentlich relativ einfach. Man ruf dbp mit 3 Parametern auf (in diesem Fall 3, 2 und 1). Diese werden dann über das set! den Variablen x, y und z zugewiesen, die Strings "x= 2", usw. erzeugt und daraus nochmal ein String gebildet.

Ergebnis: x=2, y=1, z=3 (bei STklos und DrScheme)

MIT-Scheme meint dazu: x=3, y=3, z=3

Aqua

Coda
2005-11-01, 15:30:52
Offensichtlich ohne jegliche Auswirkungen, du hast nichtmal mitbekommen das Scheme nicht funktional ist... (siehe set!)Doch das habe ich schon mitbekommen, aber die Sprache gehört für mich trotzdem zu den funktionalen.

Scheme hat eine ungewöhnliche Syntax (bzw hat eigentlich keine Syntax)Wie LISP eben - ist mir bekannt.

Haskell oder ML wären funktionale Sprachen im engen Sinn.Ja.

Ein guter Grund es zu ändern. Hier im Forum sieht's zum Glück besser aus.Ich kann Scheme ja wenn ich will, aber ich bin einfach zu imperativ-verseucht.

Ich habe allerdings den großartigen Vorteil von funktionalen Sprachen noch nicht erkannt. Vielleicht kommt der Tag ja noch ;)

Trap
2005-11-01, 17:39:08
Sauber formatiert sieht der Code so aus:
(define (dbp x y z)
(string-append
(begin
(set! x y) (string-append "x=" x))
", "
(begin
(set! y z) (string-append "y=" y))
", "
(begin
(set! z x) (string-append "z=" z))))
string-append wird mit 5 Parametern aufgerufen, davon sind 3 Blöcke mit Zuweisungen. Innerhalb jedes Blocks ist die Auswertungsreihenfolge festgeschrieben, die Reihenfolge der Parameterauswertung allerdings nicht.

Als Prüfungsfrage besonders ungeeignet, da nicht definiert. (siehe http://swiss.csail.mit.edu/~jaffer/r5rs_6.html#SEC28)

Lisp oder Scheme sind nicht besonders gut zur funktionalen Programmierung geeignet (im Vergleich zu Haskell oder ML), wer versucht funktionale Programmierung mit Lisp/Scheme zu machen wird von beidem enttäuscht sein. Das ist so wie mit C objektorientierte Programmierung zu machen. Geht, ist aber eklig.

Was man mit Lisp gut machen kann? Lisp programmiert sich ähnlich wie Python (sehr dynamisch und interaktiv), ist aber von der Performance viel besser (zwischen Java und C++ in vielen Fällen).
Ein ganz nettes Beispiel: hello-world.mov auf http://lwn.net/Articles/145698/

radi
2005-11-01, 17:41:40
Ist ja schön, dass ihr hier so am Fachsimpeln seid, aber bringt mich net wirklich weiter :)

Jemand Lernstrategien an der Hand oder Links zu tutorials oder Buchempfehlungen oder irgendwas, was einen Anfänger hilft?

Danke euch,

radi

Trap
2005-11-01, 17:55:43
Wenn du mit Englisch keine Probleme hast könntest du http://swiss.csail.mit.edu/~jaffer/r5rs_toc.html lesen. Das ist zu großen Teilen verständlich geschrieben und mit etwa 50 Seiten nicht allzu viel.

Je nachdem ob du eher aus Beispielen oder aus abstrakter Beschreibung lernen kannst kann das verständlicher als die Vorlesung sein.

Sonst kenn ich mich mit Scheme Zeug nicht so gut aus, ich bin eher an Common Lisp interessiert...

Aqualon
2005-11-01, 18:02:11
Oder wenn es etwas mehr sein darf: http://mitpress.mit.edu/sicp/

Aqua

Matti
2005-11-01, 19:02:00
Scheme ist imo eine Write-Only-Sprache ;) ...man kann zwar was damit machen, aber fremden Scheme-Code verstehen ist fast unmöglich.

@Thread-Starter
Wenn du noch nie programmiert hast und (sinnvollerweise) gleich was praxis-nahes machen willst, könnte ich dir folgendes empfehlen:
C/C++: sehr weit verbreitet
VB: auch weit verbreitet und für den Einstieg sicherlich einfacher als C
Delphi: imo noch einfacher als VB, aber nicht ganz so weit verbreitet
Bei allen 3 Sprachen würde ich dir aber empfehlen, erst mal mit Konsolen-Programmen anzufangen.
Java ist zwar auch sehr weit verbreitet, aber für'n Einstieg isses imo ungeeignet.

Um deine i*i*t*s*h* Scheme-Veranstaltung kommste zwar nicht herum, aber wenn ihr an der Uni nichts praxis-taugliches lernt, solltest du eben einen Teil deiner Freizeit dafür opfern.

Mad-Marty
2005-11-01, 19:20:13
Sauber formatiert sieht der Code so aus:
Was man mit Lisp gut machen kann? Lisp programmiert sich ähnlich wie Python (sehr dynamisch und interaktiv), ist aber von der Performance viel besser (zwischen Java und C++ in vielen Fällen).
Ein ganz nettes Beispiel: hello-world.mov auf http://lwn.net/Articles/145698/


Da hab ich aber ernste zweiffel daran ....
Das es wie Python sein soll, nach diesem string-append geraffel da oben schliess ich schonmal aus.
Python Klassen sind praktisch ein mittelding zwischen Java und C++ Klassen.

Obs schneller ist ist auch so eine frage ...
müsste man zuallererst noch klären ob Python Backend, Python mit Psyco ( JIT), Python als normale VM/ Bytecodemachine ....

Wer hat lust auf den grossen Language Speedcheck ? *grin*

Nein, ehrlich, da ich das erst vor kurzen mit vielen aktuellen sprachen gemacht habe, kann ich mal behaupten das es möglich ist Python auf fast - C speed zu bringen, in dem fall gleichauf mit Java.

Auch ist Java keinesfalls so langsam, es ist nur RAM gierig in erster linie.

Matti
2005-11-01, 19:26:45
Wer hat lust auf den grossen Language Speedcheck ? *grin*

Es kommt nicht auf die Sprache an, sondern auf den Compiler/Interpreter. Vergleich einfach mal den MS-C-Compiler mit dem Intel-C-Compiler...

Coda
2005-11-01, 19:27:52
Der von .NET 2005 ist gar nicht mehr so schlecht. Vor allem wird da der generierte SSE/SSE2 Code auch für AMD-CPUs zugänglich gemacht *hust*

Aber ein guter Profiler ist eh wichtiger als ein hochoptimierender Compiler. Meist sind die Algorithmen das Problem.

Mad-Marty
2005-11-01, 19:29:39
Es kommt nicht auf die Sprache an, sondern auf den Compiler/Interpreter. Vergleich einfach mal den MS-C-Compiler mit dem Intel-C-Compiler...

Stimmt, aber wenn ich von "der sprache" rede meine ich jeweils das normale.
Das es tausend möglichkeiten gibt etwas zu erreichen und dazu noch unmengen compiler überall ist klar.

Java gibts auch mehrere implementierungen ... trotzdem nehmen 99 % SUN.


@ Coda : Ja, selbst die beta war schon unheimlich schnell beim .NET 2 code.

Coda
2005-11-01, 19:32:05
Ich meinte die native x86-Codegeneration.

HellHorse
2005-11-01, 19:50:57
Es kann auch mehr als viele sprachen. z.B. Multivererbung.
Mehrfachvererbung ist einer der Punkte, die am meisten gegen Python sprechen. Sogar in der Doku wird davon abgeraten, es zu verwenden. Und das Schlimmste ist, Mehrfachvererbung in Python führt dazu, dass es kein super gibt. Ok, es gibt die Klasse `super' aber das ist ein Hack hässlicher als die Nacht.

Und dann noch die Metaklassen Geschichte. Statische Methoden, Klassenmethoden und Metamethoden. Wo liegen doch gleich noch mal die Unterschiede?
Und vom Mixen von Metaklassen und Mehrfachvererbung wollen wir gar nicht anfangen.

Nichts gegen Python, aber es hat ein paar sehr hässliche Stellen, Mehrfachvererbung ist eine davon.

Nein, ehrlich, da ich das erst vor kurzen mit vielen aktuellen sprachen gemacht habe, kann ich mal behaupten das es möglich ist Python auf fast - C speed zu bringen, in dem fall gleichauf mit Java.
Mit der default VM? Solange du auf den internen Datentpyen wie list und map arbeitest sicher. Bloss sind die halt nicht in Python sondern C implementiert. Und dass man mit C auf die Geschwindigkeit von C kommt, leuchtet noch ein.

Zudem unterstützen viele backends wie z.B. IronPython bloss ein Subset von Python.

Wenn du noch nie programmiert hast und (sinnvollerweise) gleich was praxis-nahes machen willst, könnte ich dir folgendes empfehlen:
C/C++: sehr weit verbreitet
....
Java ist zwar auch sehr weit verbreitet, aber für'n Einstieg isses imo ungeeignet.
Ja nee ist, klar. C/C++ ist für Anfänger geeignet, aber Java nicht. Alles klar. :rolleyes:

Trap
2005-11-01, 21:06:05
Das es wie Python sein soll, nach diesem string-append geraffel da oben schliess ich schonmal aus.
Ähm, hast du meinen Text drunter nicht gelesen? Der Code sieht so hässlich aus, weil er auch inhaltlich so hässlich ist. So programmiert niemand der den Code nachher verwenden will.

Etwas ähnlich hässliches in Python wäre Klassenmember irgendwie durchzunummerieren und dann irgendwo anders im Code die Namen zu errechnen, mit passendem Prefix versehen und dann so abzurufen ;)

Guck dir einfach mal das von mir verlinkte Video an. Das ist allerdings Common Lisp nicht Scheme.

Zur Performance: http://shootout.alioth.debian.org/ hat einige Benchmarks, die Lisp-Lösungen sind allerdings weniger optimiert als Java oder C (wenn SBCL und CMUCL sich deutlich unterscheiden kann man die schnellere Lösung als Referenz nehmen, die Typ-Inference unterscheidet sich leicht und die meisten Lösungen sind nur auf einer Implementierung optimiert).

Psyco ist nicht dabei, wenn sich jemand die Mühe machen will, einfach gegen die C-Lösung benchen, dann kann man das ungefähr einordnen.

Matti
2005-11-01, 21:07:49
Ja nee ist, klar. C/C++ ist für Anfänger geeignet, aber Java nicht. Alles klar. :rolleyes:
Mit C kann man auch ohne OO anfangen, was für Einsteiger garantiert günstiger ist.
Wenn man mit Java einsteigt, muß man 2 Sachen gleichzeitig kapieren: 1. "normales" Programmieren mit Verzweigungen, Schleifen usw. und 2. was sind Objekte, Klassen und wie man sie nutzt.

HellHorse
2005-11-01, 21:49:13
Mit C kann man auch ohne OO anfangen, was für Einsteiger garantiert günstiger ist.
Wenn man mit Java einsteigt, muß man 2 Sachen gleichzeitig kapieren: 1. "normales" Programmieren mit Verzweigungen, Schleifen usw. und 2. was sind Objekte, Klassen und wie man sie nutzt.
So ein Unsinn. Es gibt Lehrbücher zu Java, die auch an Unis eingesetzt werden, die das Konzept der Klasse erst auf Seite 328 einführen (!!!111einself).
Du kannst problemlos Java wie C machen und Objekte als Structs anschauen.
Ok, du hast keine Pointerarithmetik, aber es ging ja um Zugänglichkeit für Einsteiger.

Und wenn ich mir anschaue, wie viele professionelle C/C++ Programmierer nicht schnallen, was ein String in C ist, dann sagt das doch einiges über die Einsteigerfreundlichkeit von C/C++ aus.

Matti
2005-11-01, 21:54:22
...gut, dann schreib mir mal ne ganz simple "Hallo Welt"-Anwendung mit Java, ohne Klasse und ohne Objekt...

Trap
2005-11-01, 22:07:15
...gut, dann schreib mir mal ne ganz simple "Hallo Welt"-Anwendung mit Java, ohne Klasse und ohne Objekt...
Ohne Objekt ist kein Problem, ohne Klasse schon, man kann es aber als "Text der da hinmuss und dessen Bedeutung unwichtig ist" einführen.

Ein Javaprogramm sieht so aus:
public class X{
//dein code hier
}

RoKo
2005-11-01, 22:40:20
Ohne Objekt ist kein Problem, ohne Klasse schon, man kann es aber als "Text der da hinmuss und dessen Bedeutung unwichtig ist" einführen.

Ein Javaprogramm sieht so aus:
public class X{
//dein code hier
}
An der hier so oft erwähnten TUD wurde in Inf1 sogar mal in den ersten zwei Monaten in Inf1 ein spezielles Mini-Java verwendet, um diese Problematik zu umgehen.
Ohne Objekt geht aber trotzdem nicht. System.out <- oh Schreck, ein Objekt :eek: Objekte zu benutzen ist allerdings das kleinere Problem ;)

Mad-Marty
2005-11-01, 22:50:27
Mehrfachvererbung ist einer der Punkte, die am meisten gegen Python sprechen. Sogar in der Doku wird davon abgeraten, es zu verwenden. Und das Schlimmste ist, Mehrfachvererbung in Python führt dazu, dass es kein super gibt. Ok, es gibt die Klasse `super' aber das ist ein Hack hässlicher als die Nacht.

Und dann noch die Metaklassen Geschichte. Statische Methoden, Klassenmethoden und Metamethoden. Wo liegen doch gleich noch mal die Unterschiede?
Und vom Mixen von Metaklassen und Mehrfachvererbung wollen wir gar nicht anfangen.

Nichts gegen Python, aber es hat ein paar sehr hässliche Stellen, Mehrfachvererbung ist eine davon.

Mit der default VM? Solange du auf den internen Datentpyen wie list und map arbeitest sicher. Bloss sind die halt nicht in Python sondern C implementiert. Und dass man mit C auf die Geschwindigkeit von C kommt, leuchtet noch ein.

Zudem unterstützen viele backends wie z.B. IronPython bloss ein Subset von Python.


Hast ja recht, das "super" noch den Bug hat die mro ordentlich abzuarbeiten und es zu problemen kommen kann. Entweder nicht verwenden oder konstant verwenden ist die lösung im moment - wird aber sicher gefixt.

map / filter / reduce / etc sind in C, und deswegen auch genausoschnell.
richtig. Aber die nicht zu zählen wäre genauso wie beim Java alles wegzustreichen was in C implementiert ist ....

Aber du kannst dir auch mittels Pyrex eigene erweiterungen in python schreiben, dann noch C datentypendeklaration setzen und durch pyrex auf die
auf die python library funktionen mappen lassen.

Das ganze dann kompilieren und linken, und du hast eine .dll extension.
siehe chapter extending and embedding. (musst du natürlich einmal auf linux und einmal auf windows kompilieren den source ;)

Die kannst du ganz normal verwenden und sogar an anderen C code anbinden, bzw. alle anderen sprachen.


Weiter will ich das jetzt mal im "scheme" thread nicht ausweiten ^^

Mad-Marty
2005-11-01, 22:57:37
Ähm, hast du meinen Text drunter nicht gelesen? Der Code sieht so hässlich aus, weil er auch inhaltlich so hässlich ist. So programmiert niemand der den Code nachher verwenden will.

Etwas ähnlich hässliches in Python wäre Klassenmember irgendwie durchzunummerieren und dann irgendwo anders im Code die Namen zu errechnen, mit passendem Prefix versehen und dann so abzurufen ;)

Guck dir einfach mal das von mir verlinkte Video an. Das ist allerdings Common Lisp nicht Scheme.

Zur Performance: http://shootout.alioth.debian.org/ hat einige Benchmarks, die Lisp-Lösungen sind allerdings weniger optimiert als Java oder C (wenn SBCL und CMUCL sich deutlich unterscheiden kann man die schnellere Lösung als Referenz nehmen, die Typ-Inference unterscheidet sich leicht und die meisten Lösungen sind nur auf einer Implementierung optimiert).

Psyco ist nicht dabei, wenn sich jemand die Mühe machen will, einfach gegen die C-Lösung benchen, dann kann man das ungefähr einordnen.


Nein danke, habe die zeit nicht diese massen da an code zu testen.

unter anderem habe ich mal sowas auf 100.000.000 iterationen geprüft:
x = (x * 1.5 + 2) - x/2;
sowie fibonacci

Aber ich will den Scheme thread nicht komplett jetzt umbiegen,
wie gesagt, es ist ein sehr kleiner aufwand mit dem mann doch sehr viel performance holen kann bei python.

wenn jemand genaueres wissen will, thread aufmachen oder pm