From J Wiki
Jump to navigation Jump to search

Work in Progress

This project discusses extensions to Fraser Jackson's primitiv.ijs script. The current version in JAL is distributed as the general/primitives addon.

Note 'Primitives and Translation'

Names for primitives

Some users may prefer a more literate form of J using words instead
of the J primitives.  We call the words alpha primitives since they
use an alphabetic form rather than a graphic or inflected graphic to
represent them.  This script provides a means of doing this with
options for the form of the words used, and verbs to convert a script
in alpha form to a script in J primitives so there is no execution
time penalty.

The alphabetic form and the graphics form can be freely mixed in a script.

This script assigns names used in the Vocabulary and Dictionary.  The
default is to use lowercase names consistent with the practise in J libraries.

These notes use CamelCase, words beginning with capitals and no
spaces.  That is consistent with the previous 'primitives' script in
the distribution and helps avoid name conflicts.
To use CamelCase which helps treat primitive names as reserved names,
place NB. at the beginning of the line
    LIT =: tolower  each LIT
following the line
    tabpri ''

Words are generally not abbreviated unless it is to follow either the
Vocabulary or Dictionary head words. Names which are duplicated in either
source have been modified to give unique names.

Modifications are:
_:  InfiniteFunction
^   ToPower
\:  Sortdown  instead of Sort
]   Right for monadic case
&.: UnderInfinite    (the infinite rank case for right argument)
d.  Derivative0  (The left term is applied rank 0)

Some common abbreviations for relations and booleans have been
added and the names First and Last for Head and Tail.

Using lower case names means that verbs sort and table in the standard
libraries will be hidden, and new definitions used. No other standard library
verbs should be affected.  The verbs max, min, cut, rotate and deal also differ
from verbs with these names in scripts 'stats','strings','isigraph' or 'random'.

Some examples of usage

0.  Using foreign language names, or your own names
Persons wishing to have a set of primitives with names in another
language merely need to replace the English names in the global
variable PRIMITIVES defined below with foreign language alternatives.

A user wishing to use their own names for primitives could
define them making replacements for the English names.

1.	To convert a script in literal form saved as a noun  myscript
to primitive form use

myscriptp =: toprimitives myscript

2.  Converting files from literal to script form

Suppose you have a script in file f written using the literal names and
would like to write it to file f1 using primitives to obtain
maximum execution speed.  The verb toprimitives has a dyadic form
which accepts as left argument the file name of a literate J script
and as right argument the file name for the same script converted to
J primitives.

f toprimitives f1

3.  To run a file in literal form.

If you have loaded this script, then use the Run menu or key shortcuts.
This will execute slower than than the options below, but given the speed
of most machines this will often not matter.

If you have saved the file with path and name f you can use
loada toload a script using alpha primitives
   loada  f

If you want to run the file and display the output use
   loadad f

3.  Conversion to literal

To convert a file using alpha primitives to the standard form is
a more complex task.  There is some excellent material on the
JWiki for this.  Look at Primitives to Mnemonics contributed
by Don Guin.

cocurrent 'z'

PRIMITIVES =: noun define
=  Equal  SelfClassify
<  LessThan LT  Box
<. LesserOf  Min  Floor
<: LessOrEqual LessThanOrEqual LE  Decrement
>  LargerThan GT  Open
>. LargerOf Max  Ceiling
>: LargerOrEqual GE Increment
_  Infinity
_. Indeterminate
_: InfinityVerb
+  Plus  Conjugate
+. Or GCD RealImaginary
+: NotOr  Nor  Double
*  Times Signum
*. LengthAngle And LCM
*: NotAnd Nand Square
-  Minus Negate
-. Less Not
-: Match Halve
%  Divide DividedBy Reciprocal
%. MatrixDivide  MatrixInverse
%: Root  SquareRoot  Sqrt
^  ToPower Exp Exponential
^. Logarithm NaturalLogarithm Log
^: Power
$  Shape  ShapeOf
$. Sparse
$: SelfReference
~  Evoke Reflexive Reflex Passive
~. Nub
~: NotEqual  NE  NubSieve
|  Residue  Magnitude
|. Rotate Shift Reverse
|: Transpose
.  DotProduct Determinant
.. Even
.: Odd
:  MonadDyad  ExplicitDefinition  Explicit
:. Obverse
:: Adverse
,  Append Ravel
,. Stitch  RavelItems
,: Itemize  Laminate
;  Link  Raze
;. Cut
;: FSM SequentialMachine Words
#  Copy  Tally
#. Base  Base2  BaseTwo
#: Antibase  Antibase2 AntibaseTwo
!  Combinations OutOf Factorial
!. Customize  Fit
!: Foreign
/  Insert Table
/. Key Oblique
/: SortUp  GradeUp
\  Prefix Infix
\. Suffix  Outfix
\: SortDown  GradeDown
[  Left Same
[: Cap
]  Right Right
{  From  Catalogue
{. Take  Head First
{: Tail Last
{:: Fetch  Map
}  Amend  ItemAmend
}. Drop  Behead
}: Curtail
"  Rank
". Numbers  Do
": Format   DefaultFormat
`  Tie
`: EvokeGerund
@  Atop
@. Agenda
@: At
&  Compose  Bond
&. Dual  Under
&.: UnderInfinite
&: Appose
?  Deal  Roll
?. DealFixed  RollFixed
a. Alphabet
a: Ace
A. Anagram  AnagramIndex
b. Basic  Boolean
C. Permute Direct Cycle
d. Derivative0
D. Derivative
D: SecantSlope
e. In MemberIn RazeIn
E. MemberOfInterval
f. Fix
H. Hypergeometric
i. IndexOf  Integers
i: IndexOfLast IntegerRange
I. IntervalIndex Indices
j. Complex  Imaginary
L. LevelOf
L: LevelAt
o. CircleFunction Circular PiTimes
p. Polynomial  Roots
p.. PolyIntegral PolyDeriv
p: Primes
q: PrimeExponents PrimeFactors
r. Polar Angle
s: Symbol
S: Spread
t. TaylorCoefficient  AssignTaylor
t: WeightedTaylor
T. TaylorApproximation
u: Unicode
x: ExtendedPrecision

NB.  Function to construct definitions for inverse transform of a
NB.  script from literate to primitives.
require 'files'

topri0 =: 3 : 0
y =. >y
v =. {. y
vt =. }. y

NB.  utility from  'system\packages\misc\fndef.ijs'
NB. *stoa  v  argument script
NB.  stoa converts any character vector to an array using
NB.  the last item as 'fret'.  The characteristic use - from
NB.  a string to array gives the name  stoa
stoa =: 3 : 0
> < ;._2 y

NB.  Establish globals required for translation

tabpri =: 3 : 0
u1 =. > ,&.> / topri0"0  ([: (<@;:)"1 stoa) PRIMITIVES
LIT =: 0{"1 u1
PRI =: 1{"1 u1

tabpri''    NB.  constructs global translation tables
NB.  Place  NB. on next line to have CamelCase form
LIT =: tolower each LIT

definealpha =: 4 : 0
pri =. >x
lit =. >y
0$". lit,' =: ',pri

NB.  setup all verb names

0 0$PRI definealpha "0 0 LIT

NB.  Function to convert scripts to primitives
NB.  The monadic form converts a noun script to primitives
NB.  The dyadic form writes thefile named in the left argument
NB.  to the file named in the right argument after conversion
NB.  of the script to primitives.

toprimitives =: 3 : 0
b =. ;: y
sb =. $b
b =. ,b
u =. I. b e. LIT
ui =. LIT i. u{b
NB. >  ,&.>/ "1 gg =: sb$ (ui{PRI) u } b
hh =: (;:^:_1) "1 gg =: sb$ (ui{PRI) u } b
(((  toprimitives 'm' fread x),.CR),.LF) fwrite y

NB.  function to load an alpha primitives J script

loada =: 3 : 0
y toprimitives jpath '~temp/zzzzzzz.ijs'
0!:000 <jpath '~temp/zzzzzzz.ijs'
ferase jpath '~temp/zzzzzzz.ijs'

NB.  load and display
loadad =: 3 : 0
y toprimitives jpath '~temp/zzzzzzz.ijs'
0!:001 <jpath '~temp/zzzzzzz.ijs'
ferase jpath '~temp/zzzzzzz.ijs'