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

Reply via email to