• Eric Myhre's avatar
    Begin reboot of codegen; also, some research. · 3f138f7f
    Eric Myhre authored
    In research: I found that there are more low-cost ways to switch which
    methods are available to call on a value than I thought.  Also, these
    techniques work even for methods of the same name.  This is going to
    improve some code in NodeAssemblers significantly -- there are several
    situations where this will let us reuse existing pieces of memory
    instead of needing to allocate new ones; even the basicnode package
    now already needs updates to improve this.  It's also going to make
    returning representation nodes from our typed nodes *significantly*
    easier and and lower in performance costs.  (Before finding methodsets
    are in fact so feasible, I was afraid this was going to require our
    typed nodes to embed yet another small struct with a pointer back to
    themselves so we can have amortized availability of value that contains
    the representation's logic for the Node interface... which while it
    certainly would've worked, would've definitely made me sigh deeply.)
    Quite exciting for several reasons; only wish I'd noticed this earlier.
    
    Also in research: I found a novel way to make it (I believe) impossible
    to create zero values of a type, whilst also making a symbol available
    for it in other packages, so that we can do type assertions, etc,
    with that symbol.  This is neat.  We're gonna use this to make sure
    that types in your schema package can never be created without passing
    through any validation logic that the user applies.
    
    In codegen: lots of files disappear.  I'm doing a tabula rasa workflow.
    (A bunch of the old files stick around in my working directory, and
    are being... "inspirational"... but everything is getting whitelisted
    before any of it ports over to the new commits.  This is an effective
    way to force myself to do things like naming consistency re-checks
    across the board.  And there's *very* little that's getting zero change
    since the changes to pointer strategy and assembler interface are so
    sweeping, so... there's very little reason *not* to tabula rasa.)
    
    Strings are reimplemented already.  *With* representations.
    
    Most of the codegen interfaces stay roughly the same so far.
    I've exported more things this time around.
    
    Lots of "mixins" based on lessons learned in the prior joust.
    (Also a bunch of those kind-based rejections look *much* nicer now,
    since we also made those standard across the other node packages.)
    
    Some parts of the symbol munging still up in the air a bit.
    I think I'm going to go for getting all the infrastructure in place
    for allowing symbol-rename adjunct configuration this time.
    (I doubt I'll wire it all the way up to real usable configuration yet,
    but it'll be nice to get as many of the interventions as possible into
    topologically the right places to minimize future effort required.)
    
    There's a HACKME_wip.md file which contains some other notes on
    priorities/goals/lessoned-learned-now-being-applied in this rewrite
    which may contain some information about what's changing at a higher
    level than trying to track the diffs.  (But, caveat: I'm not really
    writing it for an audience; more my own tracking.  So, it comes with
    no guarantee it will make sense or be useful.)
    3f138f7f
nozeros.go 824 Bytes