I've always done what you're attempting - ambivalent definition with a
default value for an elided left argument - the obvious way:

foo=: 3 : 0
   0 foo y
:
...
)

Perhaps it's better to include the name explicitly in this case as it may
remind you  to change it when you change the function name - though I have
forgotten to do this too, with puzzling results as the old name remains
until the next session, so there is no immediate failure.

On Wed, Jan 26, 2011 at 1:59 PM, Ian Clark <[email protected]> wrote:

> Thanks, Dan. An example showing what *doesn't* work and explaining why
> not is a huge aid to understanding it.
>
> When I fIrst saw $:  I thought I had an immediate use for it in
> definitions like this:
>
> foo=: 3 : 0
> 0 $: y
> :
> ...
> )
>
> ...I'm forever changing the names of verbs and forgetting their
> recursive invocation. That's quite an elephant trap if you've ever
> done it, particularly if the first verb's still there.
>
> But I can't get the above to work, and I'm not altogether sure why.
> I can only guess that $: is retaining the memory of whether it has
> been called monadically or dyadically.
>
>
>
> On Wed, Jan 26, 2011 at 5:30 PM, Dan Bron <[email protected]> wrote:
> > Ian wrote:
> >>  Hands up who understands ~help/dictionary/d212.htm
> >
> > $: is used for (anonymous) recursion. For example, where you might've
> > written:
> >
> >           fact =: * fact@:<:^:(1&<)
> >
> >           fact 5
> >        120
> >
> > using $:, you could've omitted the verb-naming step (which is incidental
> to
> > its function, or at least you'd like that to be true):
> >
> >          ( * $:@:<:^:(1&<) ) 5
> >        120
> >
> > but note: $: refers to the _longest_ verb that contains it.  So whereas:
> >
> >           factMas2  =:  2 + fact
> >           factMas2 5
> >        122
> >
> > vs:
> >
> >           (2 +  ( * $:@:<:^:(1&<) ))  5
> >        532
> >
> > All of a sudden, $:'s scope has broadened to include the 2&+ (on _every_
> > invocation, including the recursive ones).  Of course, you could fix this
> by
> > manually limiting the scope of  $:
> >
> >           fact1 =:  * $:@:<:^:(1&<)
> >           fact1Mas2 =: 2 + fact1
> >
> >           fact1Mas2 5
> >        122
> >
> > ... but that kind of defeats the purpose a bit.  Also, if anyone ever
> > decides to apply  f.  and it hits your  $:-verb, it'll fix you good:
> >
> >
> >           fact1Mas2 f. 5  NB. Theoretically identical to line above
> >        3
> >
> > There are ways around this (e.g.  2 + 3 : '( * $:@:<:^:(1&<) ) y' )  but
> > none is entirely satisfying.
> >
> > -Dan
> >
> > PS:   f.  should wrap all verbs in parens before quoting them in an
> explicit
> > context.
> >
> >
> >
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> >
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
>



-- 
Devon McCormick, CFA
^me^ at acm.
org is my
preferred e-mail
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to