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

Reply via email to