【问题标题】:How to capture the return value of `string-search-forward` in Scheme?如何在 Scheme 中捕获 `string-search-forward` 的返回值?
【发布时间】:2011-04-23 00:36:16
【问题描述】:

我想编写一个过程(函数)来检查一个字符串是否包含另一个字符串。我从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

谢谢,

【问题讨论】:

    标签: scheme


    【解决方案1】:

    string-search-forward 不是标准化的 Scheme 程序;它是 MIT-Scheme 实现特有的扩展(这就是为什么您的链接转到“MIT Scheme Reference Manual”的原因。)要查看那些保证的过程,请查看R5RS document

    在Scheme 中,#f唯一 表示“假”的值,在条件表达式中使用其他任何值都表示“真”。因此,没有必要将其与任何事物“比较”。在像string-search-forward 这样返回混合类型的情况下,您通常会在变量中捕获返回值来测试它,然后在它不为假时使用它:

    (let ((result (string-search-forward "me" str))) (如果结果 (munge 结果) ; S-S-F成功时执行(result为索引) (错误“hurf”);当 S-S-F 失败时执行(result 的值为 #f。) ))

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

    (cond ((string-search-forward "me" str) => munge) (否则(错误“hurf”)))

    (<test> => <expression>) 这样的形式表示如果<test> 为真值,则评估<expression>,这必须是一个单参数过程;此过程以 <test> 的值作为参数调用。

    【讨论】:

      【解决方案2】:

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

      许多库添加都以SRFIs 的形式提供。 SRFI 是社区采用的对基础语言的扩展——将其视为 Scheme 实现的可选部分。 DrScheme(或至少是它的继任者 Racket)implements many SRFIs

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

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

      您会注意到这两个实现使用不同的参数顺序(表明它们是独立开发的),但使用相同的返回值。这说明在 Scheme 中让函数根据它所传达的内容返回不同类型是很自然的。特别是,如果一个函数可以完成它的工作,它会返回一条有用的信息,或者如果它不能完成它的工作,它会返回#f。这样,该函数自然地将完成其工作(这里,返回子字符串的索引)与检查工作是否可行(这里,测试子字符串是否出现)结合起来。

      【讨论】:

        【解决方案3】:

        错误消息似乎有点奇怪(不幸的是,我没有安装 drscheme,因此无法进行过多调查)。

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

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

        对于string-search-forward的返回值是混合类型的,scheme的心态是只要能返回有用的值就应该返回,也就是说函数的返回类型是通用的。

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-12
            相关资源
            最近更新 更多