【问题标题】:Getting an unbound identifier 'require' in scheme在方案中获取未绑定的标识符“需要”
【发布时间】:2020-11-08 16:04:16
【问题描述】:

我在我的项目中使用 Drracket。我正在为我的项目使用语言 SICP(#lang sicp)。对于我的一个实现,我需要使用名为(require (planet dyoo/simply-scheme)) 的方案包。 Scheme 无法识别 require 关键字。但是,如果我将语言更改为 #lang racket,“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)))

【问题讨论】:

    标签: scheme racket sicp


    【解决方案1】:

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

    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 没有require 以避免破坏使用名称require 的程序。因此使用#%require

    #%require 是一个更原始的操作。根据您的需求规范,从require 切换到#%require 可能会也可能不会容易。

    首先,尝试将require 替换为#%require 并查看它是否有效。如果是,那就太好了,你就完成了。

    但如果出错,则意味着#%require 无法处理您的需求规范。一种可能的解决方案是使用#%require 从Racket 获取require,这样您就可以使用require 来做更复杂的事情。

    (#%require (only racket require))
    (require ....)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 2019-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-07-27
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多