如何在Scheme中捕获`string-search-forward`的返回值?

问题描述:

我想写一个过程(函数)来检查一个字符串是否包含另一个字符串。我从http://sicp.ai.mit.edu/Fall-2004/manuals/scheme-7.5.5/doc/scheme_7.html如何在Scheme中捕获`string-search-forward`的返回值?

阅读串库的文档,从他们根据,

模式必须是一个字符串。搜索 字符串,用于 子字符串模式的最右端。如果成功,则返回 匹配子串的最后一个 字符右侧的索引号为 ;否则,返回#f。

这对我来说很奇怪,因为返回值是整数或布尔值,所以我应该如何比较我的返回值?

我试图

(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方案实现特有的一个扩展(这就是为什么你的链接转到“MIT方案参考手册”。)要查看只有那些有保证的程序,请看R5RS document

在Scheme中,#f只有值表示“false”,在条件表达式中使用时的任何其他值都表示“true”。因此,将它与任何事物“比较”都没有意义。在这样string-search-forward返回混合类型的情况下,你通常捕捉一个变量的返回值进行测试,然后使用它,如果它是不假:

 
(let ((result (string-search-forward "me" str))) 
    (if result 
     (munge result) ; Execute when S-S-F is successful (result is the index.) 
     (error "hurf") ; Execute when S-S-F fails (result has the value #f.) 
)) 

更先进的办法是使用cond=>条款这是在某种意义上用于上述的缩写:

 
(cond ((string-search-forward "me" str) => munge) 
     (else (error "hurf"))) 

这种形式(<test> => <expression>)意味着如果<test>是一个真值,然后<expression>进行评价时,其必须是一个参数的过程;这个过程被称为<test>作为参数。

+0

谢谢。我现在明白了。 – Chan 2011-04-23 06:07:01

错误消息似乎有些奇怪(我没有drscheme不幸的是安装这样做会没有太多的调查)。

你确定str是一个字符串吗?

此外=仅用于整数比较,您可以改为使用false?

至于string-search-forward混合类型的返回值,方案有一个心态,如果任何有用的值可以返回,它应该返回,所以这意味着不同的返回类型是常见的函数。

尝试使用srfi-13的字符串索引:http://docs.racket-lang.org/srfi-std/srfi-13.html#Searching您正在查看的文档不是专门针对PLT的。并可能对应于Scheme的其他版本。

Scheme有一个非常小的标准库,它既是一个祝福(你可以让小的方案实现嵌入到应用程序或设备中,你可以快速学习语言)和一个诅咒(它缺少很多有用的功能)。 string-search-forward是麻省理工学院计划的一个非标准功能,它不存在于DrScheme中。

许多图书馆增加可用SRFIs的形式。 SRFI是社区对基本语言的扩展 - 将其视为计划实施的可选部分。 DrScheme(或至少其后继者Racket)implements many SRFIs

DrScheme有一些字符串函数作为SRFI 13的一部分。在string searching functions中,有string-contains,除了它的参数是相反的顺序之外,它是相似的。

(require srfi/13) 
(define (case-one str) 
    (integer? (string-contains str "me"))) 

你会发现,这两种实现使用不同的参数顺序(表明它们是独立开发的),但使用相同的返回值。这说明在Scheme中有一个函数根据它传递的内容返回不同的类型是很自然的。特别是,如果一个函数能够完成它的工作,则返回一个有用的信息是相当常见的,或者如果它不能完成工作则返回一个有用的信息。这样,函数自然地将它的工作(这里,返回子字符串的索引)与检查作业是否可行(在这里测试是否出现子字符串)结合起来。

+0

非常感谢。我希望我能投两个答案。 – Chan 2011-04-23 06:06:45