在方案中获取未绑定的标识符 '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)))

首先,我要注意以下几点:

  1. 通常使用#lang racket更好,因为#lang sicp非常有限。您仍然可以访问 set-car!(尽管它被命名为 set-mcar!)。请参阅 https://docs.racket-lang.org/reference/mpairs.html 处的文档。
  2. 如果您决定使用 #lang racket,您真的需要使用可变数据结构吗?避免突变是函数式编程的一个决定性特征。如果你真的需要可变数据结构,你可以使用 struct#:mutable 代替吗?更 Racket-y。请参阅 https://docs.racket-lang.org/reference/define-struct.html 处的文档。
  3. 这可能是不可能的,但通常我会避免使用 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 ....)