首页 > 解决方案 > 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)))

标签: schemeracketsicp

解决方案


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

  1. 它通常更好用#lang racket,因为#lang sicp它非常有限。您仍然可以访问set-car!(尽管它被命名为set-mcar!)。请参阅https://docs.racket-lang.org/reference/mpairs.html上的文档。
  2. 如果您决定使用#lang racket,您真的需要使用可变数据结构吗?避免突变是函数式编程的定义特征。如果你真的需要可变数据结构,你可以用structwith#: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. 一种可能的解决方案是使用从 Racket#%require获取require,以便您可以使用require它来做更复杂的事情。

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

推荐阅读