operator right 0 =! Parameter = Object clone Parameter new: v := Parameter clone do: { default = v } (p: Parameter) value: _ := p default macro (define: (x: Dispatch) as: root) `(~x = Parameter new: ~root) (p: Parameter) show := "<" .. p _? show .. ">" (p: Parameter) _? := p value: self ((p: Parameter) =! v) := p value: self = v (p: Parameter) set-default: v := p default = v with: (p: Parameter) as: new do: (action: Block) := { old = p _? action before: { p =! new } after: { p =! old } } call with-default: (p: Parameter) as: new do: (action: Block) := { old-default = p default old = p _? action before: { p set-default: new; p =! new } after: { p set-default: old-default p =! old } } call macro (with: (bs: List) do: action) bs contents (reduce-right: { `(~a -> ~b) x | `{ with: ~a as: ~b do: ~x } } with: action) contents head macro (with-defaults: (bs: List) do: action) bs contents (reduce-right: { `(~a -> ~b) x | `{ with-default: ~a as: ~b do: ~x } } with: action) contents head macro (modify: param as: change do: action) `(with: ~param as: (~change call: [~param _?]) do: ~action)