Record labels as fields
From Successor ML
Contents |
Introduction
We propose a simple abbreviated syntactic form for constructing records.
Motivation and Example
SML allows record patterns of the form {a=a, b=b, ...}
to be abbreviated conveniently as {a, b, ...}
(sometimes called "punning"). The same abbreviation is not currently provided for record expressions. Such an abbreviation can be equally convenient, e.g. for constructing records from local variables:
fun circle (x,y,r) = let val x = ref x and y ref y and r = ref r fun pos () = (!x,!y) fun radius () = !r fun move (dx,dy) = (x := !x+dx, y := !y+dy) fun scale s = (r := !r*s) in {pos, radius, move, scale} end
Assumptions
None.
Syntax
Defined by the following modifications to the Definition:
- In Appendix A, Figure 15, add the following box:
Expression Rows exprow +-----------------------+-----------------------------+ | vid <: ty> <, exprow> | vid = vid <: ty> <, exprow> | +-----------------------+-----------------------------+
- In Appendix B, Figure 20, add the following production:
[exprow ::=] vid <: ty> <, exprow> label as variable
Static Semantics
Follows from the definition as a derived form.
Dynamic Semantics
Follows from the definition as a derived form.
Interactions
None.
Compatibility
This is a conservative extension.
Implementation
Trivial.