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

jor*_*dan 4 lisp string 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)
Run Code Online (Sandbox Code Playgroud)

这显示:

"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)
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助

Lin*_*per 8

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

要实际更改变量的值,您需要使用Scheme的语言形式分配给该变量进行赋值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
Run Code Online (Sandbox Code Playgroud)

但是,您可以在第一时间构建所需的表达式,而不必执行所有这些破坏性操作:

(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
Run Code Online (Sandbox Code Playgroud)

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

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

如果你必须分配"4567"给一个名为全局变量myString,那么你就可以简单地更换defineset!在任上述两个代码片段.然而,虽然set!有时会派上用场,但惯用方案倾向于set!谨慎使用s和其他破坏性操作.我喜欢将感叹号视为"谨慎行事!"


Joh*_*nts 7

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

如果这看起来不寻常,请考虑加法运算符+.当我写作

3+4

我不会改变37,刚刚返回操作的结果.

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

(define my-string (string-append (number->string 4) (number->string 5)))
(display my-string)
Run Code Online (Sandbox Code Playgroud)

你应该看到

45
Run Code Online (Sandbox Code Playgroud)

为了进一步提供建议,可能有助于了解您的目标.