我正在尝试做一个简单的任务,多次向一个字符串附加一个数字,并希望这会构建一个字符串。
但它没有用,每次拨打(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)
感谢您的帮助
答案 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
为了进一步告知您,可能有助于了解您的目标。