Open main menu
Home
Random
Recent changes
Special pages
Community portal
Preferences
About Wikipedia
Disclaimers
Incubator escapee wiki
Search
User menu
Talk
Dark mode
Contributions
Create account
Log in
Editing
Nial
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
{{Short description|Programming language}} {{for multi|the village in Iran|Nial, Iran|the given name|Niall}} {{more citations needed|date=January 2022}} {{Infobox programming language |name = Nial |logo = [[File:NialLogo.jpg]] |paradigm = [[array programming|array]] |year = 1981 |designer = Mike Jenkins |developer = Nial Systems Ltd |latest release version = 7.0 |latest release date = {{release date and age|2017}} |typing = [[dynamic typing|dynamic]] |implementations = Q'Nial |dialects = |influenced_by = [[APL programming language|APL]], [[Lisp programming language|Lisp]] |influenced = |file ext = .ndf, .nlg |license = [[GNU GPLv3]] |website = {{URL|https://www.nial-array-language.org/}} }} '''Nial''' (from "Nested Interactive Array Language") is a high-level [[array programming]] language developed from about 1981 by Mike Jenkins of [[Queen's University at Kingston|Queen's University]], [[Kingston, Ontario]], Canada. Jenkins co-created the [[Jenkins–Traub algorithm]]. Nial combines a functional programming notation for arrays based on an array theory developed by [[Trenchard More]] with structured programming concepts for numeric, character, and symbolic data. It is most often used for prototyping and [[artificial intelligence]]. == Q'Nial == <ref>{{Cite web|url=https://github.com/danlm/QNial7/blob/master/README.md|title = The Nial Language|website = [[GitHub]]|date = 17 December 2021}}</ref> 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#Artistic License 1.0|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]]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: <code>sum</code> is same as <code>+</code> Binary operation: 2 + 3 2 sum 3 Array notation: + [2,3] sum [2,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 [4, 5, 6, 7, 8] |6 7 8 == Atlas == <ref>{{Cite web|url=https://www.nial-array-language.org/ndocs/NialDictionary.html#atlas|title = Q'Nial Dictionary V7}}</ref> 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 := [5, 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 {{not a typo|a}} inner[+,*] b |130 113 |148 145 === Computing an average === Definitions are of the form '<name> is <expression>' average is / [sum, 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 ] ] 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 [A,B] Defining is_prime filter is_prime is 2 = sum eachright is_divisible [pass,count] Count generates an array [1..N] and 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 [transformed array] must 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 [each is_prime, pass] rest count === QuickSort === * <code>link</code> joins its argument arrays * <code>sublist</code> [A,B] 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 <code>Fork</code> [A,B,C] X the first A is a predicate, and if A(X) is true, then B(X) is returned else C(X) is returned. * <code>Pass</code> is an identity operation for arrays. quicksort is fork [ >= [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}} [[Category:Array programming languages]]
Edit summary
(Briefly describe your changes)
By publishing changes, you agree to the
Terms of Use
, and you irrevocably agree to release your contribution under the
CC BY-SA 4.0 License
and the
GFDL
. You agree that a hyperlink or URL is sufficient attribution under the Creative Commons license.
Cancel
Editing help
(opens in new window)
Pages transcluded onto the current version of this page
(
help
)
:
Template:Cite web
(
edit
)
Template:For multi
(
edit
)
Template:Infobox programming language
(
edit
)
Template:More citations needed
(
edit
)
Template:Not a typo
(
edit
)
Template:Reflist
(
edit
)
Template:Short description
(
edit
)