Основы импорта модуля ракетки - PullRequest
4 голосов
/ 27 июня 2011

Я пытаюсь require один файл в другом при работе с 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 ()) )))))

ant.rkt:

(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))))))

Теперь я могу набрать (require "ant.rkt")в REPL, а затем, когда я набираю (gen-cell 'none 'white), я получаю сообщение об ошибке:

reference to undefined identifier: gen-cell  

Я просмотрел документацию по импорту и экспорту, но не могу правильно ее импортировать.Я чувствую, что это что-то действительно простое, чего я просто не понимаю в синтаксисе.

Как мне изменить свой код, чтобы я мог использовать gen-grid и gen-cell в ant.rkt?

1 Ответ

6 голосов
/ 27 июня 2011

Ваш код выглядит нормально, и когда я его тестировал, проблем не было.

Но обратите внимание на две вещи:

  1. В наши дни намного лучше начинать код с #lang racket (или #lang racket/base). Это не только стало соглашением, оно позволяет использовать любые синтаксические расширения, которые предоставляет язык, тогда как module означает, что вы используете sexpr по умолчанию. (Кстати, это также более удобно, поскольку вам не нужно, чтобы имя модуля совпадало с именем файла.)

  2. Использование load с модулями, вероятно, делает нечто иное, чем вы думаете. Лучше всего просто избегать использования load, по крайней мере, пока вы не будете точно знать, что он делает. (Это так же плохо, как eval.) Вместо этого вы всегда должны придерживаться require. И когда вы узнаете больше, вы можете увидеть, что иногда dynamic-require также полезен, но пока просто держите load.

...