Sie verwenden cond
falsch. Der Auftrag der besonderen Form ist:
(cond
(predicate consequent1 consequent2 ...) ...)
Das letzte Prädikat das Symbol else
sein kann. Betrachten Sie cond das ist, wie es interpretiert hat:
(cond ((null? s) ; predicate
'()) ; consequent1 (result)
(foldr ; predicate (always true since only #f is false)
(lambda (x) ; consequent1 (dead code)
(if (atom? x)
(append x)
(list x)))
s ; consequent2 (dead code)
'()))) ; consequent3 (result)
Wie Sie sehen es die Klammern um den letzten Term fehlt foldr
das Prädikat zu machen. Auch mit den Klammern fehlt es else
als Prädikat und ohne es fold
wird nur verwendet, um zu überprüfen, ob es nicht #f
ist und nicht als die tatsächliche Folge.
Da beide Begriffe zu ()
evalutes und das letzte Prädikat ist immer wahr ()
wäre das Ergebnis die ganze Zeit.
Mit foldl
würden Sie die Elemente in umgekehrter Reihenfolge erhalten, aber es wäre schneller. Mit foldr
können Sie es wie folgt tun:
(define (flatten lst)
(let helper ((lst lst) (acc '()))
(foldr (lambda (e acc)
(cond ((null? e) acc)
((pair? e) (helper e acc))
(else (cons e acc))))
acc
lst)))
Wollen Sie das Atom von 'HTDP/docs' oder einem anderen? – Majora320
danke, mit cond auf diese Weise war ein dummer Fehler. – user3128077