JPhrases/ExplicitDef

From J Wiki
Jump to: navigation, search

2E. Explicit Definitions

Explicit definition is convenient for anyone more familiar with conventional programming, particularly that using if-then-else forms. It is also convenient for anyone engaged in extending their mastery of tacit programming: the automatic translation of a one-line explicit definition to tacit form can provide instruction in the reading and writing of tacit expressions. For example:

   log=: 3 : '10 ^. y'
   log 1 10 20 40 100
0 1 1.30103 1.60206 2

   log			NB. Display of the definition of log
3 : '10 ^. y'

   log=: 13 : '10 ^. y'
   log 1 10 20 40 100
0 1 1.30103 1.60206 2
   log			NB. Display of the (tacit) definition of log
10"_ ^. ]
a0=: define=: : 0 Adverb for entering explicit definitions

The phrases 1 : 0 and 2 : 0 and 3 : 0 may be used for entering explicit definitions of adverbs, conjunctions, and functions, without entering enclosing quotes. The adverb define defined above makes their use somewhat more convenient. For example:

   LOG=: 3 define
10 ^. y
:
x ^. y
)


   LOG 10
1
   2 LOG 32
5

   rat=: 2 define
x&p. % y&p.
)

   1 4 6 4 1 rat 1 2 1
1 4 6 4 1&p. % 1 2 1&p.

   (1 4 6 4 1 rat 1 2 1) i. 6
1 4 9 16 25 36

It is important to recognize that explicit definitions are ordinary J statements (using the conjunction :) , and can be used with other expressions. For example:

   mat=: [;._2 (0 : 0)	        NB. Define matrix
one
two
three
)

   boxed=: <;._2 (0 : 0)	NB. Define boxed list
one
two
three
)

   fn=: 3 : 0"1                 NB. Assign rank to an explicitly defined function
< +/ y
)

   arg=: 3
   3 : 0 arg	                NB. Execute unnamed explicit definition
if. 2|y do. 'odd' else. 'even' end.
)
odd

   mat
one
two
three

   $mat
3 5

   boxed
+-------------+
|one|two|three|
+-------------+

   fn i. 3 4
+-------+
|6|22|38|
+-------+