在方案中获取未绑定的标识符 'require'
Getting an unbound identifier 'require' in scheme
我正在为我的项目使用 Dracket。我在我的项目中使用 SICP(#lang sicp) 语言。对于我的一个实现,我需要使用名为 (require (planet dyoo/simply-scheme))
的方案包。 Scheme 无法识别 require 关键字。但是,如果我将语言更改为 #lang racket,“require”将被识别为关键字。我的项目使用了 set-car!
和 set-cdr!
,它在 sicp 语言中可用,但在 racket 中不可用。有什么解决办法吗?
以下是我的代码的一些摘录:
#lang sicp
(require (planet dyoo/simply-scheme))
(define crosscuts 0)
和
(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
和 #: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 has no require
to avoid breaking programs that use the name require
. #%require
is therefore used instead.
然而,#%require
是一种更为原始的操作。根据您的需求规范,从 require
切换到 #%require
可能会也可能不会很容易。
所以首先,尝试将 require
替换为 #%require
并查看是否有效。如果是,太好了,你完成了。
但如果出错,则意味着#%require
无法处理您的需求规范。一种可能的解决方案是使用 #%require
从 Racket 获取 require
,这样您就可以使用 require
来做更复杂的事情。
(#%require (only racket require))
(require ....)
我正在为我的项目使用 Dracket。我在我的项目中使用 SICP(#lang sicp) 语言。对于我的一个实现,我需要使用名为 (require (planet dyoo/simply-scheme))
的方案包。 Scheme 无法识别 require 关键字。但是,如果我将语言更改为 #lang racket,“require”将被识别为关键字。我的项目使用了 set-car!
和 set-cdr!
,它在 sicp 语言中可用,但在 racket 中不可用。有什么解决办法吗?
以下是我的代码的一些摘录:
#lang sicp
(require (planet dyoo/simply-scheme))
(define crosscuts 0)
和
(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
和#: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 has no
require
to avoid breaking programs that use the namerequire
.#%require
is therefore used instead.
#%require
是一种更为原始的操作。根据您的需求规范,从 require
切换到 #%require
可能会也可能不会很容易。
所以首先,尝试将 require
替换为 #%require
并查看是否有效。如果是,太好了,你完成了。
但如果出错,则意味着#%require
无法处理您的需求规范。一种可能的解决方案是使用 #%require
从 Racket 获取 require
,这样您就可以使用 require
来做更复杂的事情。
(#%require (only racket require))
(require ....)