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)
谢谢你的帮助
表达式的(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,那么你就可以简单地更换define与set!在任上述两个代码片段.然而,虽然set!有时会派上用场,但惯用方案倾向于set!谨慎使用s和其他破坏性操作.我喜欢将感叹号视为"谨慎行事!"
string-append不会改变现有的字符串; 它返回一个新的字符串,该字符串是操作的结果.
如果这看起来不寻常,请考虑加法运算符+.当我写作
3+4
我不会改变3成7,刚刚返回操作的结果.
所以,在你的情况下,如果你写
(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)
为了进一步提供建议,可能有助于了解您的目标.