Scheme R5RS define-syntax被忽略了吗?

erc*_*iou 1 scheme define-syntax undefined racket

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

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

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

reference to undefined identifier: let-string-start+end
Run Code Online (Sandbox Code Playgroud)

这是定义的

define-syntax let-string-start+end
Run Code Online (Sandbox Code Playgroud)

它似乎被忽略了?实际发生了什么?

dyo*_*yoo 8

您无需手动复制和粘贴SRFI 13中的项目:它内置于Racket中.事实上,大多数主要的SRFI库都与Racket捆绑在一起:http://docs.racket-lang.org/srfi/index.html

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

(#%require srfi/13)
Run Code Online (Sandbox Code Playgroud)

奇怪的#%require是一个特定于Racket的钩子,允许r5rs程序从Racket加载库模块.

因此,Racket中的r5rs程序将是这样的:

(#%require srfi/13)
(display (string-replace "foo world" "hello" 0 3))
(newline)
Run Code Online (Sandbox Code Playgroud)

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

#lang racket
(require srfi/13)
(string-replace "foo world" "hello" 0 3)
Run Code Online (Sandbox Code Playgroud)

遗憾的是,您报告的错误没有足够的信息来准确诊断问题.我怀疑在某个地方有不完整的复制和粘贴,因为你提到你是从SRFI复制的.我认为你错误复制代码的一个原因是你提到用以下方法定义它:

define-syntax let-string-start+end
Run Code Online (Sandbox Code Playgroud)

这条线实际上缺少一些重要的括号; 在原始资源中,在该线的前面有一个领先的paren.

但是你不应该试图手工剔除SRFI实现中的碎片,至少在你更熟悉Scheme之前.通过加载整个库简化.

  • 如果您使用的是Racket的R5RS模式,则需要使用`(#%require srfi/13)`. (2认同)