1

我是(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。我做错了吗?

4

2 回答 2

3

根据球拍文档

字符串可以是可变的或不可变的。当将不可变字符串提供给类似 的过程string-set!时,exn:fail:contract会引发异常。默认读取器生成的字符串常量(请参阅读取字符串)是不可变的,并且它们在read-syntax模式下被实习。

您可以使用string-copy来制作字符串的副本,这总是返回一个可变字符串。

(define greeting (string-copy "Hello; Hello!"))
于 2013-07-21T05:36:13.750 回答
0

您的代码不应该根据R5RSR6RS工作。它明确指出:

(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. 大部分都Scheme可以工作,但不是固定车!或设置-cdr!。

我建议您根据您的教程使用 Scheme 标准。要使用球拍从命令行运行 Scheme 标准,您可以启动plt-r5rsplt-r6rs。在DrRacket您可以使用左下角的选择语言。选择“其他 > 传统语言 R5RS”或选择球拍语言并使用以下命令启动定义窗口:

#!r6rs
(import (rnrs))

DrRacket 有一个调试器,所以我推荐它。我搜索了你的线路,如果你在 Fixnum Days 遵循自学计划,它符合R5RS 标准

如果您想学习racket,我推荐Realm of racket (2013),因为您制作游戏,这很有趣。还有一本名为How to design programs (2003)的免费书籍。

于 2013-07-21T21:00:05.350 回答