Wer kennt sich mit Scheme aus?
-
[quote="dprzon"]
Bei der b) hab ich das Problem, dass ich jetzt nicht weiß ob gewicht eine Variable ist die ich neu reinbringen muss.
Dass man mit "display..." ausgeben kann weiß ich. Aber wie t, k, g reinbringen?
Bei C ist das ja so, dass man bei der Ausgabe "printf" einfach z.b. %d hinschreibt im Text und dann am Ende welche Variable (Wert) ausgegeben werden soll.Du könntest beispielsweise schreiben:
(define (ausgabe g) (display "Tonnen: ") (display (car g)) (display "\n") (display "Kilogramm") ;; usw. )
Die meisten Scheme-Implementierungen bieten allerdings eine freundlichere Ausgabefunktion an. PLT-Scheme hat zB ein Lisp-ähnliches format und sogar ein printf. Damit sieht das dann so aus:
(define (ausgabe g) (printf "Tonnen ~a~nKilogramm ~a~nGramm ~a~n" (car g) (cadr g) (caddr g)))
Welches Scheme benutzt du denn?
-
Danke für die Seite!
Ich bin jetzt auf folgendes insgesamt gekommen:
(define (erzeuge-gewicht t k g) (list t k g)) (define gebe-gewicht-aus (lambda (t k g) (begin (display #\t) (display ";") (display #\k) (display ";") (display #\g) (newline))))
Wenn ich das so programmiere und dann im Programm, z.b. folgendes eingebe:
(erzeuge-gewicht 1 2 3)
(gebe-gewicht-aus #\t #\k #\g)
Dann bekomme ich...
t;k;g
ausgegeben.
Aber ich will ja, dass er mir den Inhalt von t, k, g ausgibt.
Ist das programmiertechnisch so überhaupt sinnvoll wie ich das machte?
-
dprzon schrieb:
Danke für die Seite!
Ich bin jetzt auf folgendes insgesamt gekommen:
(define (erzeuge-gewicht t k g) (list t k g)) (define gebe-gewicht-aus (lambda (t k g) (begin (display #\t) (display ";") (display #\k) (display ";") (display #\g) (newline))))
Du gibst hier die Zeichen (Buchstaben 't', 'k' und 'g') aus. Du willst aber die Werte haben, die sich hinter den Symbolen verstecken. Schau dir einfach mal meinen vorigen Beitrag an.
Wenn du dir noch mal die Definition von erzeuge-gewicht vor Augen führst,
(define (erzeuge-gewicht t k g) (list t k g))
dann ist doch, wie schon gesagt wurde, die Liste (t k g) dein Gewicht-Objekt, d.h. die Funktion gewicht-ausgabe bekommt nur *einen* Parameter (das Gewicht-Objekt eben), aber auch das habe ich schon oben geschrieben.
-
Hallo,
habe deinen Beitrag erst jetzt gelesen. Habe danach nämlich nicht mehr nachgeschaut.
Ich benutze DrScheme Version 208 by PLT.
Wenn ich das eingebe, also:
(define (ausgabe g) (display "Tonnen: ") (display (car g)) (display "\n") (display "Kilogramm") ;; usw )
Ich habe natürlich auch vorher definiert:
(define (erzeuge-gewicht t k g) (list t k g))
g steht in deinem Quellcode für "gewicht" ?
Und wofür "car g" ?
-
Das lag anscheinend am Modus. Ich hatte "Fortgeschrittener" eingestellt.
Jetzt habe ich "standart" 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 >
-
<OT>
elise schrieb:
*neid* (lerne nur java und pascal im studium, ev. ada, aber fiel aus letzes mal)
da sind wir mit c, c++, java, haskell und prolog ja ganz gut bedient. in einigen kursen kann man bei uns auch modula 3, pascal und lisp lernen.
btw, scheme sieht mir sehr nach lisp aus. ist das ein lisp-dialekt?
</OT>Hier fehlt eine Klammer
(display (car k)
-
Danke für die Info!!
habe das geändert, aber der Fehler kommt immer noch.
Also jetzt habe ich.
(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)) )
Wenn ich nach meiner eingabe (erzeuge-gewicht) dann "ausgabe-gewicht" eingebe, kommt der Fehler immer noch.
reference to undefined identifier: display
-
Also, wenn ich mir http://www.cs.nyu.edu/courses/fall04/G22.3110-001/scheme_lecture3.txt
anschaue, dann vermute ich, dass da ein#<procedure:STDIN::1322>
fehlt. Die Zahl nach STDIN kann man scheinbar frei wählen. Probiers einfach aus... mehr als falsch sein kann es nicht
.
-
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.