如果我想在運行時選擇性地需要模塊,我可以使用[dynamic-require
'1。如果我想要求已安裝包這個偉大的工程,例如:dynamic-require模塊相對於Racket中的當前模塊路徑(或如何在Racket中找到當前模塊路徑)
(dynamic-require 'racket/match 'match)
這將(提供我已經racket/match
安裝),需要racket/match
和評估的match
該庫結合。
但是,當我想要一個本地的,未安裝的模塊時,我遇到了麻煩。比方說,我有一些模塊調用eat.rkt
,它提供了一個功能:bite
:
#lang racket ;; eat.rkt
(provide bite)
(define (bite) "Nom nom")
現在讓我們說,我們希望做一個lunch.rkt
模塊需要eat.rkt
,並調用函數。此外,讓我們假設我把它們放在同一個目錄下:
#lang racket ;; lunch.rkt
(require "eat.rkt")
(bite) ; => Nom Nom
這是很好的,因爲我使用的靜態要求,但這種分崩離析的時候我想做一個dynamic-require
:
#lang racket ;; lunch2.rkt
(define bite (dynamic-require "eat.rkt" 'bite)
(bite) ; => Nom Nom
雖然這似乎沒問題,事實證明dynamic-require
所需的模塊不是基於模塊的路徑而是在current-directory
上。所以,如果我在模塊定義的目錄運行程序,這很好,但如果我在別的目錄是,一切都打破:
$ racket lunch2.rkt
"Nom Nom"
$ cd snacks/
$ racket ../lunch2.rkt
; default-load-handler: cannot open module file
顯然,如果我我可能只是改變current-directory
該模塊的目錄知道它在哪裏。但是如果我不知道這個模塊的路徑,有什麼辦法可以得到它嗎?或者更直接地說,是否有可能dynamic-require
模塊相對於需求的模塊路徑?
還有'定義的運行時模塊路徑 - index',其中(IIRC)也與'拉科distribute'合作和朋友。 –