2301_79595472 2024-02-06 14:17 采纳率: 0%
浏览 7

初心者,自学Racket有个问题搞不懂,求帮助

想请问一下怎么样增加或删除原来 string 的元素?

A string is a fixed-length array of characters.字符串是固定长度的字符数组。

为什么要固定长度?要删除元素都像这样生成新的 string ,徒然增加开销

(define str "hello world")
(let ([str (string-append          ;拼接字符串
             (substring str 0 4)   ;取前半部分
             (substring str 5))])  ;取后半部分
  str)                             ;=>"hell world"

我试着把字符串转换成 mutable list 或者 hashtable 来操作,很麻烦

fp为了避免副作用,尽量保持变量的不变性?为什么Racket的 string 不能像rust、C++一样用成员函数:

let s = String::from("hello world");
s.remove(4);

racketdata-lib库里面发现了gvector(可增长向量)以及Skip Lists(可以修改元素,但没有list->skip-list这种函数,需要手动创建)。还想看看各位hacker们是怎么解决这个问题的

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-02-06 14:18
    关注

    引自免费微信小程序:皆我百晓生

    在Racket(以及大多数Scheme和Common Lisp方言)中,字符串是不可变的,这意味着你不能直接修改一个已存在的字符串。设计上这样的原因在于:

    1. 函数式编程理念:正如您提到的,函数式编程风格强调避免副作用,确保数据结构的不变性有助于简化程序状态管理和并行计算。

    2. 效率考量:尽管生成新字符串看起来增加了开销,但在许多情况下,编译器和运行时可以优化字符串操作,比如共享不变部分的内存,从而减少实际开销。另外,不可变数据结构允许缓存和重用,对于长时间运行的应用程序或需要大量字符串处理的场景是有益的。

    3. 安全性和并发性:由于字符串不可变,在多线程环境中使用它们更安全,不会出现竞态条件问题。

    对于您的需求,如果您确实希望对字符串进行增删操作,可以将其转换为可变序列类型,例如list或者vector,然后进行修改。但请注意,这通常仅限于需要频繁修改的情况,因为转换本身也会有开销。

    下面是一个将字符串转换为可变向量,并进行元素删除的例子:

    #lang racket
    
    (require racket/vector)
    
    (define str "hello world")
    
    ; 将字符串转换为可变向量
    (define mutable-str (vector->mutable-vector (string->list str)))
    
    ; 删除第四个字符(Racket中的索引从0开始)
    (vector-delete! mutable-str 3)
    
    ; 转换回字符串
    (define new-str (list->string (vector->list mutable-str)))
    
    (new-str) ; 输出: "hell wrld"
    

    然而,大部分时候,您仍然会遵循Lisp系语言的习惯,通过组合、拼接等操作来处理字符串,而不是直接修改它们的内容。如需在不改变原始字符串的情况下模拟类似成员函数的操作,您可以创建辅助函数:

    (define (remove-char-at str index)
      (let-values ([(prefix suffix)
                    (split-at (string->list str) (+ index 1))])
        (list->string (append prefix (rest suffix)))))
    
    (define str "hello world")
    (remove-char-at str 4) ; 输出: "hell wrld"
    

    总之,Racket中的字符串设计符合其函数式编程语言的设计哲学,虽然它没有提供像C++或Rust那样的直接修改字符串内容的方法,但这有利于保证程序的简洁性和安全性。

    评论

报告相同问题?

问题事件

  • 修改了问题 2月7日
  • 修改了问题 2月7日
  • 修改了问题 2月7日
  • 修改了问题 2月6日
  • 展开全部