atomo-0.2.2: prelude/parameter.atomo
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)