• Top
    • Documentation
    • Books
    • Recursion-and-induction
    • Boolean-reasoning
    • Debugging
    • Projects
    • Std
    • Proof-automation
    • Macro-libraries
    • ACL2
    • Interfacing-tools
    • Hardware-verification
    • Software-verification
      • Kestrel-books
        • Crypto-hdwallet
        • Error-checking
        • Apt
        • Abnf
        • Fty-extensions
        • Isar
        • Kestrel-utilities
        • Prime-field-constraint-systems
        • Soft
        • Bv
        • Imp-language
        • Event-macros
        • Bitcoin
        • Ethereum
        • Yul
        • Zcash
        • ACL2-programming-language
        • Prime-fields
        • Java
        • C
          • Atc
          • Language
            • Abstract-syntax
            • Integer-ranges
            • Dynamic-semantics
            • Static-semantics
            • Integer-formats
            • Types
              • Type
                • Typep
                • Type-case
                  • Type-fix
                  • Type-count
                  • Type-equiv
                  • Type-kind
                  • Type-array
                  • Type-struct
                  • Type-pointer
                  • Type-sint
                  • Type-uchar
                  • Type-void
                  • Type-ushort
                  • Type-ulong
                  • Type-ullong
                  • Type-uint
                  • Type-sshort
                  • Type-slong
                  • Type-sllong
                  • Type-schar
                  • Type-char
                • Type-name-list-to-type-list
                • Tyname-to-type
                • Member-type-list->name-list
                • Type-completep
                • Member-type
                • Member-type-add-first
                • Member-type-add-last
                • Init-type
                • Type-option
                • Member-type-lookup
                • Tyspecseq-to-type
                • Member-type-list-option
                • Type-promoted-arithmeticp
                • Type-list-result
                • Member-type-list-result
                • Integer-type-bits-nulfun
                • Init-type-result
                • Type-result
                • Type-nonchar-integerp
                • Type-nonchar-integer-listp
                • Type-arithmetic-listp
                • Type-integer-listp
                • Integer-type-xdoc-string
                • Integer-type-minbits
                • Type-unsigned-integerp
                • Type-signed-integerp
                • Type-integerp
                • Type-arithmeticp
                • Integer-type-bits
                • Type-scalarp
                • Type-realp
                • Type-list
                • *nonchar-integer-types*
                • Member-type-list
                • Type-set
                • Type-option-set
                • Symbol-type-alist
                • Type-option-list
              • Portable-ascii-identifiers
              • Values
              • Integer-operations
              • Computation-states
              • Object-designators
              • Implementation-environments
              • Operations
              • Errors
              • Tag-environments
              • Function-environments
              • Character-sets
              • Flexible-array-member-removal
              • Arithmetic-operations
              • Pointer-operations
              • Grammar
              • Bytes
              • Keywords
              • Real-operations
              • Array-operations
              • Scalar-operations
              • Structure-operations
            • Representation
            • Pack
          • Syntheto
          • Number-theory
          • Cryptography
          • Lists-light
          • File-io-light
          • Json
          • Built-ins
          • Axe
          • Solidity
          • Std-extensions
          • Htclient
          • Typed-lists-light
          • Arithmetic-light
        • X86isa
        • Axe
        • Execloader
      • Testing-utilities
      • Math
    • Type

    Type-case

    Case macro for the different kinds of type structures.

    This is an ACL2::fty sum-type case macro, typically introduced by fty::defflexsum or fty::deftagsum. It allows you to safely check the type of a type structure, or to split into cases based on its type.

    Short Form

    In its short form, type-case allows you to safely check the type of a type structure. For example:

    (type-case x :void)

    is essentially just a safer alternative to writing:

    (equal (type-kind x) :void)

    Why is using type-case safer? When we directly inspect the kind with equal, there is no static checking being done to ensure that, e.g., :void is a valid kind of type structure. That means there is nothing to save you if, later, you change the kind keyword for this type from :void to something else. It also means you get no help if you just make a typo when writing the :void symbol. Over the course of developing VL, we found that such issues were very frequent sources of errors!

    Long Form

    In its longer form, type-case allows you to split into cases based on the kind of structure you are looking at. A typical example would be:

    (type-case x
      :void ...
      :char ...
      :schar ...
      :uchar ...
      :sshort ...
      :ushort ...
      :sint ...
      :uint ...
      :slong ...
      :ulong ...
      :sllong ...
      :ullong ...
      :struct ...
      :pointer ...
      :array ...)

    It is also possible to consolidate ``uninteresting'' cases using :otherwise.

    For convenience, the case macro automatically binds the fields of x for you, as appropriate for each case. That is, in the :void case, you can use fty::defprod-style foo.bar style accessors for x without having to explicitly add a void b* binder.