Wer kennt sich mit Scheme aus?
-
Doktor Prokt schrieb:
Darf ich mal fragen, an welcher Uni Scheme unterrichtet wird? Würd mich mal interessieren..
OT: afaik wird das noch an ziemlich allen unis gelehrt...
-
Aber im Fach "Praktische Informatik"?!?!
-
Ich seh schon wieder nicht deinen Gedankengang. gebe-gewicht-aus soll ein Gewicht ausgeben, nicht eins erzeugen. Dazu musst du die einzelnen Komponenten eines Gewicht-Objektes extrahieren und wie gefordert ausgeben.
Ich weiß dass das wahrscheinlich/offensichtlich sinnlos ist was ich da schreibe. Es ist bei mir so, dass ich Programmieren bisher immer durch Beispiele gelernt habe und dann ging alles ganz schnell...
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.
-
*neid* (lerne nur java und pascal im studium, ev. ada, aber fiel aus letzes mal)
hier ein link
http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-1.html#node_toc_startaber mit tutorials bist du sicher eingedeckt. aber da sind ein paar beispiele
http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme-Z-H-14.html#node_sec_12.1
-
[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.