Wer kennt sich mit Scheme aus?
-
Wie meinst du das mit #procedure:STDIN:1322: ?
Soll ich das da irgendwo eingeben??
-
Haben die in dem angegebenen Link zumindest gemacht. Die benutzen auch display.
-
Das funktioniert leider nicht.
Da könnt man verrückt werden. nichts funktioniert was ich versuche
-
MaSTaH schrieb:
btw, scheme sieht mir sehr nach lisp aus. ist das ein lisp-dialekt?
Ansichtssache. Genauso wie Java ein C++-Dialekt ist
(ohne damit jetzt irgendwas werten zu wollen). Grundlegende Konzepte sind zwar übernommen, aber Scheme wurde eigentlich nur auf der Grundlage der Lisp-Syntax entwickelt, um leichter bestimmte fortgeschrittene Programmierkonzepte (Closures, Continuations) zu testen. Die Grundphilosophie, die Common Lisp heute ausmacht, fehlt allerdings in Scheme, so dass Scheme von vielen Lispern eher in die Schublade "funktionale Sprache, die zufällig Lisp-Syntax hat" abgeschoben wird.
vermute ich, dass da ein
#<procedure:STDIN::1322>
fehlt.
Nein, das ist eine Ausgabe der Implementation. Der vorher eingegebene Ausdruck (f 3) hat eine Funktion erzeugt, und obiges ist einfach die Art, wie sowas angezeigt wird. Die Syntax #< ist sogar so definiert, dass sie beim Einlesen direkt einen Fehler erzeugt, und kann damit generell zur Ausgabe "unlesbarer" Werte benutzt werden. Im Unterschied zu "lesbaren" Werten, die nach Ausgabe und Wiedereinlesen gleich (nicht unbedingt identisch) ihrem Original sind (das trifft z.B. auf Zahlen, Strings, Symbole, Listen usw. zu, aber eben nicht auf Funktionen).
-
dprzon schrieb:
Das lag anscheinend am Modus. Ich hatte "Fortgeschrittener" eingestellt.
Jetzt habe ich "stan****" eingestellt, wie wir es auch vorgegeben bekommen haben.Er lässt es zwar durchlaufen, aber er gibt nicht aus.
ich habe so programmiert:(define (erzeuge-gewicht t k g) (list t k g)) (define (ausgabe-gewicht) (display ";") (display (car t)) (display ";") (display (car k) (display ";") (display (car g)) ))
Und folgendes Problem habe ich jetzt..hier mal der Ablauf:
Willkommen bei DrScheme, Version 208. Sprache: FrTime. > (erzeuge-gewicht 1 2 3) (1 2 3) > (ausgabe-gewicht) . reference to undefined identifier: display >
Hm, ich benutze für Scheme mzscheme mit Emacs. Ansonsten stell doch mal in DrScheme auf R5RS, wenn es das gibt.
Die Funktion
(define (ausgabe-gewicht) (display ";") (display (car t)) (display ";") (display (car k) (display ";") (display (car g))
ist Quatsch. Du hast diese Funktion als Parameterlos definiert. Die Funktion soll aber einen Parameter erhalten, nämlich das Gewichtsobjekt. Das Gewicht-Objekt ist eine drei-elementige Liste. Also lautet der Funktionskopf:
(define (ausgabe-gewicht gewicht-objekt)
Wenn wir die Funktion jetzt aufrufen, wird gewicht-objekt also an eine Liste a la (212 334 107) gebunden. Wir müssen als nach und nach die Elemente 1, 2 und 3 auslesen. Die Funktion car liest das erste Element (cdr liest übrigens den Rest). (cadr x) {=> (car (cdr x)) } liest das zweite. So kommst du also zu der Definition, die ich schon mal geschrieben habe:
(define (ausgabe-gewicht gewicht-objekt)
(display (car gewicht-objekt))
(display (cadr gewicht-objekt))
(display (caddr gewicht-objekt)))
-
Ja R5RS habe ich eingestellt. Also den Standart.
Das Gewicht-Objekt ist ja das was erzeugt wurde, also "erzeuge-gewicht" ?
Dann muss ich ja anstatt "gewicht-objekt", "erzeuge-gewicht" angeben oder?
(define (erzeuge-gewicht t k g) (list t k g)) (define (ausgabe-gewicht erzeuge-gewicht) (display (car erzeuge-gewicht)) (display (cadr erzeuge-gewicht)) (display (caddr erzeuge-gewicht)))
Wenn ich es durchführe, bekomme ich wieder...
Willkommen bei DrScheme, Version 208p1. Sprache: FrTime. > (erzeuge-gewicht 1 2 3) (1 2 3) > (ausgabe-gewicht erzeuge-gewicht) . reference to undefined identifier: display >
Ich könnte ausrasten, schon so gut wie den ganzen Tag dran zu sitzen und nicht mal weiter zu kommen. Und dann noch der Mist mit den Sprachleveln...
-
dprzon schrieb:
Ja R5RS habe ich eingestellt. Also den stan****.
Das Gewicht-Objekt ist ja das was erzeugt wurde, also "erzeuge-gewicht" ?
Dann muss ich ja anstatt "gewicht-objekt", "erzeuge-gewicht" angeben oder ?
Nein, warum denn? Der Parameter muss doch nciht genauso heißen wie irgendeine Funktion, die du definiert hast. Er kann erzeuge-gewicht heißen, aber gewicht-objekt ist viel aussagekräftiger.
dprzon schrieb:
Wenn ich es durchführe, bekomme ich wieder...
Willkommen bei DrScheme, Version 208p1. Sprache: FrTime. > (erzeuge-gewicht 1 2 3) (1 2 3) > (ausgabe-gewicht erzeuge-gewicht) . reference to undefined identifier: display >
Da kann ich dir auch nciht helfen. Habe mir gerade Drscheme 208 installiert; dort gibt es display. Ich hab einfach am Anfang R5RS (Standard) eingestellt.
Schau mal, ob du die Funktion write hast.dprzon schrieb:
Ich könnte ausrasten, schon so gut wie den ganzen Tag dran zu sitzen und nicht mal weiter zu kommen. Und dann noch der Mist mit den Sprachleveln...
Vielleicht solltest du lieber BWL studieren...
Hier ist eine komplette Lösung für deine Aufgabe:
(define (erzeuge-gewicht t k g) (list t k g)) (define (gewicht-ausgabe g) (display "tonnen: ") (display (car g)) (display "\n") (display "kilogramm: ") (display (cadr g)) (display "\n") (display "gramm: ") (display (caddr g)) (display "\n")) (define (schwerer? g1 g2) (if (not (= (car g1) (car g2))) (> (car g1) (car g2)) (schwerer? (cdr g1) (cdr g2)))) (define (addiere g1 g2) (reverse (addiere-hilf (reverse g1) (reverse g2) 0))) (define (addiere-hilf g1 g2 acc) (if (null? (cdr g1)) (list (+ (car g1) (car g2) acc)) (cons (modulo (+ (car g1) (car g2) acc) 1000) (addiere-hilf (cdr g1) (cdr g2) (if (> 999 (+ (cadr g1) (cadr g2))) 1 0)))))
Ist etwas hässlich. Ich habe eben viel mit Listen gearbeitet, weil ihr das wahrscheinlich üben sollt. Die Variante, das Gewicht als Integer darzustellen, wäre zwar effizienter, aber wohl nicht im Sinne des Aufgabenstellers.
edit: Fehler wegeditiert.
edit2: noch einen Fehler gefunden
-
boah..
Ich glaube dadrauf wäre ich nicht wirklich vor Abgabe der Aufgabe gekommen...
Ich weiß jetzt auch was an meinem Sprachlevel falsch war. Ich habe das Standartlevel unter "FrTime" gehabt. Ich dachte die ganze dass beides das gleiche ist. Habe jetzt auch R5RS.
Und jetzt habe ich auch das Prizip mit der Eingabe verstanden...
Ich habe dein Programm eingegeben und dann habe ich folgenden Befehl gegeben:
(gewicht-ausgabe (erzeuge-gewicht 1 2 3))
Warum wird da aber was anderes ausgegeben ? In dem Fall:
tonnen: 1
kilogramm: 2
gramm: 2Bei Gramm müsste es ja 3 heissen.
-
dprzon schrieb:
boah..
Ich glaube dadrauf wäre ich nicht wirklich vor Abgabe der Aufgabe gekommen...
Ich weiß jetzt auch was an meinem Sprachlevel falsch war. Ich habe das Standartlevel unter "FrTime" gehabt. Ich dachte die ganze dass beides das gleiche ist. Habe jetzt auch R5RS.
Und jetzt habe ich auch das Prizip mit der Eingabe verstanden...
Ich habe dein Programm eingegeben und dann habe ich folgenden Befehl gegeben:
(gewicht-ausgabe (erzeuge-gewicht 1 2 3))
Warum wird da aber was anderes ausgegeben ? In dem Fall:
tonnen: 1
kilogramm: 2
gramm: 2Bei Gramm müsste es ja 3 heissen.
Ja, hast Recht, habe in der Eile einen Tippfehler gemacht: Es in der Ausgabefunktion (caddr g) heißen. Ich editier das eben oben um.
-
Vielen Dank nochmal Dir!!
Ich habe damit grad ein bisschen rumgespielt und ich habe mir ist der Fall eingefallen ...was wenn ich z.B. für Kilogramm 1000 eingebe? Ich meine, dann steht ja an der Stelle der Kilos 1000, aber eigentlich müsste automatisch +1 auf die Stelle der Tonnen gerechnet werden.
Ist eigentlich irrelevant, weil das in der Aufgabenstellung nicht extra angegeben ist.
Aber wenn, dann wäre die Bedingung eigentlich so in der Art zu programmieren wie du es bei der Addition unten gemacht hast oder? Weil da wird ja auch beim Addieren "übertragen".
-
Ja, genau. Wenn du das haben willst, musst du ein bisschen basteln. Am besten du löst das gleich über addiere, damit du keine hässlichen if-Abfragen im Code hast.
Ich habe gerade mal den Code getestet und gesehen, dass addiere-hilf noch ziemlich falsch war. So ist es richtig:
(define (addiere-hilf g1 g2 acc) (if (null? (cdr g1)) (list (+ (car g1) (car g2) acc)) (cons (modulo (+ (car g1) (car g2) acc) 1000) (addiere-hilf (cdr g1) (cdr g2) (if (> (+ (car g1) (car g2) acc) 999) 1 0)))))
-
Achso ja...hab deswegen auch gestern etwas nachgedacht, weil davor ja stand > 999.
Kannst du mir vielleicht noch sagen, dass wenn man im Modus "Fortgeschrittener" programmiert, wie man da Sachen ausgeben kann?
Ich beziehe das auf "display..." weil der Befehl funktioniert da ja nicht.
Ich habe es mit "string" versucht, aber das klappt auch nicht.
-
Diese verschiedenen Modi beziehen sich auf das Buch "How to design Programs". Es hat gewisse Ähnlichkeiten mit dem legendären "Structure and Interpretation of Computer Programs", allerdings ist es etwas praktischer orientiert (man nutzt viele Sachen von PLT-Scheme aus, zB wird recht früh schon die Grafik-Bibliothek von PLT vorgestellt). D.h. diese Modi benutzt man, wenn man dieses Buch liest. Alle paar-Hundert Seiten erhöht man dann in DrScheme das Sprachlevel. Und im Sprachlevel "Fortgeschrittener" gibt es wohl noch kein display; es wurde dem Leser noch nicht vorgestellt. Daher würde ich an deiner Stelle gleich R5RS nehmen oder besser, wenn du gar nicht vorhast, HtdP zu lesen, emacs und das zu Grunde liegende mzscheme benutzen. Macht das Leben wirklich einfacher.
-
Ja finde ich auch. Aber nachdem was diejenigen die im höheren Semestern mir sagen, ist es so, dass wir andauernd Sprachlevels vorgegeben bekommen und dann müssen wir das so machen, dass es unter dem läuft. Das finde ich recht blöd. Unter Einschränkungen zu programmieren macht ja nicht so viel Spass....
-
Ich würde gerne noch zu einer anderen Problemstellung was wissen wollen.
Allgemein lautet die Aufgabe:
Erstellen Sie eine Funktion (binominal n k) die einen rekursiven Prozess zur Ermittlung des Binominalkoeffizienten (n über k) erzeugt.
Der Binominalkoeffizient ist so definiert:
(n-1 über k) + (n-1) über k-1)
wenn k = 0 oder k = n, dann soll 1 ausgegeben werden, ansonsten eben normal rekursiv...
Bisher habe ich die Bedingung:
(define (binominal n k) (if (or (= 0 k) (= k n)) 1 2))
An die Stelle der "2" muss natürlich das andere hin. Wollte nur schauen ob meine if bedingung ok ist.
Ein rekursiver Prozess ist ja eigentlich nichts anderes als wenn sich die Funktion innerhalb selbst nochmal aufruft.
Gibt es eine Möglichkeit in Scheme das "n über k" darzustellen?
-
Deine "Endbedingung" ist schonmal ok. Sie berücksichtigt allerdings keine Werte, bei denen k>n, bei denen du ja kein Binomialkoeffizient bilden kannst, aber danach ist wohl auch nciht gefragt.
Der zweite Teil steht quasi schon in der Aufgabenstellung, du musst ihn nur noch in Scheme-Syntax konvertieren. Das sieht dann so aus:
(define (binomial n k) (if (or (= k 0) (= n k)) 1 (+ (binomial (- n 1) k) (binomial (- n 1) (- k 1)))))
-
Fast genau so habe ich das gemacht, außer dass ich "binominal" geschrieben habe...
Und wenn ich etwas zum berechnen eingebe, dann dauert dauert das...und plötzlich "zu wenig virtuellen Speicher..."
Gibt es in Scheme eine Möglichkeit eine Stelle einer Zahl zu speichern bzw. an eine andere zu "verschieben" ?
In dem Fall geht es darum eine Ganzzahl einzugeben und diese als Spiegelzahl auszugeben. Aber die Spiegelzahl muss "iterativ" ermittelt werden.
Bedeutet ja so viel ich weiß nichts anderes, als dass die Prozedur wiederholt aufgerufen wird mit einem Abbruchkriterium.z.B. (reverse 110) --> 11
Ich habe mir überlegt, dass die Zahl die ich eingebe (z.B. 110) durch die Anzahl der Stellen (10^anzahlStellen -1) in dem Fall durch 100 geteilt wird. Dann hätte man 1.10.
Der Tutor hat uns den Tipp gegeben die Funktion "truncate float" zu benutzen und "modulo a b".
truncate gibt ja die Zahl ohne Kommas aus, also würde es bei "truncate 1.10 --> 1 bedeuten. Die Zahl müsste ja nach ganz rechts.
Wozu ich modulo brauchen sollte kann ich nicht so nachvollziehen.
-
dprzon schrieb:
Fast genau so habe ich das gemacht, außer dass ich "binominal" geschrieben habe...
Und wenn ich etwas zum berechnen eingebe, dann dauert dauert das...und plötzlich "zu wenig virtuellen Speicher..."
Eine Helferfunktion einführen (geht wahrscheinlich irgendwie mit labels, lambda, oder explizit hinschreiben, keine Ahnung) und die ganze Sache endrekursiv hinschreiben.
Gibt es in Scheme eine Möglichkeit eine Stelle einer Zahl zu speichern bzw. an eine andere zu "verschieben" ?
Eine Helferfunktion einführen, und alles wichtige in die Parameter packen.
Wozu ich modulo brauchen sollte kann ich nicht so nachvollziehen.
(modulo a 10) gibt dir die letzte Stelle der Zahl. (truncate (/ a 10)) schneidet sie weg.
Reicht das als Tip?
-
(truncate (/ a 10)) funktioniert so nicht.
Jetzt weiß ich zumindest wozu modulo.Eine Helferfunktion einführen, und alles wichtige in die Parameter packen.
Das ist für mich noch zu abstrakt.
Aber werde mal rumtesten.Danke!
**EDIT: Hat sich erledigt. Hab jetzt auch das mit der Spiegelzahl geschafft. Das mit dem Binomialkoeffizienten hängt noch manchmal (je nachdem bei welchen Werten), aber es ist so ok...
Vielen Dank nochmal besonders als Doktor Prokt!!**