I've wasted more time than I'd like to admit trying to: Fabricate a simple macro or template to reduce the tedious boilerplate code required to setup up lazy ( deferred i.e. only define on first access) object fields.
My stumbling block is extrapolating untype parameter data into valid Nim accepted syntax within the template/macro. eg. _user_ -> _m_user_ in the code below. I've tried various combinations of _templates_ / _macro_ / _quote do_ code to no avail :-(. I'm sure this is quite trivial in the hands of a more experienced Nim meta-programmer. Any help would be surely appreciated. import std/envvars, std/options type EnvType = object m_user: Option[string] var Env*: EnvType # How can I reduce boilerplate for defining deferred memoized object data field accessors # (eg. user) # using macro / template for the following # with parameters for: # - name - untyped fieldname -- eg. m_user # - value = untyped code to computer actual value -- eg "USER".getEnv # # Ideally I'd like a macro/template define_env: # # define_env user do: # USER.getEnv # # to generate: proc user*(env: var EnvType): string = if isNone(env.m_user): result = "USER".getEnv env.m_user = some result else: result = env.m_user.get when isMainModule: # define_env user do: USER.getenv # define_env icloud_dir do: "/Users/" & env.USER & "/Library/CloudStorage/Box-Box" echo Env.user # echo Env.icloud_dir Run