Not at all.  Instead q:~&__  means the noun Minus Infinity __ is used as a 
right argument for  q:~  .   q:~&__ y  is  y q:~ __  which in turn is  __ q: y 
by the definition of  ~  .

Summarizing,  q:~&__ y  is  __ q: y  --  it turns out Minus Infinity is a valid 
left argument for  q:  .   

See the "monadic function" case of conjunction Bond & in the Vocabulary:

http://www.jsoftware.com/docs/help701/dictionary/d630n.htm

And the definition of Passive ~

http://www.jsoftware.com/docs/help701/dictionary/d220v.htm

Just to blow your mind I mention  q:~&__  y  is the same as  __&q: y  .

Also, there is a "dyadic function" case of Bond & which I urge you to avoid!

Kip

Sent from my iPad


On Feb 17, 2013, at 1:32 PM, "Linda Alvord" <[email protected]> wrote:

> Does q:~&__ mean the same as  q:~"__ or maybe  (q:~)"__
> 
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of km
> Sent: Saturday, February 16, 2013 10:57 PM
> To: [email protected]
> Subject: Re: [Jprogramming] Recursive programming (and scoping therein)
> 
> f&13 y is y f 13  so f&__ y is y f __ . That __ is minus infinity.  --Kip
> 
>   %&2 [ 25  NB. without [ the vector 2 25 is grabbed by &
> 12.5
> 
> 
> Sent from my iPad
> 
> 
> On Feb 16, 2013, at 9:13 PM, "Linda Alvord" <[email protected]> wrote:
> 
>> I am trying to write  factrs in simple J.  I hit two snags:
>> 
>>  factrs=: */&>@{@((^ i.@>:)&.>/)@q:~&__
>>  5!:6 <'factrs'
>> ((((((*/)&>)@{)@(((^ (i.@>:))&.>)/))@q:)~)&__
>>  factrs 500
>> 1  5  25 125
>> 2 10  50 250
>> 4 20 100 500
>> 
>>  f=:((((((*/)&>)@{)@(((^ (i.@>:))&.>)/))@q:)~)&__
>>  g=:(((^ (i.@>:))&.>)/)
>>  g
>> (^ i.@>:)&.>/
>>  g 500
>> 500
>> 
>>  f=:((((((*/)&>)@{)@g)@q:)~)&__
>>  h=:(((*/)&>)@{)
>>  h
>> */&>@{
>>  h 500
>> 500
>> 
>>  f=:(((h@g)@q:)~)&__
>>  f
>> h@g@q:~&__
>> 
>>  gg=: 13 :'(<( ^ [: i. >:)>)/ y'
>>  hh=:  13 :'*/"1>"0{y'
>> 
>>  ff=:(((hh@g)@q:)~)&__
>>  ff 500
>> 1  5  25 125
>> 2 10  50 250
>> 4 20 100 500
>> 
>>  ff=:(((hh@gg)@q:)~)&__
>>  ff 500
>> |length error: gg
>> |       ff 500
>> |[-24] c:\users\owner\j701-user\temp\52.ijs
>> 
>> I can't understand  gg  well enough to adjust the rank.
>> 
>> What does  &__  mean?
>> 
>> Linda
>> 
>> 
>> -----Original Message-----
>> From: [email protected]
>> [mailto:[email protected]] On Behalf Of Raul 
>> Miller
>> Sent: Monday, February 11, 2013 3:28 PM
>> To: [email protected]
>> Subject: Re: [Jprogramming] Recursive programming (and scoping 
>> therein)
>> 
>> After reading this, and finally noticing the comment about remel in 
>> the original post, I am uncomfortable with this treatment of remel.
>> 
>> A scheme 'alist' is like two J lists, one a list of keys which we 
>> search to get an index into the other.  If the types are compatible 
>> (probably valid for integers or boxes), this could be a two 
>> dimensional array where one of the dimensions is 2.
>> 
>> But the original code is not using an alist, as near as I can tell -- 
>> it's just using a list of divisors.  In this context, I think remel 
>> would logically be replaced by dyadic use of J's -. primitive.
>> Except, this does not work as near as I can tell.  I'm not sure if 
>> that's because remel is expected to modify the original alist, or if 
>> that's because remel is really meant to treat the alist as a stack 
>> where it's removing not only the matching element but all previous 
>> elements (which is what the J implementation does).
>> 
>> But ignoring that, and using the original supplied definition, here's 
>> how I would translate the original code to J:
>> 
>> allfactors =: af q:
>> 
>> remel =: [ }.~ [: >: i.
>> 
>> af=: dyad define
>> divisors=. y
>> num=. x
>> if.0=#divisors do.,num end.
>> uniquefactors=. ~.divisors
>> ;num;(num&% af divisors&remel)&.> uniquefactors
>> )
>> 
>> I have not tried to optimize this for efficiency because the recursive 
>> process itself is too inefficient to be worth bothering with.
>> 
>> For reference, here's one of the implementations from that rosetta 
>> code link I posted earlier:
>> 
>>  factrs=: */&>@{@((^ i.@>:)&.>/)@q:~&__
>>  factrs 12
>> 1  3
>> 2  6
>> 4 12
>> 
>> Obviously you would want to ravel that result before treating it as a
> list.
>> 
>>  ,@factrs 12
>> 1 3 2 6 4 12
>> 
>> Anyways, I believe that this approach should be more efficient than 
>> the use of remel (or whatever that should be) in recursion.
>> 
>> --
>> Raul
>> 
>> On Mon, Feb 11, 2013 at 12:01 PM, Marshall Lochbaum 
>> <[email protected]>
>> wrote:
>>> I assume the problems you're having are in getting num and divisors 
>>> to work inside the lambda clause. J can handle this fine--just use 
>>> tacit code rather than an explicit function for the lambda. Here is 
>>> the same code in J.
>>> 
>>> remel =: ([ }.~ [: >: i.)"_ 0
>>> 
>>> allfactors =: af q:
>>> 
>>> af =: [ , 4 : 0 ^: (*@#@])
>>> x (% af&.>(;@:) y <@remel ]) ~.y
>>> )
>>> 
>>> af uses a bit of refactoring to avoid having to write the case where 
>>> y
>>> (divisors) is empty explicitly. We know we want to tack x (num) to 
>>> the beginning of the list regardless of what happens in the function. 
>>> Once we have made this choice with the [ , at the beginning of af's 
>>> definition, we see that the rest of the function should just return 
>>> an empty list if passed an empty list for y. Therefore we add 
>>> ^:(*@#@]) to af. This means the explicit portion is only executed if 
>>> y has nonzero length. Otherwise it will do nothing, that is, return y 
>>> which is the empty list we want.
>>> 
>>> The inside of the function is fairly straightforward. We compute the 
>>> nub of y to use as the right argument. Then y <@remel ] gives a boxed 
>>> list of terms (remel divisors x), and % with left argument x and 
>>> right argument ~.y gives the terms (/ num x). We apply af to them 
>>> using af&.> to give a list of boxed results and combine these into a 
>>> single list with ; .
>>> 
>>> af can also be written in a completely tacit form, although in this 
>>> form we can't easily juggle the three terms num, divisors, and 
>>> (unique divisors). The easiest way out of this is just to compute the 
>>> nub of divisors twice.
>>> 
>>> af =: [ , ((%~.) $:&.>(;@:) (<@remel ~.)@]) ^: (*@#@])
>>> 
>>> This verb uses $: for self-reference, but is largely the same as the 
>>> other form of af.
>>> 
>>> I realize that methods like these aren't really equivalent to proper 
>>> scoping rules, but I think most of the time they are good enough.
>>> 
>>> Marshall
>>> 
>>> On Mon, Feb 11, 2013 at 01:04:31PM +0000, Alex Giannakopoulos wrote:
>>>> Are there any resources on recursive programming in J?  Couldn't 
>>>> find much by searching.
>>>> I would particularly like to know about scoping, and also so-called 
>>>> free variables.
>>>> 
>>>> It seems to me that the enforced naming of variables as 'x' and 'y' 
>>>> might cause problems in nested functions, necessitating awkward 
>>>> renaming and copying.
>>>> 
>>>> I will give a little example here (my apologies to those unfamiliar 
>>>> with
>>>> Scheme.)
>>>> I am trying to write a routine that will return ALL the factors of a 
>>>> number, not just the prime ones.
>>>> I do this by using an auxiliary routine that takes the number to 
>>>> factor and a list of numbers still to combine.
>>>> 
>>>> ;; function (unique numlist) corresponds to J's ~.
>>>> ;; function (remel alist elem) corresponds to J's   [ }.~ [: >: i.
>>>> ;; function (primefactors n) corresponds to J's   q:
>>>> 
>>>> (define (allfactors n) (af n (primefators n))
>>>> 
>>>> (define (af num divisors)
>>>> (if (null? divisors) (list num)
>>>>     (let ((uniquefactors (unique divisors)))
>>>>          (flatten
>>>>          (cons num
>>>>                (map (lambda(x) (af (/ num x) (remel divisors x)))
>>>>                     uniquefactors))))))
>>>> 
>>>> Now I tried to express this in J, but can't even get to first base, 
>>>> because of the scoping problems I mentioned.
>>>> I realise that recursion is not the primary mode for programming J, 
>>>> and a good solution may instead use something like running totals 
>>>> (\), but for the time being I am stuck.
>>>> Any suggestions gratefully received.
>>>> --------------------------------------------------------------------
>>>> -
>>>> - 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
>> 
>> ----------------------------------------------------------------------
>> 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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to