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