Übung 6, Aufgabe 7 - Metainterpreter

Stumpf.Alex
Nerd
Nerd
Beiträge: 643
Registriert: 1. Okt 2007 12:40
Wohnort: Darmstadt
Kontaktdaten:

Beitrag von Stumpf.Alex » 9. Dez 2007 20:32

Die booleschen Werte true und false sind nicht im Metainterpreter definiert und daher nicht einsetzbar.

saba
Windoof-User
Windoof-User
Beiträge: 36
Registriert: 17. Jan 2007 19:58

Beitrag von saba » 9. Dez 2007 20:40

s!mon hat geschrieben:zu 1: schreib einfach (empty) statt empty

zu 2: ja.. wobei das ja einfach eine abfrage ist, ob die zahl größer oder kleiner 0 ist (positiv/negativ)
soll man man als relation-operation (X->boolean) > oder < benutzen?

Stumpf.Alex
Nerd
Nerd
Beiträge: 643
Registriert: 1. Okt 2007 12:40
Wohnort: Darmstadt
Kontaktdaten:

Beitrag von Stumpf.Alex » 9. Dez 2007 20:46

1. Es ist nur < im Metainterpreter definiert.

2. Der Contract für die Prädikatsfunktion sollte (X -> boolean) sein. Da kommst du mit einem einfachen rel-op nicht weit. Du musst eine richtige Hilfsfunktion verwenden, die ein X konsumiert und ein boolean ausspuckt.

Pathfinder
Erstie
Erstie
Beiträge: 15
Registriert: 5. Nov 2006 15:45

Beitrag von Pathfinder » 9. Dez 2007 20:49

Ich hab ein Problem...Ich hab mir mal gerade eben dieses Template runtergeladen und wenn ich es mal anfangs testweise laufen lassen will, ohne dass ich selber was reinschreibe, bekomme ich ne Fehlermeldung:
lambda: expected at least one argument name in the sequence after `lambda', but found none
betrifft diese Zeile:

Code: Alles auswählen

         (list  first rest cons list empty? (lambda () empty) * / - + < = abs (lambda (a b) (or a b)) modulo)))
Wie sieht denn diese Zeile bei Euch aus? Kann da nix machen...Ein (lambda (n) empty)) o.ä. bringt auch nix...Weiß auch net weiter...
Hoffe, jemand kann mir auf die Schnelle mal helfen...

:(

RaZzel
Erstie
Erstie
Beiträge: 15
Registriert: 1. Okt 2007 12:13

Beitrag von RaZzel » 9. Dez 2007 20:51

Hats du den Sprachlevel auf Fortgeschritten umgestellt?

Pathfinder
Erstie
Erstie
Beiträge: 15
Registriert: 5. Nov 2006 15:45

Beitrag von Pathfinder » 9. Dez 2007 20:58

ok, daran lags wohl...Hatte noch ein älteres Template, da stand was von "...mit Lambda"...Wurde wohl geändert...

seb1402
Neuling
Neuling
Beiträge: 7
Registriert: 4. Nov 2007 17:04
Kontaktdaten:

Beitrag von seb1402 » 9. Dez 2007 21:21

saba hat geschrieben:aber filter braucht 2 argumente oder?
bei dir gibts 3 argumente

weil eigebaute filter im scheme sieht so aus (aus scheme Help):
filter : ((X -> boolean) (listof X) -> (listof X))
Leider wurde das in der VL wieder nicht ganz deutlich.
Ich habe mich an der Folie T5.33 orientiert.
Dort ist der Vertrag mit 3 Parametern angegeben:
filter1: (X number->boolean) (listof X) number -> (listof X)

Nach meiner Auffassung ist dieser Vertrag jedoch korrekt, denn auf diese Weise erhalten wir eine generische Funktion, die mit verschiedenen Arten von Daten arbeiten kann (T5.18)

Natürlich kann die Prüfung, ob eine Zahl positiv oder negativ ist auch in einer Vergleichsoperation fest verdrahtet werden, was aber bedeutet, dass für die Prüfung ob die Zahl negativ ist auch eine extra Funktion geschrieben werden muss.
Bei meiner Lösung war das nicht nötig, aber es gibt ja bekanntlich mehrere Wege, um eine Aufgabe zu lösen. Vielleicht hilft der Post ja trotzdem auf die eine oder andere Weise.

Jedoch sei noch folgendes zu bedenken:
Angenommen wir möchten eine (listof numbers) filtern:
Zum einen sollen alle 1sen rausgefiltert werden, an einer anderen Stelle vielleicht alle Zahlen größer 10 usw.
Haben wir einen Filter, der keinen Schwellenwert annimmt, dann muss für jeden neuen Fall eine neue Vergleichsoperation erstellt werden, die sich nur durch den Schwellenwert unterscheiden. Folglich werden redundante Funktionen geschaffen, das Fehlerpotential wächst und der Programmierer fängt an zu schwitzen.

Viel Erfolg weiterhin und mögen die Klammern ein letztes Mal mit euch sein. :wink:
Gruß Sebastian

Die beste Anwendung von Wissen, ist es weiter zu geben.

saba
Windoof-User
Windoof-User
Beiträge: 36
Registriert: 17. Jan 2007 19:58

Beitrag von saba » 9. Dez 2007 21:27

Stumpf.Alex hat geschrieben:1. Es ist nur < im Metainterpreter definiert.

2. Der Contract für die Prädikatsfunktion sollte (X -> boolean) sein. Da kommst du mit einem einfachen rel-op nicht weit. Du musst eine richtige Hilfsfunktion verwenden, die ein X konsumiert und ein boolean ausspuckt.
meine filter funktion ist fast wie fliter1 funktion in T5/11 T5aber ohne t ,
und habe ich auch eine Prädikatsfunktion (pos?) implementiert ,aber
(filter pos? alon) bei mir gibt

(make-proc
(list 'n)
(make-if-clause
(make-application (make-variable '=) (list (make-variable 'n) 0))
(make-application (make-variable 'my-first) (list -29-))
(make-application
(make-variable 'filter)
(list (make-variable 'pos?) (make-application (make-variable 'my-rest) (list -29-))))))))


und keine richtige liste ,warum?

Ziuzia
DON'T PANIC
Beiträge: 42
Registriert: 27. Okt 2007 16:36

Beitrag von Ziuzia » 9. Dez 2007 21:30

saba hat geschrieben:
Stumpf.Alex hat geschrieben:1. Es ist nur < im Metainterpreter definiert.

2. Der Contract für die Prädikatsfunktion sollte (X -> boolean) sein. Da kommst du mit einem einfachen rel-op nicht weit. Du musst eine richtige Hilfsfunktion verwenden, die ein X konsumiert und ein boolean ausspuckt.
meine filter funktion ist fast wie fliter1 funktion in T5/11 T5aber ohne t ,
und habe ich auch eine Prädikatsfunktion (pos?) implementiert ,aber
(filter pos? alon) bei mir gibt

(make-proc
(list 'n)
(make-if-clause
(make-application (make-variable '=) (list (make-variable 'n) 0))
(make-application (make-variable 'my-first) (list -29-))
(make-application
(make-variable 'filter)
(list (make-variable 'pos?) (make-application (make-variable 'my-rest) (list -29-))))))))


und keine richtige liste ,warum?
Du hast jetzt eine my-cons Liste, brauchst aber eine my->cons liste.

saba
Windoof-User
Windoof-User
Beiträge: 36
Registriert: 17. Jan 2007 19:58

Beitrag von saba » 9. Dez 2007 21:33

Ziuzia hat geschrieben:
saba hat geschrieben:
Stumpf.Alex hat geschrieben:1. Es ist nur < im Metainterpreter definiert.

2. Der Contract für die Prädikatsfunktion sollte (X -> boolean) sein. Da kommst du mit einem einfachen rel-op nicht weit. Du musst eine richtige Hilfsfunktion verwenden, die ein X konsumiert und ein boolean ausspuckt.
meine filter funktion ist fast wie fliter1 funktion in T5/11 T5aber ohne t ,
und habe ich auch eine Prädikatsfunktion (pos?) implementiert ,aber
(filter pos? alon) bei mir gibt

(make-proc
(list 'n)
(make-if-clause
(make-application (make-variable '=) (list (make-variable 'n) 0))
(make-application (make-variable 'my-first) (list -29-))
(make-application
(make-variable 'filter)
(list (make-variable 'pos?) (make-application (make-variable 'my-rest) (list -29-))))))))


und keine richtige liste ,warum?
Du hast jetzt eine my-cons Liste, brauchst aber eine my->cons liste.
ich habe filter auf alon benutzt und das hat nur 5 elemente ,und brauche ich kein my->cons

Stumpf.Alex
Nerd
Nerd
Beiträge: 643
Registriert: 1. Okt 2007 12:40
Wohnort: Darmstadt
Kontaktdaten:

Beitrag von Stumpf.Alex » 9. Dez 2007 21:35

Doch brauchst du. Trotz des einsatzes von filter bleibt es eine my-cons Liste. Um es in eine normale Liste zu konventieren musst du my->cons anwenden.

saba
Windoof-User
Windoof-User
Beiträge: 36
Registriert: 17. Jan 2007 19:58

Beitrag von saba » 9. Dez 2007 21:46

oh ja stimmt mit my->cons habe ich die antwort bei (my->cons 10 (filter pos? alon))
bekommen :)

aber wenn ich filter auf alterate-nat verwende,so (my->cons 10 (filter pos? alterate-nat))
dann soll ich viel warten und habe ich selber das programm abgebrochen
was könnte das problem sein ,das es mit alon klappt aber mit alterate-nat ,weiss ich nicht

( aber zb diese aufruf (my->cons 10 alterate-nat) gibt die Antwort ,nach weniger als eine minute)
Zuletzt geändert von saba am 9. Dez 2007 22:45, insgesamt 1-mal geändert.

Pathfinder
Erstie
Erstie
Beiträge: 15
Registriert: 5. Nov 2006 15:45

Beitrag von Pathfinder » 9. Dez 2007 22:24

Ich habe auch so ein ähnliches Problem...

(my->cons 4 (filter boolpos alternate-nat))
dauert ca. 5 Sek.

(my->cons 5 (filter boolpos alternate-nat))
dauert ca. 15 Sek.

und
(my->cons 6 (filter boolpos alternate-nat))
dauert ca. 1:10Min. bis es ausgewertet wurde.


(my->cons 10 (filter boolpos alternate-nat)) und
(my->cons 10 (filter boolneg alternate-nat))
brauche ich garnicht einzugeben, da es sehjr sehr lange dauert, bis überhaupt ein Befehl von den Beiden ausgewertet wurde (habe nach 20Min. abgebrochen)...

Ist das normal? Oder woran soll ich denn noch arbeiten? Also irgendwie ist meine filter-Funktion ziemlich träge...Habe eigentlich diese Funktion 1:1 aus den Folien übernommen, nur dass ich es auf zwei Eingabewerte reduziert und lambda benutzt habe...

//edit: (my->cons 10 (filter boolpos nat)) wird ziemlich schnell ausgewertet (ca. 4Sek.)...

Benutzeravatar
s!mon
Computerversteher
Computerversteher
Beiträge: 373
Registriert: 20. Okt 2007 18:24
Wohnort: Höchst i. Odw

Beitrag von s!mon » 9. Dez 2007 22:55

Alles was du in alternate ausrechnest macht deine Funkion sehr langsam. Du musst überlegen, wie du alles ifs oder abs da rausbekommst

Pathfinder
Erstie
Erstie
Beiträge: 15
Registriert: 5. Nov 2006 15:45

Beitrag von Pathfinder » 9. Dez 2007 22:56

s!mon hat geschrieben:Alles was du in alternate ausrechnest macht deine Funkion sehr langsam. Du musst überlegen, wie du alles ifs oder abs da rausbekommst
Ich habe es ohne if gemacht, sondern einfach nur mathematisch.
Dazu habe ich allerdings die Funktion "expt" (um zu potenzieren) hinzufügen müssen...Evtl. sollte ich es mal mit if versuchen...Aber ein Tutor meinte, ich bräuchte das nicht...

Antworten

Zurück zu „Archiv“