Scheme-Problem mit Liste in do-Umgebung

Neue Frage »

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!
 
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!
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
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »