Lisp Scheme使用(string-set!)错误遇到

时间:2013-07-21 05:31:19

标签: string lisp scheme

我是(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。 我这样做是错误的吗?

2 个答案:

答案 0 :(得分:3)

根据Racket documentation

  

字符串可以是可变的或不可变的。当向string-set!之类的过程提供不可变字符串时,会引发exn:fail:contract异常。默认阅读器生成的字符串常量(请参阅阅读字符串)是不可变的,它们以read-syntax模式实现。

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

(define greeting (string-copy "Hello; Hello!"))

答案 1 :(得分: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不同的方言1}}。大多数Scheme都会起作用,但不会开车!或者set-cdr!。

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

#!r6rs
(import (rnrs))

DrRacket有一个调试器,所以我推荐它。我用谷歌搜索你的行,如果你在Fixnum Days 中跟随自学计划,它就符合R5RS standard

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