Module 球拍模块导入基础
在使用Racket时,我试图Module 球拍模块导入基础,module,scheme,racket,Module,Scheme,Racket,在使用Racket时,我试图在另一个文件中要求。我在同一个文件夹中有两个文件。它们是world.rkt和ant.rkt world.rkt: (module world racket (provide gen-grid gen-cell) (define (gen-cell item fill) (cons item fill)) (define (gen-grid x y fill) (begin (define (gen-row x fill)
在另一个文件中要求。我在同一个文件夹中有两个文件。它们是world.rkt
和ant.rkt
world.rkt
:
(module world racket
(provide gen-grid gen-cell)
(define (gen-cell item fill)
(cons item fill))
(define (gen-grid x y fill)
(begin
(define (gen-row x fill)
(cond ((> x 0) (cons (gen-cell (quote none) fill)
(gen-row (- x 1) fill)))
((<= x 0) (quote ()) )))
(cond ((> y 0) (cons (gen-row x fill)
(gen-grid x (- y 1) fill)))
((<= y 0) (quote ()) )))))
(module ant racket
(require "world.rkt")
(define (insert-ant grid x y)
(cond ((> y 0) (insert-ant (cdr grid) x (- y 1)))
((< y 0) 'Error)
((= y 0) (begin
(define y-line (car grid))
(define (get-x line x)
(cond ((> x 0) (get-x (cdr line) (- x 1)))
((< x 0) 'Error)
(= x 0) (gen-cell 'ant (cdr (car line))) ))
(get-x y-line x))))))
现在,我可以在REPL中键入(需要“ant.rkt”)
,然后当我键入(gen cell'none'白色)
时,我会得到错误:
reference to undefined identifier: gen-cell
我查阅了有关导入和导出的文档,但无法正确导入。我觉得这是一件非常简单的事情,我只是不懂语法
我应该如何更改代码,以便在ant.rkt
中使用gen grid
和gen cell
?您的代码看起来很好,测试时没有问题
但请注意两件事:
现在用#lang racket
(或#lang racket/base
)开始编写代码要好得多。这不仅成为了惯例,它还允许使用该语言提供的任何语法扩展,而module
意味着您正在使用默认的sexpr。(顺便说一句,它也更方便,因为您不需要使模块名与文件名相同。)
在模块中使用load
可能会做一些与您认为不同的事情。最好不要使用load
,至少在您确切知道它在做什么之前。(这和eval
一样糟糕)相反,您应该始终坚持require
。当您了解更多信息时,您会发现有时动态需求
也很有用,但现在只需保持加载
也许你应该读一下:不,这个问题是关于无模块代码的include
。但是在这个问题上,dbmikus已经在使用模块了,所以他处于一个更好的起点;我假设您建议使用'require'或者只是在命令行上用文件调用racket。这一点现在反映在问题中。我可以键入(需要“ant.rkt”)
,但是当我调用(gen cell'none'白色)
时,我会收到一条错误消息,说gen cell
未定义。它似乎应该导入“world.rkt”
。我如何解决这个问题?啊,这使得答案更简单:您应该也从repl中要求world.rkt
,或者从ant.rkt
重新提供gen cell
绑定。例如,请看全部自始至终
。你是说我只需要#lang racket
和(模块…
我是否正确解释了这一点?这是否意味着当我编写#lang racket
时它会自动创建一个模块?是的,是的——但是lang racket
可以提供比(模块…)更多的东西
,随着时间的推移,更多的功能依赖于它。