我是(Lisp)计划编程的新手,并且一直在关注本教程。一切顺利,直到我使用字符串集!
的字符串设定!用于替换索引处的字符。我在下面做的一个例子:
Welcome to Racket v5.1.3.
> (define greeting "Hello; Hello!")
> (string-set! greeting 1 #\a)
string-set!: expects type <mutable string> as 1st argument, given: "Hello; Hello!"; other arguments were: 1 #\a
=== context ===
/usr/share/racket/collects/racket/private/misc.rkt:85:7
> greeting
"Hello; Hello!"
>
执行(string-set! greeting 1 #\a)
时,应根据教程将第一个“ e ”替换为“ a ”。输出应为:
> greeting
"Hallo; Hello!"
但我收到错误string-set!: expects type <mutable string> as 1st argument
。
我这样做是错误的吗?
答案 0 :(得分:3)
字符串可以是可变的或不可变的。当向
string-set!
之类的过程提供不可变字符串时,会引发exn:fail:contract
异常。默认阅读器生成的字符串常量(请参阅阅读字符串)是不可变的,它们以read-syntax
模式实现。
您可以使用string-copy
制作字符串的副本,这总是会返回一个可变字符串。
(define greeting (string-copy "Hello; Hello!"))
答案 1 :(得分:0)
(define (g) "***")
(string-set! (g) 0 #\?) ===> error
您的教程可能会出错。你需要使字符串变为可变:
(define greeting (string-copy "Hello; Hello!"))
(string-set! greeting 1 #\a)
greeting ; ==> "Hallo; Hello!"
顺便说一句:当您从窗口环境中的命令行或Racket
启动DrRacket
时,您不应该写Scheme
,而是一种与标准racket
不同的方言1}}。大多数Scheme
都会起作用,但不会开车!或者set-cdr!。
我建议您根据教程使用Scheme标准。要使用racket从命令行运行Scheme标准,您可以启动plt-r5rs
或plt-r6rs
。在DrRacket
中,您可以使用左下方的选择语言。选择“其他&gt;旧语言R5RS”或选择球拍语言并使用以下命令启动定义窗口:
#!r6rs
(import (rnrs))
DrRacket有一个调试器,所以我推荐它。我用谷歌搜索你的行,如果你在Fixnum Days 中跟随自学计划,它就符合R5RS standard。
如果你想学习racket
,我推荐Realm of racket (2013),因为你制作游戏很有趣。还有一本名为How to design programs (2003)的免费书。