[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Is a syntax such as (update my-record-type my-record (x 3) (y 4)) possible?

This page is part of the web mail archives of SRFI 76 from before July 7th, 2015. The new archives for SRFI 76 contain all messages, not just those from before July 7th, 2015.

> Should the operations for access and mutation be augmented
> by functional update?

I think functional programming will become increasing important  (see e.g.
A Fundamental Turn Toward Concurrency in Software

> If any of these are added, what should the syntax in the syntactic
> layers look like?

I don't understand enough about the capabilities of macros to know
what is possible.  For example, could we have a syntax such as:

    (update <record name> record-expr (<field name> expr) ...)

where <record name> and <field name>'s must be identifiers,
record-expr must evaluate to a record of type or a subtype of <record
name>, and UPDATE expands into code which will efficiently return a
new record of the type of record-expr (the subtype) copying all fields
except for <field name>'s which are given the new values?

For example,

(define-type (position make-position position?) (x y)
  (fields (x immutable x)
          (y immutable y)))

(define-type (thing make-thing thing?) (x y color)
  (parent position x y)
  (fields (color immutable color)))

(define t1 (make-thing 3.4 5.8 'green))

(define t2 (update position t1 (y 18)))

(define t3 (update thing    t1 (x 10) (color 'red)))

(position-x  t1)  => 3.4
(position-y  t1)  => 5.8
(thing-color t1)  => green

(position-x  t2)  => 3.4
(position-y  t2)  => 18
(thing-color t2)  => green

(position-x  t3)  => 10
(position-y  t3)  => 5.8
(thing-color t3)  => red