News for hackers. Stuff that matters.
Re:JEP 443: Unnamed Patterns and Variables (Preview) by kazinator on Wednesday March 22, 2023 @12:44AM (#35256929)
Under the hood:

  1> (compile-toplevel '(match @(struct @type year @y) (time-struct-utc (time))
       (list type y)))
  #<sys:vm-desc: 986dff0>
Disassembly of VM descriptor, annotated:

  2> (disassemble *1)
Constant data table (preinitialized registers D0 through D3):

  data:
      0: year
      1: t
      2: match
      3: @(struct @type year @y)
Referenced functions, indexed by number:

  syms:
      0: time-struct-utc
      1: time
      2: structp
      3: struct-type
      4: slotp
      5: slot
      6: list
      7: sys:match-pat-error
Actual code:

  code:
      0: 20000003 gcall t3 1
      1: 00000001
      2: 2001000D gcall t13 0 t3
      3: 00030000
Call (time), result in T3. Then (time-struct-utc T3) -> T13.

      4: 20010002 gcall t2 2 t13
      5: 000D0002
(structp T3) -> T2

      6: 38000017 if t2 23
      7: 00000002
If T2 is true, keep going, otherwise jump to 23

      8: 20010009 gcall t9 3 t13
      9: 000D0003
Call (struct-type T13) to get the structure's type object.

     10: 2C0B0009 movsr t11 t9
This is a failure in dataflow analysis to remove a useless register copy.

     11: 20020002 gcall t2 4 t9 d0
     12: 00090004
     13: 00000400
D0 is the year symbol; this is calling slotp to test whether the incoming struct object has a year slot.

     14: 38000017 if t2 23
     15: 00000002
If so, continue, otherwise go to error block at 23.

     16: 20020008 gcall t8 5 t13 d0
     17: 000D0005
     18: 00000400
Now get the year slot's value.

     19: 2002000C gcall t12 6 t11 t8
     20: 000B0006
     21: 00000008
List the type in T11 and the year value in T8, into a list held in T12.

     22: 1000000C end t12
Execution ends returning T12.

23 is the error block: run-time function sys:match-pat-error is called with some arguments, like D3, which holds the source code of the pattern.

     23: 20030002 gcall t2 7 d2 d3 t13
     24: 04020007
     25: 000D0403
Not reached, since that function throws:

     26: 10000002 end t2
  instruction count:
     13
  #<sys:vm-desc: 986dff0>

There are no comments on this comment yet.