SRFI-99

Hex Artifact Content
Login

Artifact 13594f9d2181f6b4db9d99f89c34aa23eb0913ce:

Wiki page [record properties] by murphy 2015-02-06 01:23:28.
0000: 44 20 32 30 31 35 2d 30 32 2d 30 36 54 30 31 3a  D 2015-02-06T01:
0010: 32 33 3a 32 38 2e 36 36 39 0a 4c 20 72 65 63 6f  23:28.669.L reco
0020: 72 64 5c 73 70 72 6f 70 65 72 74 69 65 73 0a 50  rd\sproperties.P
0030: 20 31 32 64 35 61 62 31 35 35 61 63 64 65 63 36   12d5ab155acdec6
0040: 34 38 36 61 66 66 31 39 62 38 37 38 38 62 38 32  486aff19b8788b82
0050: 32 33 31 66 64 30 31 31 35 0a 55 20 6d 75 72 70  231fd0115.U murp
0060: 68 79 0a 57 20 32 36 34 32 0a 3c 68 31 3e 52 65  hy.W 2642.<h1>Re
0070: 63 6f 72 64 20 50 72 6f 70 65 72 74 69 65 73 3c  cord Properties<
0080: 2f 68 31 3e 0d 0a 0d 0a 52 65 63 6f 72 64 20 70  /h1>....Record p
0090: 72 6f 70 65 72 74 69 65 73 20 61 72 65 20 61 20  roperties are a 
00a0: 77 61 79 20 74 6f 20 61 74 74 61 63 68 20 61 72  way to attach ar
00b0: 62 69 74 72 61 72 79 20 69 6e 66 6f 72 6d 61 74  bitrary informat
00c0: 69 6f 6e 20 74 6f 20 72 65 63 6f 72 64 0d 0a 74  ion to record..t
00d0: 79 70 65 73 20 61 6e 64 2f 6f 72 20 69 6e 73 74  ypes and/or inst
00e0: 61 6e 63 65 73 2e 20 54 68 65 20 69 6e 74 65 72  ances. The inter
00f0: 66 61 63 65 20 74 6f 20 72 65 63 6f 72 64 20 70  face to record p
0100: 72 6f 70 65 72 74 69 65 73 20 68 61 73 20 74 68  roperties has th
0110: 72 65 65 0d 0a 70 61 72 74 73 3a 0d 0a 0d 0a 20  ree..parts:.... 
0120: 20 2a 20 20 54 68 65 20 6d 6f 64 75 6c 65 20 3c   *  The module <
0130: 74 74 3e 73 72 66 69 2d 39 39 2d 72 65 63 6f 72  tt>srfi-99-recor
0140: 64 73 2d 69 6e 73 70 65 63 74 69 6f 6e 3c 2f 74  ds-inspection</t
0150: 74 3e 20 65 78 70 6f 72 74 73 20 74 68 65 0d 0a  t> exports the..
0160: 20 20 20 20 20 70 72 6f 63 65 64 75 72 65 20 3c       procedure <
0170: 74 74 3e 6d 61 6b 65 2d 72 74 70 3c 2f 74 74 3e  tt>make-rtp</tt>
0180: 20 74 68 61 74 20 63 72 65 61 74 65 73 20 6e 65   that creates ne
0190: 77 20 72 65 63 6f 72 64 20 70 72 6f 70 65 72 74  w record propert
01a0: 79 0d 0a 20 20 20 20 20 61 63 63 65 73 73 6f 72  y..     accessor
01b0: 73 2e 0d 0a 20 20 2a 20 20 41 20 70 72 6f 70 65  s...  *  A prope
01c0: 72 74 79 20 69 73 20 61 74 74 61 63 68 65 64 20  rty is attached 
01d0: 74 6f 20 61 20 72 65 63 6f 72 64 20 74 79 70 65  to a record type
01e0: 20 75 73 69 6e 67 20 74 68 65 20 73 70 65 63 69   using the speci
01f0: 61 6c 20 6b 65 79 77 6f 72 64 0d 0a 20 20 20 20  al keyword..    
0200: 20 61 72 67 75 6d 65 6e 74 20 3c 74 74 3e 23 3a   argument <tt>#:
0210: 70 72 6f 70 65 72 74 79 3c 2f 74 74 3e 20 6f 66  property</tt> of
0220: 20 3c 74 74 3e 6d 61 6b 65 2d 72 74 64 3c 2f 74   <tt>make-rtd</t
0230: 74 3e 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  t>, followed by 
0240: 61 0d 0a 20 20 20 20 20 70 72 6f 70 65 72 74 79  a..     property
0250: 20 61 63 63 65 73 73 6f 72 20 67 65 6e 65 72 61   accessor genera
0260: 74 65 64 20 62 79 20 3c 74 74 3e 6d 61 6b 65 2d  ted by <tt>make-
0270: 72 74 70 3c 2f 74 74 3e 20 61 6e 64 20 61 20 70  rtp</tt> and a p
0280: 72 6f 70 65 72 74 79 0d 0a 20 20 20 20 20 76 61  roperty..     va
0290: 6c 75 65 2e 0d 0a 20 20 2a 20 20 41 20 70 72 6f  lue...  *  A pro
02a0: 70 65 72 74 79 20 69 73 20 61 63 63 65 73 73 65  perty is accesse
02b0: 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  d by calling the
02c0: 20 70 72 6f 70 65 72 74 79 20 61 63 63 65 73 73   property access
02d0: 6f 72 20 67 65 6e 65 72 61 74 65 64 0d 0a 20 20  or generated..  
02e0: 20 20 20 75 73 69 6e 67 20 3c 74 74 3e 6d 61 6b     using <tt>mak
02f0: 65 2d 72 74 70 3c 2f 74 74 3e 20 6f 6e 20 61 20  e-rtp</tt> on a 
0300: 72 65 63 6f 72 64 20 69 6e 73 74 61 6e 63 65 20  record instance 
0310: 61 6e 64 2f 6f 72 20 61 20 72 65 63 6f 72 64 20  and/or a record 
0320: 74 79 70 65 0d 0a 20 20 20 20 20 64 65 73 63 72  type..     descr
0330: 69 70 74 6f 72 2e 0d 0a 0d 0a 3c 68 32 3e 43 72  iptor.....<h2>Cr
0340: 65 61 74 69 6e 67 20 52 65 63 6f 72 64 20 50 72  eating Record Pr
0350: 6f 70 65 72 74 79 20 41 63 63 65 73 73 6f 72 73  operty Accessors
0360: 3c 2f 68 32 3e 0d 0a 0d 0a 41 20 72 65 63 6f 72  </h2>....A recor
0370: 64 20 70 72 6f 70 65 72 74 79 20 61 63 63 65 73  d property acces
0380: 73 6f 72 20 69 73 20 63 72 65 61 74 65 64 20 77  sor is created w
0390: 69 74 68 20 61 20 63 61 6c 6c 20 74 6f 20 3c 74  ith a call to <t
03a0: 74 3e 6d 61 6b 65 2d 72 74 70 3c 2f 74 74 3e 0d  t>make-rtp</tt>.
03b0: 0a 6f 72 20 75 73 69 6e 67 20 74 68 65 20 73 68  .or using the sh
03c0: 6f 72 74 68 61 6e 64 20 73 79 6e 74 61 78 20 3c  orthand syntax <
03d0: 74 74 3e 64 65 66 69 6e 65 2d 72 65 63 6f 72 64  tt>define-record
03e0: 2d 70 72 6f 70 65 72 74 79 3c 2f 74 74 3e 3a 0d  -property</tt>:.
03f0: 0a 0d 0a 3c 76 65 72 62 61 74 69 6d 3e 0d 0a 20  ...<verbatim>.. 
0400: 20 28 6d 61 6b 65 2d 72 74 70 20 5b 64 65 66 61   (make-rtp [defa
0410: 75 6c 74 20 61 6e 79 3f 20 23 66 5d 29 20 3d 3e  ult any? #f]) =>
0420: 20 70 72 6f 63 65 64 75 72 65 3f 0d 0a 0d 0a 20   procedure?.... 
0430: 20 28 64 65 66 69 6e 65 2d 72 65 63 6f 72 64 2d   (define-record-
0440: 70 72 6f 70 65 72 74 79 20 6e 61 6d 65 20 5b 64  property name [d
0450: 65 66 61 75 6c 74 20 61 6e 79 3f 20 23 66 5d 29  efault any? #f])
0460: 0d 0a 3c 2f 76 65 72 62 61 74 69 6d 3e 0d 0a 0d  ..</verbatim>...
0470: 0a 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61  .The result is a
0480: 20 70 72 6f 63 65 64 75 72 65 20 74 68 61 74 20   procedure that 
0490: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61  can be used to a
04a0: 63 63 65 73 73 20 74 68 65 20 6e 65 77 20 72 65  ccess the new re
04b0: 63 6f 72 64 0d 0a 70 72 6f 70 65 72 74 79 20 77  cord..property w
04c0: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 64 65  ith the given de
04d0: 66 61 75 6c 74 20 76 61 6c 75 65 2e 0d 0a 0d 0a  fault value.....
04e0: 3c 68 32 3e 41 63 63 65 73 73 69 6e 67 20 52 65  <h2>Accessing Re
04f0: 63 6f 72 64 20 50 72 6f 70 65 72 74 69 65 73 3c  cord Properties<
0500: 2f 68 32 3e 0d 0a 0d 0a 41 20 72 65 63 6f 72 64  /h2>....A record
0510: 20 70 72 6f 70 65 72 74 79 20 61 63 63 65 73 73   property access
0520: 6f 72 20 61 63 63 65 70 74 73 20 74 77 6f 20 61  or accepts two a
0530: 72 67 75 6d 65 6e 74 73 2c 20 73 6f 6d 65 20 76  rguments, some v
0540: 61 6c 75 65 20 61 6e 64 20 61 0d 0a 72 65 63 6f  alue and a..reco
0550: 72 64 20 74 79 70 65 20 64 65 73 63 72 69 70 74  rd type descript
0560: 6f 72 3a 0d 0a 0d 0a 3c 76 65 72 62 61 74 69 6d  or:....<verbatim
0570: 3e 0d 0a 20 20 28 72 74 70 20 5b 76 20 61 6e 79  >..  (rtp [v any
0580: 3f 5d 20 5b 72 74 64 20 72 74 64 3f 20 28 72 65  ?] [rtd rtd? (re
0590: 63 6f 72 64 2d 72 74 64 20 76 29 5d 29 20 3d 3e  cord-rtd v)]) =>
05a0: 20 61 6e 79 3f 0d 0a 3c 2f 76 65 72 62 61 74 69   any?..</verbati
05b0: 6d 3e 0d 0a 0d 0a 54 68 65 20 72 65 63 6f 72 64  m>....The record
05c0: 20 74 79 70 65 20 64 65 73 63 72 69 70 74 6f 72   type descriptor
05d0: 20 63 61 6e 20 62 65 20 6f 6d 69 74 74 65 64 20   can be omitted 
05e0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 70 61 73  if the value pas
05f0: 73 65 64 20 61 73 20 74 68 65 0d 0a 66 69 72 73  sed as the..firs
0600: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e  t argument is an
0610: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 61 20 74   instance of a t
0620: 72 61 6e 73 70 61 72 65 6e 74 20 72 65 63 6f 72  ransparent recor
0630: 64 2e 0d 0a 0d 0a 54 68 65 20 61 63 63 65 73 73  d.....The access
0640: 6f 72 20 6c 6f 6f 6b 73 20 75 70 20 74 68 65 20  or looks up the 
0650: 70 72 6f 70 65 72 74 79 20 76 61 6c 75 65 20 66  property value f
0660: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 72 65 63  or the given rec
0670: 6f 72 64 20 74 79 70 65 20 28 6f 72 0d 0a 61 6e  ord type (or..an
0680: 79 20 6f 66 20 69 74 73 20 70 61 72 65 6e 74 73  y of its parents
0690: 29 20 77 68 65 6e 20 69 74 20 69 73 20 63 61 6c  ) when it is cal
06a0: 6c 65 64 2e 20 49 66 20 69 74 20 64 6f 65 73 6e  led. If it doesn
06b0: 27 74 20 66 69 6e 64 20 61 20 76 61 6c 75 65 20  't find a value 
06c0: 69 74 0d 0a 72 65 73 6f 72 74 73 20 74 6f 20 74  it..resorts to t
06d0: 68 65 20 64 65 66 61 75 6c 74 20 73 70 65 63 69  he default speci
06e0: 66 69 65 64 20 77 68 65 6e 20 74 68 65 20 72 65  fied when the re
06f0: 63 6f 72 64 20 70 72 6f 70 65 72 74 79 20 77 61  cord property wa
0700: 73 20 63 72 65 61 74 65 64 2e 0d 0a 54 68 65 20  s created...The 
0710: 76 61 6c 75 65 20 69 73 20 74 68 65 6e 20 61 70  value is then ap
0720: 70 6c 69 65 64 20 74 6f 20 3c 74 74 3e 76 3c 2f  plied to <tt>v</
0730: 74 74 3e 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  tt> to obtain th
0740: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0d  e result of the.
0750: 0a 61 63 63 65 73 73 6f 72 20 63 61 6c 6c 2e 0d  .accessor call..
0760: 0a 0d 0a 44 65 66 61 75 6c 74 20 70 72 6f 70 65  ...Default prope
0770: 72 74 79 20 76 61 6c 75 65 73 20 70 61 73 73 65  rty values passe
0780: 64 20 74 6f 20 3c 74 74 3e 6d 61 6b 65 2d 72 74  d to <tt>make-rt
0790: 70 3c 2f 74 74 3e 20 77 68 69 63 68 20 61 72 65  p</tt> which are
07a0: 20 6e 6f 74 0d 0a 70 72 6f 63 65 64 75 72 65 73   not..procedures
07b0: 20 61 72 65 20 69 6d 70 6c 69 63 69 74 6c 79 20   are implicitly 
07c0: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 70 72 6f  converted to pro
07d0: 63 65 64 75 72 65 73 20 63 6f 6e 73 74 61 6e 74  cedures constant
07e0: 6c 79 20 72 65 74 75 72 6e 69 6e 67 0d 0a 74 68  ly returning..th
07f0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e  e default value.
0800: 0d 0a 0d 0a 50 72 6f 70 65 72 74 79 20 76 61 6c  ....Property val
0810: 75 65 73 20 70 61 73 73 65 64 20 74 6f 20 3c 74  ues passed to <t
0820: 74 3e 6d 61 6b 65 2d 72 74 64 3c 2f 74 74 3e 20  t>make-rtd</tt> 
0830: 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 70 72  which are not pr
0840: 6f 63 65 64 75 72 65 73 0d 0a 6f 72 20 73 79 6d  ocedures..or sym
0850: 62 6f 6c 73 20 61 72 65 20 69 6d 70 6c 69 63 69  bols are implici
0860: 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 20 74 6f  tly converted to
0870: 20 63 6f 6e 73 74 61 6e 74 20 67 65 6e 65 72 61   constant genera
0880: 74 6f 72 73 20 6c 69 6b 65 0d 0a 70 72 6f 70 65  tors like..prope
0890: 72 74 79 20 64 65 66 61 75 6c 74 20 76 61 6c 75  rty default valu
08a0: 65 73 2e 20 53 79 6d 62 6f 6c 73 20 61 72 65 20  es. Symbols are 
08b0: 69 6d 70 6c 69 63 69 74 6c 79 20 63 6f 6e 76 65  implicitly conve
08c0: 72 74 65 64 20 74 6f 20 61 63 63 65 73 73 6f 72  rted to accessor
08d0: 0d 0a 70 72 6f 63 65 64 75 72 65 73 20 66 6f 72  ..procedures for
08e0: 20 74 68 65 20 66 69 65 6c 64 20 6f 66 20 74 68   the field of th
08f0: 65 20 73 61 6d 65 20 6e 61 6d 65 20 69 6e 20 74  e same name in t
0900: 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 74 79  he new record ty
0910: 70 65 20 74 6f 0d 0a 77 68 69 63 68 20 74 68 65  pe to..which the
0920: 20 70 72 6f 70 65 72 74 79 20 69 73 20 61 74 74   property is att
0930: 61 63 68 65 64 2e 0d 0a 0d 0a 3c 68 32 3e 4c 69  ached.....<h2>Li
0940: 73 74 69 6e 67 20 52 65 63 6f 72 64 20 50 72 6f  sting Record Pro
0950: 70 65 72 74 69 65 73 3c 2f 68 32 3e 0d 0a 0d 0a  perties</h2>....
0960: 54 68 65 20 72 65 63 6f 72 64 20 70 72 6f 70 65  The record prope
0970: 72 74 69 65 73 20 61 74 74 61 63 68 65 64 20 64  rties attached d
0980: 69 72 65 63 74 6c 79 20 74 6f 20 61 20 74 79 70  irectly to a typ
0990: 65 20 64 65 73 63 72 69 70 74 6f 72 20 63 61 6e  e descriptor can
09a0: 20 62 65 20 72 65 74 72 69 65 76 65 64 20 75 73   be retrieved us
09b0: 69 6e 67 0d 0a 0d 0a 3c 76 65 72 62 61 74 69 6d  ing....<verbatim
09c0: 3e 0d 0a 20 20 28 72 74 64 2d 70 72 6f 70 65 72  >..  (rtd-proper
09d0: 74 69 65 73 20 5b 72 74 64 20 72 74 64 3f 5d 29  ties [rtd rtd?])
09e0: 20 3d 3e 20 28 6c 69 73 74 6f 66 20 70 72 6f 63   => (listof proc
09f0: 65 64 75 72 65 3f 29 0d 0a 3c 2f 76 65 72 62 61  edure?)..</verba
0a00: 74 69 6d 3e 0d 0a 0d 0a 61 6e 64 20 61 6c 6c 20  tim>....and all 
0a10: 72 65 63 6f 72 64 20 70 72 6f 70 65 72 74 69 65  record propertie
0a20: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 61 20  s attached to a 
0a30: 74 79 70 65 20 64 65 73 63 72 69 70 74 6f 72 20  type descriptor 
0a40: 6f 72 20 69 74 73 20 70 61 72 65 6e 74 73 20 63  or its parents c
0a50: 61 6e 20 62 65 20 72 65 74 72 69 65 76 65 64 20  an be retrieved 
0a60: 75 73 69 6e 67 0d 0a 0d 0a 3c 76 65 72 62 61 74  using....<verbat
0a70: 69 6d 3e 0d 0a 20 20 28 72 74 64 2d 61 6c 6c 2d  im>..  (rtd-all-
0a80: 70 72 6f 70 65 72 74 69 65 73 20 5b 72 74 64 20  properties [rtd 
0a90: 72 74 64 3f 5d 29 20 3d 3e 20 28 6c 69 73 74 6f  rtd?]) => (listo
0aa0: 66 20 70 72 6f 63 65 64 75 72 65 3f 29 0d 0a 3c  f procedure?)..<
0ab0: 2f 76 65 72 62 61 74 69 6d 3e 0d 0a 0a 5a 20 39  /verbatim>...Z 9
0ac0: 38 65 65 30 36 35 32 33 38 66 61 62 32 65 36 34  8ee065238fab2e64
0ad0: 34 65 31 39 32 64 36 65 62 64 34 34 36 36 61 0a  4e192d6ebd4466a.