如何告诉 Racket 程序加载可选配置代码?
How can I tell a Racket program to load optional configuration code?
我目前正在使用
将一些配置值加载到我的程序中
(require "config.rkt")
但是,这需要 config.rkt 存在。我希望能够将一些默认值放入我的程序中,并且仅当存在本地配置文件时才让 Racket 覆盖它们。
在 Python 我会做类似的事情:
try :
from local_configs import MAIN_PATH, MAX_ENTRIES
except :
MAIN_PATH = "~"
MAX_ENTRIES = 20
Racket 中的等价物是什么?
您可以使用 dynamic-require
along with an exception handler (with-handlers
).
编辑:我第一个提出的解决方案(使用 dynamic-require
的失败 thunk)没有处理 "config.rkt"
根本不存在的情况。添加异常处理解决了这个问题。
示例:
#lang racket
;; try to require the given name, returning default on failure
(define (get-config name default)
(with-handlers ([exn:fail? (λ (e) default)])
(dynamic-require "config.rkt" name)))
(define main-path (get-config 'main-path "~"))
(define max-entries (get-config 'max-entries 20))
;; just to show what the values are
(list main-path max-entries)
这是一个示例配置文件:
#lang racket
(provide main-path)
(define main-path "/home")
运行 带有示例配置模块的第一个模块产生如下结果:
'("/home" 20)
我目前正在使用
将一些配置值加载到我的程序中(require "config.rkt")
但是,这需要 config.rkt 存在。我希望能够将一些默认值放入我的程序中,并且仅当存在本地配置文件时才让 Racket 覆盖它们。
在 Python 我会做类似的事情:
try :
from local_configs import MAIN_PATH, MAX_ENTRIES
except :
MAIN_PATH = "~"
MAX_ENTRIES = 20
Racket 中的等价物是什么?
您可以使用 dynamic-require
along with an exception handler (with-handlers
).
编辑:我第一个提出的解决方案(使用 dynamic-require
的失败 thunk)没有处理 "config.rkt"
根本不存在的情况。添加异常处理解决了这个问题。
示例:
#lang racket
;; try to require the given name, returning default on failure
(define (get-config name default)
(with-handlers ([exn:fail? (λ (e) default)])
(dynamic-require "config.rkt" name)))
(define main-path (get-config 'main-path "~"))
(define max-entries (get-config 'max-entries 20))
;; just to show what the values are
(list main-path max-entries)
这是一个示例配置文件:
#lang racket
(provide main-path)
(define main-path "/home")
运行 带有示例配置模块的第一个模块产生如下结果:
'("/home" 20)