a: is a dummy argument used to avoid the bracketted alternative 1 : '(0) 1 : m'

providing an argument executes the 1 : m adverb.

eval can return (evaluate) nouns, dyadic verbs and modifiers, in addition to 
apply's monadic verbs.

   2 '+' eval 3 
5 
  # '33' eval 
1 

   +: '@+/\' eval i.4 
0 2 12 44 
   '+:' eval '@+/\' eval i.4 
0 2 12 44 

   22 '+' eval '+/\' eval i.4 
22 23 25 28 
   '22' eval '+' eval '+/\' eval i.4 
22 23 25 28 

Here is a templating conjunction that produces any form of speech, and has some 
fancyness with stripping out unused template variables:

evalT =: 2 : 0 
 imax =: <: # n NB. strip unused Ts (optional) 

 m =.  ]`(''"_)@.(imax< 0 ". }.)^:('T'={.) each ;: m 
 NB. for_i. n do. ('T',": i_index) =. (>i) eval end.  NB. used with eval f. on 
last line
. creates temp vars
 for_i. n do. m =. i (I. m = <'T',": i_index) } m end. 
 (;: inv m) eval   NB. f. version cannot eval to a noun, and generally 
unpreferable to substitution method 
)

   '(T0 % T1) T2' evalT ('+/';'#') NB. T2 unused and stripped out
+/ % # 

      '(T0 % T1) T2' evalT ('+/';'#';'';'nothing') NB. can also pass empty 
arg/skip/too many args
+/ % # 

   '(T0 % T1) T2' evalT ('+/';'#';":@:i.5) NB. can use lr instead of ": for 
more complex data arg
2 

   '(T0 % T1) T2' evalT ('+/';'#') i.5 
2 

   '(T0 % T1) T2' evalT ('+/';'#';'@:(#~0<])') i.5 
2.5 

substitution version also allows invalid fragments:

   'T0 % T1' evalT ('(+/';'#)') i.5 
2 
   'T0 % T1' evalT ('(+/';'#)@:(#~0<])') i.5 
2.5 
   sum =: +/ 
   'T0 % T1' evalT ('(sum';'#)@:(#~0<])') i.5 
2.5 

you can also use multiple T# in template and they will all be substituted by 
same value from n

   'T0 @: T1 @: T2' evalT ('+/';'#';'';'nothing') NB. makes an adverb dealing 
with too many params
+/@:#@: 



----- Original Message -----
From: Brian Schott <schott.br...@gmail.com>
To: Programming forum <programm...@jsoftware.com>
Cc: 
Sent: Saturday, April 26, 2014 10:53:33 AM
Subject: Re: [Jprogramming] J in 5 minutes

Pascal,

Not bad, at all. I have seen eval before I think, but did not understand
its use.

Now I am trying to understand its pieces.

eval =: 1 : ' a: 1 :  m'

Am I correct that the `1 : m` part is an explict adverb and that `a:` is
its argument that is not even used until eval is executed. I am pretty sure
that is right, because I tried to redefine eval as follows, as an
experiment, and got the undesirable, but informative result I show below.
Notice that I replaced a: with eval, and the final result of FName_eq is
wrong, but telling.

   eval =: 1 : ' eval 1 :  m'
   evalassign =: 4 : ('(x) =: y eval';'1')
   cols=: 'FName';'LName';'Age';'Company'

       ( (') # ]',~ '(= ' ,]) evalassign~ '_eq' ,~ ]) each cols
┌─┬─┬─┬─┐
│1│1│1│1│
└─┴─┴─┴─┘
   FName_eq
eval(1 : '(= FName) # ]')



On Fri, Apr 25, 2014 at 10:23 PM, 'Pascal Jasmin' via Programming <
programm...@jsoftware.com> wrote:

> remembering eval
>
> eval =: 1 : ' a: 1 :  m'
> evalassign =: 4 : ('(x) =: y eval';'1')
>
> evalassign turns eval into a verb (so we can use rank or each on it), and
> discards the result (would be a domain error to not return a noun from a
> verb), but in the process assign what y evals to (x).
>
> so:
> cols=: 'FName';'LName';'Age';'Company'
>
>     ( (') # ]',~ '(= ' ,]) evalassign~ '_eq' ,~ ]) each cols
> ┌─┬─┬─┬─┐
> │1│1│1│1│
> └─┴─┴─┴─┘
>    FName_eq
> (= FName) # ]
>
>
> it could be prettier with a templating verb (that substitutes into an x
> argument), but still not bad?
>
>
> --
(B=)
----------------------------------------------------------------------
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