【问题标题】:list-set not working in Racket列表集在球拍中不起作用
【发布时间】:2016-11-16 00:27:13
【问题描述】:

为什么列表集在 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 语句显示每个元素都被正确修剪,但返回的列表仍然有未修剪的项目。修剪后的元素不会替换列表中的原始元素。

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

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

【问题讨论】:

    标签: scheme racket


    【解决方案1】:

    这是因为 list-set 不是破坏性的(如果是,它的名字就是“list-set!”)。你可以解决这个问题

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

    无论如何,也可以考虑一个更诡计多端的解决方案,例如:

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

    【讨论】:

    • 完美解决方案。 Scheme代码总是在Racket中运行吗?
    • 我认为(define (trim-list s1) (map string-trim s1)) 既是scheme-y 又是racket-y。
    • 我的问题是,是否所有(或大部分)Scheme 代码都在未经修改的情况下在 Racket 中运行?
    • 感谢您提供非常有用的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-23
    • 1970-01-01
    • 2019-10-29
    相关资源
    最近更新 更多