Nial
   HOME

TheInfoList



OR:

Nial (from "Nested Interactive Array Language") is a high-level
array programming In computer science, array programming refers to solutions which allow the application of operations to an entire set of values at once. Such solutions are commonly used in scientific and engineering settings. Modern programming languages that s ...
language developed from about 1981 by Mike Jenkins of Queen's University,
Kingston, Ontario Kingston is a city in Ontario, Canada. It is located on the north-eastern end of Lake Ontario, at the beginning of the St. Lawrence River and at the mouth of the Cataraqui River (south end of the Rideau Canal). The city is midway between Toro ...
, Canada. Jenkins co-created the
Jenkins–Traub algorithm The Jenkins–Traub algorithm for polynomial zeros is a fast globally convergent iterative polynomial root-finding method published in 1970 by Michael A. Jenkins and Joseph F. Traub. They gave two variants, one for general polynomials with comple ...
. Nial combines a functional programming notation for arrays based on an array theory developed by
Trenchard More Trenchard More (1930 – 2019) was a mathematician and computer scientist who worked at IBM's Thomas J. Watson Research Center and Cambridge Scientific Center after teaching at MIT and Yale. He was also a full professor for two years at the T ...
with structured programming concepts for numeric, character, and symbolic data. It is most often used for prototyping and
artificial intelligence Artificial intelligence (AI) is intelligence—perceiving, synthesizing, and inferring information—demonstrated by machines, as opposed to intelligence displayed by animals and humans. Example tasks in which this is done include speech re ...
.


Q'Nial

In 1982, Jenkins formed a company (Nial Systems Ltd) 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" (which is changed from "whoever is named in the copyright or copyrights for the package" to "NIAL Systems Limited"), and an instance of "whoever" (which is changed to "whomever").


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 type In computer science and computer programming, a data type (or simply type) is a set of possible values and a set of allowed operations on it. A data type tells the compiler or interpreter how the programmer intends to use the data. Most progra ...
s 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: + ,3 sum ,3 Strand notation: + 2 3 sum 2 3 Grouped notation: + (2 3) sum (2 3) Nial also uses transformers which are higher order functions. They use the argument operation to construct a new modified operation. twice is transformer f (f f) twice rest , 5, 6, 7, 8 , 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 result. This is used to provide point free (without-variables) 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 := , 6, 7, 8, 9 , 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 / um, tally average Arr , 7.


Computing a factorial

fact is recur 0 =, 1 first, pass, product, -1 + fact 4 , 24


Reversing an array

rev is reshape shape,_across_[pass,_pass,_converse_append_.html" ;"title="ass,_pass,_converse_append_.html" ;"title="shape, across [pass, pass, converse append ">shape, across [pass, pass, converse append ">ass,_pass,_converse_append_.html" ;"title="shape, across [pass, pass, converse append ">shape, across [pass, pass, converse append rev [1, 2, 3, 4] , 4 3 2 1


Generating primes

Contrast with APL programming language, APL primes is sublist [ each (2 = sum eachright (0 = mod) [pass,count]), pass ] rest count primes 10 , 2 3 5 7


Explanation

Checking the divisibility of A by B is_divisible is 0 = mod ,B Defining is_prime filter is_prime is 2 = sum eachright is_divisible ass,count Count generates an array ..Nand pass is N (identity operation). eachright applies is_divisible (pass, element) 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 ransformed arraymust be 2 (itself and 1). Now all that remains is to generate another array using count N, and filter all that are not prime. primes is sublist ach is_prime, passrest count


QuickSort

* link joins its argument arrays * sublist ,Breturns 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 ,B,CX the first A is a predicate, and if A(X) is true, then B(X) is returned else C(X) is returned. * Pass is an identity operation for arrays. quicksort is fork >=_[1_first,tally ____pass, ____link_[ ________quicksort_sublist_[_<_[pass,_first.html" ;"title="_first,tally.html" ;"title=">= [1 first,tally">>= [1 first,tally pass, link [ quicksort sublist [ < [pass, first">_first,tally.html" ;"title=">= [1 first,tally">>= [1 first,tally pass, link [ quicksort sublist [ < [pass, first pass ], sublist [ match [pass,first],pass ], quicksort sublist [ > [pass,first], pass ] ] ] Using it: quicksort [5, 8, 7, 4, 3] , 3 4 5 7 8


References

{{Reflist Array programming languages