Me too, but foo =: 0&$: : (4 : 0)
might also work. Henry Rich On 1/26/2011 2:35 PM, Devon McCormick wrote: > 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 >> > > > ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
