Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

julianr

Erfahrener Schreiberling

  • "julianr" started this thread

Posts: 298

Date of registration: Oct 13th 2005

Location: I live in a giant bucket.

1

Tuesday, January 24th 2006, 3:36pm

Scheme 10

Ist das aktuelle Übungsblatt eigentlich wieder traditionell unlösbar? Soweit ich weiß kennen wir keinen Weg um in Scheme ne Prozedur zu schreiben, die die ihr übergebene Liste auf nil setzt. Wenn filter! oder pop nichts zurücklassen sollen, müssten die Funktionen aber genau das tun... \o/ woot!

alexP

Praktikant

  • "alexP" is male

Posts: 27

Date of registration: Oct 11th 2005

2

Tuesday, January 24th 2006, 3:46pm

Da lohnt es sich ja fast mal wieder hier was zu schreiben. Wenn da nich DER Trick hintersteckt is nach Aufgabe 1a) schluss bei dem Blatt ^^

Red Eye

Junior Schreiberling

  • "Red Eye" is male

Posts: 187

Date of registration: Oct 6th 2005

Occupation: Informatik

3

Tuesday, January 24th 2006, 10:47pm

Nabend...

Also, Aufgabe 1 geht doch noch ganz gut...

Mal ein Bsp:: Aufgabe b

Ihr schreibt erst einmal einen "normalen" filter....also einen, der euch eine neue liste mit den gefilterten Elmenten zurückgibt (filter global schreiben). In eurer Hauptprozedur beginnt ihr mit

......
(let ((templiste (filter sel lst))).......

so, nun kommt der tick......ihr nehmt set-car! lst und setzt damit lst auf (car templiste) ....als nächstes setzt ihr set-cdr! lst (cdr templiste) ....... so, und fertig ist die überschreibene liste.
Das geht mit diesen eigenschaften von set-car und set-cdr ganz yut.......mit dem Prinzip gehen auch die anderen Aufgaben.

Es gibt aber ein Problem bei Aufgabe 2.

Denn (push 8 stack) soll ja dem stack das elemt 8 hinzugeben......jedoch soll der stack, wenn er im nächsten schritt ausgeführt wird, die 8 nicht enthalten...also, ich meine das so:

(push 8 stack) --> (5 7 2 9 4 2 8)
stack --> (5 7 2 9 4 2)

Das macht doch eigentlich wenig Sinn, da sich ja dadurch der stack im prinzp nicht ändert....

Naja,.......es muss im Leben nicht alles einen Sinn ergeben....wäre schön wenn es so wäre :)


Gruß

Red Eye
Der Hauptgrund für Stress ist der tägliche Kontakt mit Idioten.

sos1981

Alter Hase

  • "sos1981" is male

Posts: 1,562

Date of registration: Oct 28th 2003

Location: Wolfsburg

Occupation: Testentwickler

4

Tuesday, January 24th 2006, 10:54pm

Wie wäre es, wenn hier jemand mal das Aufgabenblatt posten würde, denn runterladen können das ja nur zu der Vorlesung angemeldete Personen und nicht die, die die Prüfung schon belegt haben und evtl. Hilfestellung geben könnten.....
Der Einzigste ist noch viel einziger als der Einzige!

oixio

Senior Schreiberling

  • "oixio" is male

Posts: 517

Date of registration: Oct 3rd 2004

5

Tuesday, January 24th 2006, 11:32pm

Quoted

Original von Red Eye

Das macht doch eigentlich wenig Sinn, da sich ja dadurch der stack im prinzp nicht ändert....

Naja,.......es muss im Leben nicht alles einen Sinn ergeben....wäre schön wenn es so wäre :)


So weit ich das sehen kann soll hier noch mal der Unterschied zwischen destruktivem und nicht destruktivem Programmieren in Scheme deutlich werden. So wie ich die Aufgabe eben gelesen habe wirst du in einem von beiden Teilen wohl ganz ohne die Funktionen mit dem Ausrufezeichen auskommen - was im Allgemeinen auch die bevorzugten Scheme-Funktionen sind.

Ich denke ein zumindest kleiner Sinn der Aufgabe besteht halt darin zu zeigen (bzw. zu erinnern, denn bis vor der letzten Übung war destruktives ja nicht erlaubt....), dass das meiste in Scheme auch ohne destruktive Prozeduren zu machen ist - und wenn das geht dann ist das zu bevorzugen.
Dieser Post wurde aus 100 % chlorfrei gebleichten, handelsüblichen, freilaufenden, glücklichen Elektronen erzeugt!

julianr

Erfahrener Schreiberling

  • "julianr" started this thread

Posts: 298

Date of registration: Oct 13th 2005

Location: I live in a giant bucket.

6

Tuesday, January 24th 2006, 11:53pm

oixio: Es geht gleich in der zweiten Teilaufgabe darum, (filter! selectorproc list) zu schreiben, also wie (filter), nur dass es die Liste verändert und keine neue erzeugt.

Quoted

so, nun kommt der tick......ihr nehmt set-car! lst und setzt damit lst auf (car templiste) ....als nächstes setzt ihr set-cdr! lst (cdr templiste) ....... so, und fertig ist die überschreibene liste.


Ich glaube nicht, dass es im Sinne des Erfinders ist, eine neue Liste zu erzeugen - da ist ja jeder Vorteil der destruktiven Programmierung dahin :)
Soweit geht es auch ganz ohne eine neue Liste zu erzeugen (iterieren und mit set-car und set-cdr die Liste auf die übrigen Elemente zusammenschrumpfen). Aber ein Problem hat man so oder so: Wenn die Liste nach dem Filtern leer sein soll, schafft man es nur mit (set-car) und (set-cdr) nicht, die an (filter!) übergebene Liste auch die leere Liste werden zu lassen. Dafür bräuchte man Referenzparameter à la C++/C#/..., und so etwas kennen wir nicht - oder ich sollte doch mal wieder zuhören ;)
Das gleiche Problem hat man dann natürlich auch bei (pop).

This post has been edited 1 times, last edit by "julianr" (Jan 24th 2006, 11:54pm)


BLUESCREEN

Junior Schreiberling

  • "BLUESCREEN" is male

Posts: 244

Date of registration: Oct 11th 2005

7

Wednesday, January 25th 2006, 1:25am

Mit dem Problem habe ich mich auch schon rumgeschlagen und es scheint nicht möglich zu sein, etwas äquivalentes zu (set! lst null) mit set-car! und set-cdr! hinzukriegen...

Falls es in Scheme Call-by-reference gibt, dann hatten wir das in der Vorlesung bisher noch nicht, also vermute ich, dass wir bei der Lösung der Aufgaben davon ausgehen sollen, dass entsprechende Spezialfälle einfach nicht auftreten werden -.-

Die letzte Möglichkeit wäre, dass man statt einer leeren Liste ersatzweise eine Liste zurückgibt, die als einziges Element eine leere Liste enthält. Das ist zwar auch nicht optimal, aber wenn es anders nicht geht...

Markus

the one and only Unterstrich!

Posts: 2,571

Date of registration: Oct 9th 2003

8

Wednesday, January 25th 2006, 10:51am

Quoted

Original von julianr

Quoted

so, nun kommt der tick......ihr nehmt set-car! lst und setzt damit lst auf (car templiste) ....als nächstes setzt ihr set-cdr! lst (cdr templiste) ....... so, und fertig ist die überschreibene liste.


Ich glaube nicht, dass es im Sinne des Erfinders ist, eine neue Liste zu erzeugen - da ist ja jeder Vorteil der destruktiven Programmierung dahin :)


Richtig! Bei Problemen mit der Filter-Prozedur kann ich empfehlen, einfach mal das entsprechende Teachpack (Teachpeack 3) mit DrScheme zu öffnen und die Filter Prozedur sich anzuschauen. Auf dieser Prozedur basierend kann man dann mit einigen Umschreibungen die gewünschte Prozedur erhalten.
Einziges Problem, was damit noch nicht gelöst ist, ist die Rückgabe einer eventuell leeren Liste. Allerdings sollte man lieber erstmal den Rest des Übungsblattes bearbeiten und notfalls einfach mittels (set-car! lst null) die Liste (()) erzeugen, denn an dem wesentlichen Kern der Prozedur ändert sich dadurch schließlich nichts.

Edit: Zu beiden Themen gibt es inzwischen eine Email von Christian Görries!
Charmant sein? Hab ich längst aufgegeben. Glaubt mir doch eh keiner...

This post has been edited 2 times, last edit by "Markus" (Jan 25th 2006, 11:01am)


ruffy85

Trainee

  • "ruffy85" is male

Posts: 103

Date of registration: Oct 12th 2005

Location: Hildesheim

Occupation: B.Sc. Informatik / 1. Semester

9

Wednesday, January 25th 2006, 9:41pm

Hallo,

habe nun mal due Aufgaben zu A1 gelöst, bis auf filter! arbeitet alles 1A, bei Fehler steckt der Wurm dirn, die Prozedur läuft ohne Hilfsliste, das Problem liegt darin, dass er sie sofort auswertet und ausgibt und nicht verzögert. Hat jemand eine Idee, wie es geht?

So sieht das nun bei mir aus, wenn ich es ausführe:

Source code

1
2
3
4
(filter! odd? lst)
--> '(1 3 5)
lst
--> '(1 3 5)

sommla

Junior Schreiberling

  • "sommla" is male

Posts: 169

Date of registration: Oct 27th 2005

10

Thursday, January 26th 2006, 12:34pm

Aufgabe 1

Hi,

ich habe das Problem, dass ich "nix" zurückgeben soll, aber ich muss irgendwas eingeben, damit er überhaupt was macht.

Vielleicht bischen besser erklärt:

(define lst '(1 2 3 4 5)) ;soll die Liste ja definieren
(map! square lst) ---> #kein Rückgabewert ;also es soll nichts ausgegeben, sondern nur "square " ausgeführt werden

lst ---> (1 4 9 16 25)


Wie bekomme ich das hin, dass nicht "#kein Rückgabewert" da steht sondern einfach nur ">" und danach halt nichts.

Ich hoffe es ist bischen verständlich ;)
Lieber ein Haus im Grünen als 'nen Grünen im Haus.

Wanja

Junior Schreiberling

Posts: 150

Date of registration: Feb 4th 2003

11

Thursday, January 26th 2006, 9:25pm

RE: Scheme 10

hat sich erledigt ^^

This post has been edited 2 times, last edit by "Wanja" (Jan 26th 2006, 9:39pm)