Wer kennt sich mit Scheme aus?



  • Hallo,

    ich bin dabei im Studium Scheme zu lernen.
    Wir haben eine Aufgabe bekommen, bei der ich nicht weit komme.
    Und zwar:

    a) (erzeuge-gewicht tonnen kilogramm gramm)
    b) (gebe-gewicht-aus gewicht) (1 Punkt)
    c) (addiere-gewicht gewicht1 gewicht2)
    d) (schwerer? gewicht1 gewicht2)

    erzeuge-gewicht erhält drei Argumente: tonnen (ganze Zahl >= 0), kilogramm (0 − 999), gramm (0 − 999)
    und liefert ein Gewicht-Objekt zurück, mit dem die restlichen Funktionen arbeiten können. Wie das Objekt implementiert ist, bestimmen Sie.

    gebe-gewicht-aus erhält ein Gewicht-Objekt gewicht und gibt es im Format tonnen;kilogramm;gramm auf dem Bildschirm aus.

    addiere-gewicht addiert zwei Gewichte gewicht1 und gewicht2.

    schwerer? erhält zwei Gewichte gewicht1 und gewicht2 und gibt #t (true) zurück, wenn gewicht1 schwerer ist als gewicht2, ansonsten #f (false).

    Beispiel: > (gebe-gewicht-aus (addiere-gewicht (erzeuge-gewicht 2 990 0) (erzeuge-gewicht 0 20 0) ) 3;10;0

    Ich habe bisher nur das Problem mit dem Ansatz. Also wie kann ich es realisieren, dass die 3 Argumente eingegeben werden? Oder besser gesagt, dass ich zunächst das Objekt habe und das dann in b) implementieren kann.

    Ich habe es bisher so versucht, was ja aber nicht klappt.

    (define (gewicht)(t k g))

    Wäre für Hilfe sehr dankbar!



  • (define (gewicht)(t k g))

    Ähm, hast du ne Idee dazu, was das bezwecken soll? Ich glaube nicht, dass es Teil der Aufgabenstellung ist, unbekannte Sprachelemente durch probieren herauszufinden. Eher sollst du die Lösung aus bekannten Bestandteilen implementieren.

    Beispielsweise könnte man das als simple Liste implementieren:

    (define (erzeuge-gewicht t k g)
      (list t k g))
    

    Und den Rest dann dazu passend. Vielleicht gibts auch was besseres, keine Ahnung.



  • Darf ich mal fragen, an welcher Uni Scheme unterrichtet wird? Würd mich mal interessieren..



  • @Doktor

    Bin in Mannheim auf der Uni. Wird im "Fach" Praktische Informatik unterrichtet.

    @Bashar

    Danke Dir !!

    Weisst du vielleicht was mit dem Gewicht-Objekt gewicht gemeint wird?

    Gewicht-Objekt ist mir klar, denn das wird ja von erzeuge-gewicht produziert.
    Zuerst dachte ich an:

    (define (gebe-gewicht-aus gewicht) (erzeuge-gewicht))

    Aber das geht ja nicht.



  • dprzon schrieb:

    @Doktor
    Weisst du vielleicht was mit dem Gewicht-Objekt gewicht gemeint wird?

    Ja, dein Gewicht-Objekt ist jetzt repräsentiert durch eine List mit drei Elementen: (tonnen kilogramm gramm)

    Man kann das Gewicht-Objekt auch durch ein Integer darstellen: 111222333 wäre in der Listendarstellung (111 222 333).



  • dprzon schrieb:

    Bin in Mannheim auf der Uni. Wird im "Fach" Praktische Informatik unterrichtet.

    Nett.

    Weisst du vielleicht was mit dem Gewicht-Objekt gewicht gemeint wird?

    Das, was erzeuge-gewicht zurückgibt. Also bei mir die Liste.

    Zuerst dachte ich an:

    (define (gebe-gewicht-aus gewicht) (erzeuge-gewicht))

    Aber das geht ja nicht.

    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.



  • 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_start

    aber 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.


Anmelden zum Antworten