2013-07-27 15 views
7

Chcę załadować obraz i animować go w Racket. Mogę to zrobić z łatwością w grze Dr. Racket, ale używam Emacsa z Geizerem. Aby załadować obraz Ptrzebuję:Import nakładających się modułów w Rakiecie

(require racket/draw) 

Następny, aby narysować obraz na ekranie, mam zamiar użyć modułu big-bang. Aby załadować ten moduł muszę:

(require 2thdp/image) 

Ale otrzymuję ten błąd:

module: identifier already imported from: 2htdp/image 
at: make-pen 
in: racket/draw 
errortrace...: 

to w zasadzie oznacza, że ​​nie można importować ten sam moduł dwukrotnie. Ale potrzebuję obu tych bibliotek. Jak mogę uniknąć tego problemu?

Odpowiedz

11

Gdy dwa moduły udostępniają funkcje o tej samej nazwie, można zmienić nazwy funkcji podczas importu.

Prostym sposobem na to jest zmiana nazwy wszystkich funkcji z jednego z modułów, zmiana nazwy wszystkich z nich za pomocą jakiegoś wspólnego prefiksu. Można to zrobić z modyfikatorem prefix-in do require:

(require racket/draw) 
(require (prefix-in htdp: 2htdp/image)) 

make-pen  ; the `make-pen` from racket/draw 
htdp:make-pen ; the `make-pen` from 2htdp 

Nawiasem mówiąc, nie ma nic szczególnego w :, to tylko konwencja Widziałem używane. Zamiast htdp: prefiks może być (powiedzmy) htdp-. Niezależnie od tego, czego używasz, jest ono dodawane do wszystkich nazw podanych przez ten moduł.

Jeśli tylko jedna nazwa funkcji jest w konflikcie, możesz zmienić nazwę tylko jednej funkcji z jednego z modułów, używając rename-in.

Aby uzyskać więcej informacji, patrz require.

+0

Dziękuję bardzo. – Roald

+1

Popraw mnie, jeśli się mylę, ale tradycja pochodzi z pakietów CL, prawda? – jozefg

+0

@Chris Dziękuję za edycję mojego mózgu, tam! –

Powiązane problemy