字符串附加不起作用;继续覆盖以前的字符串

时间:2011-11-21 06:08:07

标签: string lisp scheme append

我正在尝试做一个简单的任务,多次向一个字符串附加一个数字,并希望这会构建一个字符串。

但它没有用,每次拨打(string-append ....)似乎都什么都不做。

这是我的代码:

(define myString "")
(string-append (number->string 4) myString)
(string-append (number->string 5) myString)
(string-append (number->string 6) myString)
(string-append (number->string 7) myString)
(display myString)

显示:

“4”

“5”

“6”

“7”

(display myString)

的空白行

我做错了什么?

如果我以其他方式这样做,它也不起作用:

(define myString "")
(string-append myString (number->string 4))
(string-append myString (number->string 5))
(string-append myString (number->string 6))
(string-append myString (number->string 7))
(display myString)

感谢您的帮助

2 个答案:

答案 0 :(得分:8)

表达式(string-append (number->string 4) myString)的计算结果为"4",这就是您的代码打印4的原因。同样,(string-append (number->string 5) myString)评估为"5",依此类推。两者都没有实际改变变量myString的值。

要实际更改变量的值,您需要使用Scheme的语言表单<{1>} 分配给该变量。set!。 (名称中的!是一个Scheme约定,告诉您这是破坏性操作 - 也就是说,它会破坏myString中的先前值并替换它一个新的。)例如,你可以写:

(define myString "")
(set! myString (string-append myString (number->string 4))) ;; assigns "4" to myString
(set! myString (string-append myString (number->string 5))) ;; assigns "45" to myString
(set! myString (string-append myString (number->string 6))) ;; assigns "456" to myString
(set! myString (string-append myString (number->string 7))) ;; assigns "4567" to myString
(display myString) ;; prints 4567

但是,你可以在一开始就建立你想要的表达,而不必做所有那些破坏性的操作:

(define myString 
  (string-append (number->string 4) 
    (string-append (number->string 5) 
      (string-append (number->string 6) 
        (string-append (number->string 7) "")))))
(display myString) ;; prints 4567

在那一点上,我不是编写那么重复的代码,而是做fold-right

(define myString 
  (fold-right (lambda (num str) 
                (string-append (number->string num) str)) 
    "" (list 4 5 6 7)))
(display myString) ;; prints 4567

如果您必须将"4567"分配给名为myString的全局变量,则只需在上述两个代码段中的define中替换set!。然而,尽管set!有时会派上用场,但惯用方案倾向于谨慎使用set!和其他破坏性操作。我喜欢将感叹号视为“谨慎行事!”

答案 1 :(得分:7)

string-append不会改变现有的字符串;它返回一个新的字符串,该字符串是操作的结果。

如果这看起来不寻常,请考虑加法运算符+。我写的时候

3+4

我没有将3更改为7,只是返回操作的结果。

所以,在你的情况下,如果你写

(define my-string (string-append (number->string 4) (number->string 5)))
(display my-string)

你应该看到

45

为了进一步告知您,可能有助于了解您的目标。