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

时间:2011-04-23 00:36:16

标签: scheme

我想编写一个过程(函数)来检查字符串是否包含另一个字符串。我从http://sicp.ai.mit.edu/Fall-2004/manuals/scheme-7.5.5/doc/scheme_7.html

读了字符串库的文档

据他们说,

  

模式必须是字符串。搜索   最右边出现的字符串   子串模式。如果成功,   最后一个右边的索引   匹配子字符串的字符是   回;否则,返回#f。

这对我来说似乎很奇怪,因为返回值是整数或布尔值,那么我应该将我的返回值与?进行比较?

我试过

(define (case-one str)
  (if (= #f (string-search-forward "me" str))
      #t
      #f))

DrScheme不喜欢它,

expand: unbound identifier in module in: string-search-forward

谢谢,

4 个答案:

答案 0 :(得分:2)

string-search-forward不是标准化的Scheme程序;它是MIT-Scheme实现所特有的扩展(这就是你的链接转到“MIT Scheme Reference Manual”的原因。)要查看那些保证的程序,请查看{{3} }。

在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>的值作为参数调用此过程。

答案 1 :(得分:2)

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

许多图书馆新增内容以SRFIs的形式提供。 SRFI是社区采用的基本语言扩展 - 将其视为Scheme实现的可选部分。 DrScheme(或至少是其继任者球拍)implements many SRFIs

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

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

您会注意到这两个实现使用了不同的参数顺序(表明它们是独立开发的),但使用相同的返回值。这说明在Scheme中使用函数返回不同类型是很自然的,这取决于它传达的内容。特别是,如果函数能够完成其工作,则返回有用的信息是相当常见的,如果它无法完成其工作,则返回#f。这样,函数自然地结合它的工作(这里,返回子串的索引)和检查作业是否可行(这里,测试是否发生子串)。

答案 2 :(得分:1)

错误信息似乎有点奇怪(我没有安装drscheme,所以无法调查太多)。

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

此外=仅用于整数比较,您可以使用false?代替。

对于具有混合类型的string-search-forward的返回值,scheme具有以下思维模式:如果可以返回任何有用的值,则应该返回它,这意味着函数通常使用不同的返回类型。

答案 3 :(得分:1)

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