如何告诉 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)