Scheme-Problem mit Liste in do-Umgebung |
02.08.2011, 13:30 | Auf diesen Beitrag antworten » |
meep | Scheme-Problem mit Liste in do-Umgebung Meine Frage: Liebe Foren-Mitglieder, ich verwende eine spezielle Software namens MEEP zur Simulation photonischer Kristalle. Sie basiert auf Scheme. Da es in Scheme keine for-Schleife gibt, verwende ich zwei do-Befehle um eine doppelte Schleife zu erzeugen. Mein Problem ist dieser Code: (list (do ((j 0 (+ j 1))) ((> j (- cols 1))) (do ((i 0 (+ i 1))) ((> i (- rows 1))) (if (vector? (array-ref coords i j)) (make cylinder (center (vector-ref (array-ref coords i j) 0) (vector-ref (array-ref coords i j) 1) 0) (height high) (radius rad) (material air)) ) ) ) ) Dieser soll aus einem zuvor ertsellten Array coords, dessen Einträge jeweils Vektoren sind (x- und y-Koordinate), Zylinder für jedes Koordinaten-Paar erzeugen. Das Problem dabei ist die do-Schleife, denn dieser Code funktioniert: (list (if (vector? (array-ref coords 0 0)) (make cylinder (center (vector-ref (array-ref coords 0 0) 0) (vector-ref (array-ref coords 0 0) 1) 0) (height high) (radius rad) (material air)) ) (if (vector? (array-ref coords 1 0)) (make cylinder (center (vector-ref (array-ref coords 1 0) 0) (vector-ref (array-ref coords 1 0) 1) 0) (height high) (radius rad) (material air)) ) (if (vector? (array-ref coords 1 6)) (make cylinder (center (vector-ref (array-ref coords 1 6) 0) (vector-ref (array-ref coords 1 6) 1) 0) (height high) (radius rad) (material air)) ) ) Meine Ideen: Wie kann ich das Problem lösen? Liegt es daran, dass ich in einer Listen-Umgebung keinen do-Befehl verwenden kann? Ich habe auch versucht den list-Befehl an eine andere Stelle zu schreiben und mit append die Listen zusammenzufügen. Auch ohne Erfolg. Für Hilfe wäre ich sehr dankbar! |
|
|
02.08.2011, 15:20 | Auf diesen Beitrag antworten » |
meep | RE: Scheme-Problem mit Liste in do-Umgebung Vielleicht ist die Frage auch etwas zu spezifisch. Eine Problemlösung die ich gut finden würde, wäre so: ich übergebe einer Funktion eine leere Liste, und in der ober gezeigten doppelten do-Schleife werden dann Elemente zu dieser Liste hinzugefügt und die Liste zurückgegeben. Wie kann ich das machen? Es gibt ja keinen richtigen return-Befehl in scheme, oder? Kann da vielleicht jemand einen Tipp geben? Vielen Dank! |
13.08.2011, 09:30 | Auf diesen Beitrag antworten » |
Lowl3v3l | Ich würde mal versuchen das ganze per rekursion zu lösen, würde zumindest ich als Clojure-programmierer so machen, wie genau do in scheme funktioniert weiß ich ausm kopf leider nicht, aber für so schleifen-probleme ist Tail-recursion idR die eleganteste Lösung. mfg |
|
Verwandte Themen
Die Beliebtesten » |
Die Größten » |
Die Neuesten » |
|