2016-07-13 6 views
0

Warum ist list-Set nicht in folgenden Funktion in Racket arbeiten:list-Set nicht in Racket arbeitet

(define (trimlist sl) 
    (let ((num 0) (ss "")) 
    (set! num (length sl)) 
    (for ((i num)) 
     (println i) 
     (set! ss (list-ref sl i)) 
     (println ss) 
     (set! ss (string-trim ss)) 
     (println ss) 
     (list-set sl i ss) ) 
    sl)) 

> (trimlist (list " a" "b " " c ")) 
0 
" a" 
"a" 
1 
"b " 
"b" 
2 
" c " 
"c" 
'(" a" "b " " c ") 

Die println Aussagen zeigen, dass jedes Element richtig getrimmt wird immer aber die zurückgegebene Liste hat noch unbeschnittene Elemente. Die getrimmten Elemente ersetzen keine Originalelemente in der Liste.

Die Dokumentation der list-Set ist hier: https://docs.racket-lang.org/reference/pairs.html#%28def._%28%28lib._racket%2Flist..rkt%29._list-set%29%29

Wo ist das Problem und wie kann ich es lösen?

Antwort

2

Dies ist, weil list-set nicht destruktiv ist (wenn es wäre, wäre der Name "list-set!"). Sie können beheben, die mit

(set! sl (list-set sl i ss)) 

Wie dem auch sei, sollten auch eine schemish Lösung, wie:

(define (trim-list sl) (map string-trim sl)) 
+0

Perfekte Lösungen. Wird der Schema-Code immer in Racket ausgeführt? – rnso

+0

Ich würde '(definieren (Trim-Liste S1) (Karte String-Trim S1))' sowohl Schema-y und Racket-y. –

+0

Meine Frage hier ist, ob alle (oder die meisten) Schema-Code in Racket ohne Änderung ausgeführt wird? – rnso