如何在Scheme中获取' string-search-forward '的返回值



我想写一个过程(函数)来检查一个字符串是否包含另一个字符串。我从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这样返回混合类型的情况下,你通常在一个变量中捕获返回值来测试它,然后使用它,如果它是非假的:

<>之前(let ((result (string-search-forward "me" str)))(如果结果(munge result) ;S-S-F成功时执行(result为索引)(error "hurf") ;S-S-F失败时执行(result的值为#f)))之前

更高级的策略是使用cond=>子句,这在某种意义上是上述子句的简写:

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

这样的形式(<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的其他版本

最新更新