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
