我想写一个过程(函数)来检查一个字符串是否包含另一个字符串。我从http://sicp.ai.mit.edu/Fall-2004/manuals/scheme-7.5.5/doc/scheme_7.html
中阅读了字符串库的文档根据from to them,
Pattern必须是字符串。搜索的最右边出现的字符串子字符串模式。如果成功,最后一个右边的索引匹配的子字符串的字符为返回;否则,返回#f
这对我来说似乎很奇怪,因为返回值是整数或布尔值,所以我应该将我的返回值与什么进行比较?
I tried
(define (case-one str)
(if (= #f (string-search-forward "me" str))
#t
#f))
DrScheme不喜欢它,
expand: unbound identifier in module in: string-search-forward
谢谢,
string-search-forward
不是标准化的Scheme程序;它是MIT-Scheme实现特有的扩展(这就是为什么您的链接指向"MIT Scheme参考手册")要查看仅那些保证的过程,请查看R5RS文档。
在Scheme中,#f
是唯一的值,表示"false",其他任何值在条件表达式中使用时都表示"true"。因此,将其与任何事物进行"比较"是没有意义的。在像string-search-forward
这样返回混合类型的情况下,你通常在一个变量中捕获返回值来测试它,然后使用它,如果它是非假的:
更高级的策略是使用cond
和=>
子句,这在某种意义上是上述子句的简写:
这样的形式(<test> => <expression>)
意味着,如果<test>
是真值,则计算<expression>
,这必须是一个单参数过程;这个过程以<test>
的值作为参数调用。
Scheme有一个非常小的标准库,这既是一件好事(您可以将小型方案实现嵌入到应用程序或设备中,您可以快速学习该语言),也是一件不幸的事(它缺少许多有用的功能)。string-search-forward
是MIT Scheme的非标准函数,DrScheme中没有。
许多库的添加都以srfi的形式提供。SRFI是社区采用的对基本语言的扩展——可以将其视为Scheme实现的可选部分。DrScheme(或者至少是它的后继球拍)实现了许多srfi。
DrScheme有许多字符串函数作为SRFI 13的一部分。在字符串搜索函数中,有string-contains
,它与之相似,只是它以相反的顺序接受参数。
(require srfi/13)
(define (case-one str)
(integer? (string-contains str "me")))
您将注意到这两个实现使用了不同的参数顺序(表明它们是独立开发的),但使用了相同的返回值。这说明在Scheme中,一个函数根据它所传递的内容返回不同的类型是很自然的。特别是,如果一个函数能完成它的工作,那么它通常会返回一条有用的信息,如果它不能完成它的工作,那么它会返回#f
。这样,函数自然地将完成任务(这里,返回子字符串的索引)与检查任务是否可行(这里,测试子字符串是否出现)结合起来。
错误信息似乎有点奇怪(不幸的是我没有安装drscheme,所以不能调查太多)
你确定str是字符串吗?
另外,=
仅用于整数比较,您可以使用false?
代替。
对于混合类型的string-search-forward
的返回值,scheme的心态是,只要能返回有用的值就应该返回,所以这意味着不同的函数返回类型是常见的。
尝试使用srfi-13的string-index: http://docs.racket-lang.org/srfi-std/srfi-13.html#Searching您正在查看的文档并不是专门针对PLT的。并且可能对应于Scheme的其他版本