【问题标题】:Scheme R5RS define-syntax ignored?方案 R5RS 定义语法被忽略?
【发布时间】:2012-03-16 01:32:04
【问题描述】:

刚开始学习Scheme。 我使用 Dr. Racket 作为我的编译器/解释器。

我需要一些字符串函数(确切地说是字符串替换),所以我从SRFI 13 复制。

当我测试它时,它显示..

reference to undefined identifier: let-string-start+end

这是用

定义的
define-syntax let-string-start+end

它似乎被忽略了?到底发生了什么?

【问题讨论】:

    标签: scheme undefined racket define-syntax


    【解决方案1】:

    您无需从 SRFI 13 手动复制和粘贴项目:它内置于 Racket 中。其实大部分主要的SRFI库都捆绑了Racket:http://docs.racket-lang.org/srfi/index.html

    如果您在 Racket 中使用 r5rs 语言,则可以使用以下行拉入 SRFI 13:

    (#%require srfi/13)
    

    看起来很奇怪的#%require 是特定于Racket 的hook,它允许r5rs 程序从Racket 加载库模块。

    所以 Racket 中的 r5rs 程序应该是这样的:

    (#%require srfi/13)
    (display (string-replace "foo world" "hello" 0 3))
    (newline)
    

    如果您不使用基本的 r5rs 语言,而是使用成熟的 #lang racket,则导入 SRFI 13 看起来会相似。这是#lang racket 中的一个小程序,与上一个程序的作用相同:

    #lang racket
    (require srfi/13)
    (string-replace "foo world" "hello" 0 3)
    

    很遗憾,您报告的错误没有足够的信息来准确诊断问题。我怀疑某处的复制和粘贴不完整,因为您提到您从 SRFI 13 复制。我认为您可能错误复制代码的一个原因是您提到定义它:

    define-syntax let-string-start+end
    

    那行实际上缺少一些关键的括号;在原始来源中,该行的前面有一个前导括号。

    但是您不应该尝试手动从 SRFI 实现中剔除零碎,至少在您更熟悉 Scheme 之前不要这样做。通过加载整个库来简化。

    【讨论】:

    • 它似乎无法识别“require”。也许是因为我使用的是 R5RS?不知道:/
    • 如果您使用的是 Racket 的 R5RS 模式,则需要使用(#%require srfi/13)
    • 非常感谢大家,这两种方法都成功了。克里斯,这是 R5RS 的标准语法吗? “#%”是怎么回事?
    • 很高兴看到它正在工作!我已将克里斯的评论纳入答案。 #%require 是一个特定于 Racket 的钩子,它可以让 R5RS 程序拉入 Racket 模块。
    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2010-09-10
    • 2019-05-13
    • 1970-01-01
    • 2016-04-18
    相关资源
    最近更新 更多