Skip to content

[Feature request] Inline assertions whose success/failure result can be used in expressions #1885

@Rangi42

Description

@Rangi42

Spinoff from the comments of #201. I've encountered a use case for this twice recently:

  • In pokered, we twice want to do assert COND, "message" but then use COND in some further logic. Having to define a temp variable would be more trouble than it's worth vs just repeating the COND expression.
  • In pokecrystal, we repeat this pattern for getting an unlabeled SRAM location from its labeled WRAM counterpart:
    ld hl, sPlayerData + (wEventFlags - wPlayerData)
    ld hl, sPlayerData + (wHallOfFameCount - wPlayerData)
    ld hl, sPlayerData + (wPlayerID - wPlayerData)
    ; etc
    What I'd rather do:
    def Saved(label) = sPlayerData + (label - wPlayerData)  ; user-defined function
    ld hl, Saved(wEventFlags)
    ld hl, Saved(wHallOfFameCount)
    ld hl, Saved(wPlayerID)
    ; etc
    However, that would be unsafe to use without a precondition of label >= wPlayerData && label < wPlayerDataEnd. User-defined functions are single expressions, so we would need an expression assert:
    def Saved(label) = \  ; user-defined function
      assert(label >= wPlayerData && label < wPlayerDataEnd, "Cannot save label") * \
      sPlayerData + (label - wPlayerData)
    ld hl, Saved(wEventFlags)
    ld hl, Saved(wHallOfFameCount)
    ld hl, Saved(wPlayerID)
    ; etc

We could probably also handle three-arg assert(warn/fail/fatal, cond, msg).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementTypically new features; lesser priority than bugsrgbasmThis affects RGBASM

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions