问题描述
我正在为我的项目使用Drracket。我在项目中使用语言SICP( #lang sicp )。对于我的一种实现,我需要使用名为(require (planet dyoo/simply-scheme))
的方案包。方案无法识别require关键字。但是,如果我将语言更改为 #lang球拍,则“ require”将被识别为关键字。我的项目使用了set-car!
和 set-cdr!
,这些语言以sicp语言提供,而不是球拍。有没有解决的办法。
以下是我的代码的摘录:
#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
一起使用?更像是球拍。请参阅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
无法处理您的要求规范。一种可能的解决方案是使用#%require
从Racket中获取require
,以便您可以使用require
来做更复杂的事情。
(#%require (only racket require))
(require ....)