racket - 需要使用项目根目录中的模块路径吗?

标签 racket

我正在制作一个网络应用程序。考虑这样的结构

ProjectName/racket/Servlet.rkt
ProjectName/racket/chart/barchart/BarChart.rkt
ProjectName/template/barchart.svg

如何在 BarChart.rkt 模块内需要 Barchart.svg 模板,而不使用任何 ..?理想情况下,如果应用程序从 ProjectName 启动(即 cd ProjectName;racketracket/Servlet.rkt),则 require 部分将类似于 (require "template/barchart.svg"),但使用 ProjectName 作为根,而不是相对的 ProjectName/racket/barchart。

最佳答案

1)朴素方法

您可以使用(定义运行时路径):

项目名称/chart/barchart/BarChart.rkt:

#lang racket/base
(provide barchart-template)
(require
  racket/runtime-path
  racket/file)

(define-runtime-path barchart.svg "../../template/barchart.svg")

(define (barchart-template)
  (file->string barchart.svg))

项目名称/Servlet.rkt:

#lang racket/base
(require ProjectName/chart/barchart/Barchart)

(displayln (barchart-template)) ;; prints the content of the SVG file, wherever you are

2)更好的方法

注册您的包裹

根据我的经验,开发 Racket 应用程序时处理路径的最佳方法是制作一个包,然后使用经典的 (require my-package/my-module) 语法而不是使用相对路径.

例如,如果您有一个这样的项目:

ProjectName/Servlet.rkt
ProjectName/chart/barchart/BarChart.rkt
ProjectName/template/barchart.svg

通过在项目的根目录添加 info.rkt 文件,您可以将其转换为包。

echo "#lang info" > ProjectName/info.rkt

然后调用cd ProjectName; raco pkg 安装

然后您可以使用 在任何文件中 require BarChart.rkt(require ProjectName/chart/BarChart)

我为什么要告诉你这些?因为现在,您可以从任何文件夹启动应用程序:

racket -l 项目名称/Servlet

无论您在哪个目录中运行程序,这都可以让您轻松测试您的路径是否得到处理。

摆脱../..

现在您的包已在本地数据库中注册,您可以使用 pkg/lib 中的 (pkg-directory) 轻松找到它的根目录:

项目名称/chart/barchart/BarChart.rkt:

#lang racket/base
(provide barchart-template)
(require
  racket/file
  pkg/lib)

(define (barchart-template)
  (define template.svg (build-path (pkg-directory "ProjectName")
                                   "template/barchart.svg"))
  (file->string template.svg))

关于racket - 需要使用项目根目录中的模块路径吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55105211/

相关文章:

scheme - 简化递归函数语法的宏

conditional-statements - 应用程序 : not a procedure racket

lisp - 将列表中的字符串转换为 Racket 中的数字?

user-interface - 在 Racket 的 text% 上下文中添加右键菜单(弹出菜单%)

list - 如何处理传递给 Racket 函数的可变数量的参数?

scheme - 有在 Racket 中打印的想法吗?

functional-programming - 列表到 typedracket 中的树

lisp - Scheme中的Push和Pop怎么写?

scheme - 如何使用 with-type 在非类型化模块中使用类型化 Racket 片段?

scheme - 对 foldr/foldl 中的 "Init/Base"感到困惑( Racket )