Mark this is great stuff and taught me a heck of a lot. Thanks!

Your adverb is EXACTLY what I wanted and works great for all verbs I have tried 
with it so far.



Your message was clear, precise, and easy to understand.



The one thing I didn't quite understand was why the final tacit version...



> NB. Final tacit form

> CHAR =: 1 : 'u &: (a.&i.)'



...appears to be monadic, whereas the penultimate version...

> CHAR =: 1 : 0 
> :
>   x (u &: (a.&i.)) y
> )

...is dyadic.

However I hope to understand that when I work my way thru your response again.



Have you contributed any other gems like this to the Wiki or elsewhere?
If so, please let me know as I would be very keen to read them.



Thanks again,



Richard

> Date: Tue, 6 Nov 2007 02:05:10 -0700
> From: [EMAIL PROTECTED]
> To: [email protected]
> Subject: Re: [Jprogramming] My first adverb - doesn't work!
> 
> Richard Donovan <[EMAIL PROTECTED]> wrote:
> 
> > CHAR =: 1  :0
> > t1=: a.i.x
> > t2=: a.i.y
> > t1 u t2
> > )
> >
> > but...
> >
> >    'z'> CHAR 'a'
> > |domain error
> > |   'z'   >CHAR'a'
> >   t1
> > 33
> >    t2
> > 97
> >    t1{a.
> > !
> >    t2{a.
> > a
> >
> > I am missing something obvious (again!)
> 
> Adverbs and conjunctions can be used to make verbs in two ways:
> 
> 1) They can immediately return tacit verbs, which are then invoked.
>    This is the style used in several responses to your message.
>    The bodies of such adverbs/conjunctions may use only the operator
>    parameter names (m/u and/or n/v). They may not use the verb
>    paramaters (x,y) since the verb is being returned to be executed
>    later, but not executed at this time.
>    (An obsolescent style is also supported, which uses only x and y
>     are used; in this case, x and y are equivalent to u and v.)
> 
> 2) They can include entire verb bodies which are executed each time.
>    This style is invoked when you use both the operator parameters
>    (m/u/n/v) and verb parameters (x/y).
>    In this case, the verb may be ambivalent (just as with 3 : 0),
>    with the monad part coming first, optoinally followed by an
>    empty line containing a single : followed by the dyad part.
> 
> In the example above, you defined an adverb that executes a
> verb with a monadic part, but no dyadic part. As such, invoking
> it dyadically yields a domain error.
> 
> (This is a VERY common error - I find myself making it all the time!)
> 
> If you want the result to be dyadic, do this: 
> 
> CHAR =: 1  :0
> :
>   t1=: a.i.x
>   t2=: a.i.y
>   t1 u t2
> )
> 
> The reason you got valid (and strange) results for t1 and t2 was
> that your adverb body never got executed, and t1/t2 contained
> garbage left over from things you had done previously.
> 
> Something else you should consider when writing explicit verb
> or operator definitions: in most cases, unless you have a very
> good reason to do so, you should try to avoid using global
> assignments (=:) as they produce side-effects and pollute
> the namespace. For temporary variables you should use local
> assignmetns (=.) whenever possible.
> 
> One good reason to violate the above rule, however, is if you
> are trying to debug something; sometimes saving the results from
> each line in a verb in a global variable for subsequent
> examination can often be less cumbersome than using the
> debugging primitives.
> 
> Once you learn to "think tacitly", you will be able to refactor
> thinks like the above; For eaxmple:
> 
> NB. Initial explicit form
> CHAR =: 1 : 0
> :
>   t1 =. a.i.x
>   t2 =. a.i.y
>   t1 u t2
> )
> 
> NB. Use constants with monads
> NB. k u y  ->  k&u y
> CHAR =: 1 : 0 
> :
>   t1 =. (a.&i.) x
>   t2 =. (a.&i.) y
>   t1 u t2
> )
> 
> NB. Eliminate temporaries
> CHAR =: 1 : 0
> :
>   ((a.&i.) x) u ((a.&i.) y)
> )
> 
> NB. Factor common sub-expressions by using bonding conjunctions or trains:
> NB. (If v has infinite rank, the conjunctions & &. and @ are equivalent to &: 
> &.: and @:)
> NB. In this case: v = a.&i. so (v x) u (v  y) -> x u&:v y
> NB. These other patterns are also commonly used:
> NB. u (v y)  ->  u@:v y  or  u&:v y  or  ([: u v) y
> NB. v^:_1 (u (v y))  ->  u&.:v y
> NB. v^:_1 ((v x) u (v y))  ->  x u&.:v y
> NB. u (x v y)  ->  x u@:v y
> NB. (x u y) v (x w y)  ->  x (u v w) y
> NB. (u y) v (w y)  ->  x (u v w) y
> NB. x u (v y)  ->  x (u v) y
> NB. y u (v y)  ->  (u v) y
> CHAR =: 1 : 0 
> :
>   x (u &: (a.&i.)) y
> )
> 
> NB. Final tacit form
> CHAR =: 1 : 'u &: (a.&i.)'
> 
> -- Mark D. Niemiec <[EMAIL PROTECTED]>
> 
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm

_________________________________________________________________
100’s of Music vouchers to be won with MSN Music
https://www.musicmashup.co.uk----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to