In 1982, Jenkins formed a company to market the language and the Q'Nial implementation of Nial. As of 2014, the company website supports an Open Source project for the Q'Nial software with the binary and source available for download. Its license is derived from Artistic License 1.0, the only differences being the preamble, the definition of "Copyright Holder", and an instance of "whoever".
Nial concepts
Nial uses a generalized and expressive Array Theory in its Version 4, but sacrificed some of the generality of functional model, and modified the Array Theory in the Version 6. Only Version 6 is available now. Nial defines all its data types as nested rectangular arrays. ints, booleans, chars etc. are considered as a solitary array or an array containing a single member. Arrays themselves can contain other arrays to form arbitrarily deep structures. Nial also provides Records. They are defined as non-homogenous array structure. Functions in Nial are called Operations. From Nial manual: "An operation is a functional object that is given an argument array and returns a result array. The process of executing an operation by giving it an argument value is called an operation call or an operation application."
Application of operations
Nial like other APL-derived languages allows the unification of binary operators and operations. Thus the below notations have the same meaning. Note: sum is same as + Binary operation: 2 + 3 2 sum 3 Array notation: + sum Strand notation: + 2 3 sum 2 3 Grouped notation: + sum Nial also uses transformers which are higher order functions. They use the argument operation to construct a new modified operation. twice is transformer f twice rest |6 7 8
Atlas
An atlas in Nial is an operation made up of an array of component operations. When an atlas is applied to a value, each element of the atlas is applied in turn to the value to provide an end result. This is used to provide point free style of definitions. It is also used by the transformers. In the below examples 'inner ' the list '' is an atlas.
Examples
Creating arrays
count 6 |1 2 3 4 5 6 Arrays can also be literal Arr := |5 6 7 8 9 Shape gives the array dimensions and reshape can be used to reshape the dimensions. shape Arr |5 a := 2 3 reshape Arr # reshape is a binary operation with two arguments. It can also be written in prefix as # a := reshape 2,3], Arr] |5 6 7 |8 9 5 b := 3 2 reshape Arr |5 6 |7 8 |9 5 inner b |130 113 |148 145
Computing an average
Definitions are of the form '<name> is <expression>' average is / average Arr |7.
Computing a factorial
fact is recur fact 4 |24
Reversing an array
rev is reshape ] rev |4 3 2 1
Generating primes
Contrast with APL primes is sublist rest count primes 10 |2 3 5 7
Explanation
Checking the divisibility of A by B is_divisible is 0 = mod Defining is_prime filter is_prime is 2 = sum eachright is_divisible Count generates an array and pass is N. eachright applies is_divisible in each element of count-generated array. Thus this transforms the count-generated array into an array where numbers that can divide N are replaced by '1' and others by '0'. Hence if the number N is prime, sum must be 2. Now all that remains is to generate another array using count N, and filter all that are not prime. primes is sublist rest count
QuickSort
link joins together its argument arrays
sublist returns a list of items of B chosen according to the list of booleans given in A, selecting those items of B where the corresponding item of A is true.
In a Fork X the first A is a predicate, and if A is true, then B is returned else C is returned.