rslt ← (dewy ##.do) rarg ⍝ Apply no-result function "en passant".
A function [sic] that doesn't return its result is an embarrassment to the D-
programmer. Operator [do] applies such a function to its argument and returns
the argument as result.
{} do 3
3
For example, suppose we want a D-fn "wset" which, given a ref to an object and a
property-value pair, sets the new value and returns the previous one as result.
We might be tempted to try something along the lines of:
wset←{ ⍝ Set new prop-value ⍵ on object ⍺.
rslt←⍺ ⎕WG ⎕IO⊃⍵ ⍝ get old value.
⍺ ⎕WS ⍵ ⍝ set new value. !!!!!!! wrong
rslt ⍝ return old value.
}
This won't work because the function terminates on the second line (⎕WS) before
returning "rslt" on the third. We can't use a local assignment on the second
line to prolong execution:
_←⍺ ⎕WS ⍵ ⍝ set new value. !!!!!!! wrong
because ⎕WS does not (currently) return a result and so would produce a VALUE
ERROR. So we use [do] in the following way. Note that, as [do] derives a monadic
function (takes no left argument), we are obliged to bind ⎕WS's left argument ⍺
to form a monadic operand ⍺∘⎕WS:
_←⍺∘⎕WS do ⍵ ⍝ set new value.
or
0⊣⍺∘⎕WS do ⍵: ⍝ set new value.
or we could combine the final two lines into:
wset←{ ⍝ Set new prop-value ⍵ on object ⍺.
rslt←⍺ ⎕WG ⎕IO⊃⍵ ⍝ get old value.
rslt⊣⍺∘⎕WS do ⍵ ⍝ set new value and return old value.
}
(muse:
To be of any value, functions that don't return results must have useful
side-effects. In other words, they _do_ things, rather than indicate what
the value of the function at a particular argument _is_. For more on this,
see: http://dfns.dyalog.com/downloads/howcomp.pdf
}
Technical notes:
This coding of [do] depends on the behaviour of primitive execute (⍎): Execute
of a diamond-separated string is defined to return the evaluation of the right-
most segment as result.
do←{ ⍝ Apply no-result function.
⍎'⍺⍺ ⍵ ⋄ ⍵' ⋄ ⍺⍺
}
Notice that we must include an unquoted (and unvisited) ⍺⍺ within the braces, in
order to denote [do] as an operator and so consume the function operand to its
left.
An alternative coding might trap the expected value error. This has the minor
disadvantage that it disturbs any diagnostic message (⎕DM) and it appears to run
a little slower:
do←{ ⍝ Apply no-result function.
6::⍵ ⋄ ⍺⍺ ⍵
}
Depressingly, [do] may be coded more simply and efficiently as a traditional op-
erator:
∇ RARG ← (FUNC DO) RARG
[1] FUNC RARG
∇
but perhaps this is to be expected as tradfns are generally better for "do-y"
programming, while D-functions excel at the "is-y" style (see the muse section
above).
Examples:
'F1'∘⎕WS do 'Caption' 'Pugwash'
┌───────┬───────┐
│Caption│Pugwash│
└───────┴───────┘
Back to: contents
Back to: Workspaces