On this page:
Config  Ref?
config-ref
config-get
config-put
8.12

4.1 应用程序配置管理🔗

 (require azelf/std/config) package: azelf

该模块是基于get-preferenceput-preferences的封装。这两个函数都有一个可选参数pathname,如果设为#f,那么它就会去读取系统的配置,这个配置可以从
(find-system-path 'pref-file)
找到。

说回这个config封装,我们这个config最好是用户的配置,不要再去污染系统,例如每个单独的程序都以自己的配置文件,而且相互独立、隔离,不能都放到系统配置上。基于这个前提,用户就需要自己管理配置文件,一旦确定配置路径(或称为filepath),就可以我们这个模块了。

第一步就是将它包装进我们为之准备的房舍。
(define ref (config-ref filepath))
这个ref就是我们配置文件的引用,之后就能进行读(config-get)写(config-put)了。

procedure

(ConfigRef? a)  boolean?

  a : any/c

procedure

(config-ref ref)  ConfigRef?

  ref : path-string?
配置文件的包装,在此包装上,提供一些额外的方法。

procedure

(config-get key config)  (Maybe/c any/c)

  key : symbol?
  config : ConfigRef?
从配置文件config中读取单项键值。

从配置文件中读取,结果就两种:读得到与读不到。不管文件存不存在,这个函数都不会抛出任何异常;如果能正确读取,返回Just,除此之外的所有情况都返回nothing

; 文件不存在
(define ref (config-ref "/a/not/exist"))
 
(config-get 'name ref) ; Nothing
 
; 存在的文件
(define ref (config-ref "./my-config.rktd"))
(config-get 'name ref) ; Just 1
(config-get 'unkown ref) ; Nothing

procedure

(config-put key value config)  void?

  key : symbol?
  value : any/c
  config : ConfigRef?
将配置项写回配置文件,不管文件存不存在,都可以调用该函数:如果不存在就会自动创建。

(define ref (config-ref "my.rktd"))
(config-put 'name "this is my name" ref) ; 完成,并自动创建my.rktd文件