2016-06-30 9 views
1

Angenommen, ich habe die folgende Datei my-mod.rkt.Kann ich ein Modul mehrmals in einem Racket-Programm instanziieren?

#lang racket ;; my-mod.rkt 
(displayln "Module ran") 

Ich kann natürlich diese Datei ausführen, indem Sie das Modul in den ers oder einem anderen Skript Instanziierung:

(require "my-mod.rkt") 

Welche Module ran ausdruckt.

Allerdings, wenn ich das Modul nicht zweimal auf diese Weise ausführen kann. Wenn zum Beispiel benötige ich my-mod.rkt zweimal:

(require "my-mod.rkt") 
(require "my-mod.rkt") 

Das Modul nur einmal instanziiert wird. Was ist normalerweise das, was Sie für die Zwecke benötigen, aber in diesem Fall eine Instanziierung des Moduls hat eine Nebenwirkung, die ich gerne erhalten würde.

Offensichtlich konnte ich find-exe verwenden, um dies in einem anderen Teilprozess auszuführen:

(require compiler/find-exe) 
(system* (find-exe) "my-mod.rkt") 

aber dann dieses Programm Ich renne in einem anderen OS-Ebene Prozess, der nicht das, was ich tun möchte.

Kann ich also ein Modul zweimal im selben Racket-Programm instanziieren?

Antwort

0

Ja, Sie können ein Racket-Modul zweimal im selben Programm instanziieren. Sie können dies tun, indem Sie Ihre current-namespace ändern und namespace-require verwenden.

Das folgende Programm, zum Beispiel, wird das my-mod.rkt Modul benötigt zweimal:

#lang racket 
(define ns (current-namespace)) 
(parameterize ([current-namespace (make-base-namespace)]) 
    (namespace-require "my-mod.rkt")) 

(parameterize ([current-namespace (make-base-namespace)]) 
    (namespace-require "my-mod.rkt")) 

Und dieses Programm laufen wird Module ran zweimal ausdrucken:

Module ran 
Module ran 

Beachten Sie, dass dies in zwei tun separate Namespaces, und alles, was vom Modul importiert wird, ist in beiden Fällen unterschiedlich. Dieses Problem tritt am wahrscheinlichsten auf, wenn Sie namespace-attach-module verwenden, um das Modul von einem Namespace zu einem anderen zu verschieben.

Beachten Sie außerdem, dass alle Submodule, die Sie im aktuellen Modul deklariert haben, nicht mehr sichtbar sind, weil Sie current-namespace verwenden, um den Namespace zu ändern. Dies funktioniert nur, weil my-mod.rkt in einer anderen Datei ist, wenn es ein Submod wäre, könnten Sie dies nicht tun.

Verwandte Themen