scheme - Getting an unbound identifier 'require' in scheme
问题描述
I am using Drracket for my project. I am using the language SICP(#lang sicp) for my project. For one of my implementations i require the use of scheme package called (require (planet dyoo/simply-scheme))
. Scheme is not recognising require keyword. But if i change my language to #lang racket "require" is recognised as an keyword. My project makes use of set-car!
and set-cdr!
which is available in sicp language and not in racket. Is there any work around.
Below is some excerpts of my code:
#lang sicp
(require (planet dyoo/simply-scheme))
(define crosscuts 0)
and
(define (move-north steps_to_move)
(set-cdr! current_position ( + (y_coord current_position) steps_to_move)))
解决方案
首先,我要注意以下几点:
- 它通常更好用
#lang racket
,因为#lang sicp
它非常有限。您仍然可以访问set-car!
(尽管它被命名为set-mcar!
)。请参阅https://docs.racket-lang.org/reference/mpairs.html上的文档。 - 如果您决定使用
#lang racket
,您真的需要使用可变数据结构吗?避免突变是函数式编程的定义特征。如果你真的需要可变数据结构,你可以用struct
with#:mutable
代替吗?它更像是 Racket-y。请参阅https://docs.racket-lang.org/reference/define-struct.html上的文档。 - 这可能是不可能的,但通常我会避免使用 Planet 包。Planet 是一个不再推荐的旧包系统。然而,新的包系统中似乎没有
simply-scheme
,所以你可能真的需要在这里使用 Planet。
如果你真的想使用#lang sicp
,请注意https://docs.racket-lang.org/sicp-manual/SICP_Language.html的边注
R5RS 无法
require
避免破坏使用该名称的程序require
。#%require
因此改为使用。
#%require
然而,这是一个更原始的操作。根据您的要求规范,从 . 切换require
到#%require
.
所以首先,尝试替换require
为#%require
,看看它是否有效。如果是,那太好了,你就完成了。
但如果它出错,则意味着您的要求规范无法由#%require
. 一种可能的解决方案是使用从 Racket#%require
获取require
,以便您可以使用require
它来做更复杂的事情。
(#%require (only racket require))
(require ....)