list-set在Racket中不起作用

时间:2016-07-13 12:06:06

标签: scheme racket

为什么列表集在Racket中的以下函数中不起作用:

(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 ")

println语句显示每个元素都被正确修剪,但返回的列表仍然有未修剪的项目。修剪过的元素不会替换列表中的原始元素。

列表集的文档在这里:https://docs.racket-lang.org/reference/pairs.html#%28def._%28%28lib._racket%2Flist..rkt%29._list-set%29%29

问题在哪里,我该如何解决?

1 个答案:

答案 0 :(得分:2)

这是因为列表集不具有破坏性(如果是,它的名称将是“list-set!”)。你可以用

解决这个问题
(set! sl (list-set sl i ss))

无论如何,还要考虑一个更方便的解决方案,例如:

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