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)
它似乎被忽略了?实际发生了什么?
您无需手动复制和粘贴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之前.通过加载整个库简化.