2017-09-26 4 views
2

Racket ist hat Module Paths (Prädikat ist module-path?), Resolved Module Paths (Prädikat ist resolved-module-path?) und Module Path Indexes (Prädikat ist module-path-index?).Was für ein Modul Pfad Index in Racket

Ich denke, ein module-path? ist alles, was plausibel auf ein Modul verweisen könnte. Und ich denke, dass ein aufgelöster Modulpfad auf ein tatsächliches Modul auf dem System zeigt.

Aber was ist ein Modulpfadindex und was bringt es mir nur über einen aufgelösten Modulpfad?

+0

Verschieben Sie dies zu einem Kommentar ;-) Teil des Puzzles ist, dass Modulpfadindizes halb-interniert sind, was für das Modulsystem wichtig ist (ein Modul zweimal laden ist eine schlechte Idee). – soegaard

+0

Yup, sie sind halb interniert, nur um das Laden zu erleichtern.Manchmal möchten Sie ein Modul sogar zweimal laden, z. B. wenn Sie DrRacket schreiben und das Modul ausgeführt werden soll, wenn der Benutzer auf "Ausführen" klickt. –

Antwort

2

Ein module-path? enthält alles, was require d sein kann. Könnte ein path? sein, könnte ein Symbol sein, könnte ein Submodul Pfad (submod "food.rkt" lunch) sein. Siehe require in den Dokumenten.

A resolved-module-path? ist ein "absoluter Pfad", wo das Modul Racket (Anmerkung 1) finden. Die Grammatik für aufgelöste Modulpfade ist begrenzter (d. H. Weniger mehrdeutig) als für Modulpfade.

A module-path-index? (MPI) ist ein Delta von einem module-path-index? zu einem anderen (Anmerkung 2). Verwenden Sie module-path-index-join zum Erstellen von MPIs (Hinweis 3).

  • (module-path-index-join #f #f) ist ein Delta von dem aktuellen Modul selbst.
  • (module-path-index-join "dumplings.rkt" #f) ist ein Delta von #f (das aktuelle Modul) mit dem relativen Pfad "./dumplings.rkt" (Ja es ist wirklich Pfad zuerst, dann Basis.)
  • (module-path-index-join "nom-noms.rkt" (module-path-index-join "dumplings.rkt" #f)) ist ein Delta von dem Strommodul "./dumplings.rkt" zu "./nom-noms.rkt". Racket baut MPIs wie folgt auf, wenn eine Datei statisch eine andere benötigt --- diese können miteinander verkettet werden, um die Bindung einer Kennung zu finden.
  • (module-path-index-join '(submod test) #f) bezieht sich auf das Test-Submodul im aktuellen Modul.

Hoffe, dass hilft.


Anmerkung 1: Wenn das Modul in einer Datei ist, denn es ist ein aufgelöster Pfad ist ein absoluter Dateipfad. Wenn das Modul das Ergebnis des Aufrufs von eval für ein Syntaxobjekt ist, ist sein resolved-module-path? etwas anderes.

Hinweis 2: IMO "Modulpfaddeltas" wäre ein besserer Name.

Hinweis 3: module-path-index-join akzeptiert ein drittes optionales Argument, wenn die ersten beiden Argumente #f sind. Dadurch kann sich ein Modul auf eines seiner eigenen Submodule beziehen. Sie werden diese Funktion im Allgemeinen nicht direkt verwenden wollen. Verwenden Sie stattdessen quote-module-path.