Module 球拍模块导入基础

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)

在使用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)
        (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
    可以提供比
    (模块…)更多的东西
    ,随着时间的推移,更多的功能依赖于它。