@@ -11,64 +11,64 @@ <h2>Readable and concise concatenative programming</h2>
11
11
< div class ="code "> < pre >
12
12
< span class ="Comment "> ~~ Fizzbuzz in Cognate</ span >
13
13
14
- < span class ="Constant "> Def</ span > < span class =" NonText " > </ span > < span class ="Function "> Multiple</ span > < span class =" NonText " > </ span > < span class ="Normal "> as</ span > < span class =" NonText " > </ span > (< span class ="Function "> Zero?</ span > < span class =" NonText " > </ span > < span class ="Function "> Modulo</ span > )< span class ="Normal "> ;</ span >
14
+ < span class ="Constant "> Def</ span > < span class ="Function "> Multiple</ span > < span class ="Normal "> as</ span > (< span class ="Function "> Zero?</ span > < span class ="Function "> Modulo</ span > )< span class ="Normal "> ;</ span >
15
15
16
- < span class ="Constant "> Def</ span > < span class =" NonText " > </ span > < span class ="Function "> Fizzbuzz</ span >
17
- < span class =" NonText " > </ span > < span class ="Conditional "> Case</ span > < span class =" NonText " > </ span > (< span class ="Function "> Multiple</ span > < span class =" NonText " > </ span > < span class ="Normal "> of</ span > < span class =" NonText " > </ span > < span class ="Number "> 15</ span > )< span class =" NonText " > </ span > < span class ="Normal "> is</ span > < span class =" NonText " > </ span > < span class ="String "> "fizzbuzz"</ span >
18
- < span class =" NonText " > </ span > < span class ="Conditional "> Case</ span > < span class =" NonText " > </ span > (< span class ="Function "> Multiple</ span > < span class =" NonText " > </ span > < span class ="Normal "> of</ span > < span class =" NonText " > </ span > < span class ="Number "> 3</ span > )< span class =" NonText " > </ span > < span class ="Normal "> is</ span > < span class =" NonText " > </ span > < span class ="String "> "fizz"</ span >
19
- < span class =" NonText " > </ span > < span class ="Conditional "> Case</ span > < span class =" NonText " > </ span > (< span class ="Function "> Multiple</ span > < span class =" NonText " > </ span > < span class ="Normal "> of</ span > < span class =" NonText " > </ span > < span class ="Number "> 5</ span > )< span class =" NonText " > </ span > < span class ="Normal "> is</ span > < span class =" NonText " > </ span > < span class ="String "> "buzz"</ span >
20
- < span class =" NonText " > </ span > < span class ="Normal "> otherwise</ span > < span class =" NonText " > </ span > ()< span class ="Normal "> ;</ span >
16
+ < span class ="Constant "> Def</ span > < span class ="Function "> Fizzbuzz</ span >
17
+ < span class ="Conditional "> Case</ span > (< span class ="Function "> Multiple</ span > < span class ="Normal "> of</ span > < span class ="Number "> 15</ span > ) < span class ="Normal "> is</ span > < span class ="String "> "fizzbuzz"</ span >
18
+ < span class ="Conditional "> Case</ span > (< span class ="Function "> Multiple</ span > < span class ="Normal "> of</ span > < span class ="Number "> 3</ span > ) < span class ="Normal "> is</ span > < span class ="String "> "fizz"</ span >
19
+ < span class ="Conditional "> Case</ span > (< span class ="Function "> Multiple</ span > < span class ="Normal "> of</ span > < span class ="Number "> 5</ span > ) < span class ="Normal "> is</ span > < span class ="String "> "buzz"</ span >
20
+ < span class ="Normal "> otherwise</ span > ()< span class ="Normal "> ;</ span >
21
21
22
- < span class ="Conditional "> For</ span > < span class =" NonText " > </ span > < span class ="Normal "> each</ span > < span class =" NonText " > </ span > < span class ="Normal "> in</ span > < span class =" NonText " > </ span > < span class ="Function "> Range</ span > < span class =" NonText " > </ span > < span class ="Number "> 1</ span > < span class =" NonText " > </ span > < span class ="Normal "> to</ span > < span class =" NonText " > </ span > < span class ="Number "> 100</ span > < span class =" NonText " > </ span > (< span class ="Special "> Print</ span > < span class =" NonText " > </ span > < span class ="Function "> Fizzbuzz</ span > )
22
+ < span class ="Conditional "> For</ span > < span class ="Normal "> each</ span > < span class ="Normal "> in</ span > < span class ="Function "> Range</ span > < span class ="Number "> 1</ span > < span class ="Normal "> to</ span > < span class ="Number "> 100</ span > (< span class ="Special "> Print</ span > < span class ="Function "> Fizzbuzz</ span > )
23
23
</ pre > </ div >
24
24
< div class ="text "> Cognate is a project aiming to create a human readable programming language with as little syntax as possible. Where natural language programming usually uses many complex syntax rules, instead Cognate takes them away. What it adds is simple, a way to embed comments into statements.</ div >
25
25
< div class ="code "> < pre >
26
26
< span class ="Comment "> ~~ Towers of Hanoi in Cognate</ span >
27
27
28
- < span class ="Constant "> Def</ span > < span class =" NonText " > </ span > < span class ="Function "> Move</ span > < span class =" NonText " > </ span > < span class ="Normal "> discs</ span > < span class =" NonText " > </ span > < span class ="Normal "> as</ span > < span class =" NonText " > </ span > (
28
+ < span class ="Constant "> Def</ span > < span class ="Function "> Move</ span > < span class ="Normal "> discs</ span > < span class ="Normal "> as</ span > (
29
29
30
- < span class =" NonText " > </ span > < span class ="Constant "> Let</ span > < span class =" NonText " > </ span > < span class ="Function "> N</ span > < span class =" NonText " > </ span > < span class ="Normal "> be</ span > < span class =" NonText " > </ span > < span class ="Normal "> number</ span > < span class =" NonText " > </ span > < span class ="Normal "> of</ span > < span class =" NonText " > </ span > < span class ="Normal "> discs</ span > < span class ="Normal "> ;</ span >
31
- < span class =" NonText " > </ span > < span class ="Constant "> Let</ span > < span class =" NonText " > </ span > < span class ="Function "> A</ span > < span class =" NonText " > </ span > < span class ="Normal "> be</ span > < span class =" NonText " > </ span > < span class ="Normal "> first</ span > < span class =" NonText " > </ span > < span class ="Normal "> rod</ span > < span class ="Normal "> ;</ span >
32
- < span class =" NonText " > </ span > < span class ="Constant "> Let</ span > < span class =" NonText " > </ span > < span class ="Function "> B</ span > < span class =" NonText " > </ span > < span class ="Normal "> be</ span > < span class =" NonText " > </ span > < span class ="Normal "> second</ span > < span class =" NonText " > </ span > < span class ="Normal "> rod</ span > < span class ="Normal "> ;</ span >
33
- < span class =" NonText " > </ span > < span class ="Constant "> Let</ span > < span class =" NonText " > </ span > < span class ="Function "> C</ span > < span class =" NonText " > </ span > < span class ="Normal "> be</ span > < span class =" NonText " > </ span > < span class ="Normal "> third</ span > < span class =" NonText " > </ span > < span class ="Normal "> rod</ span > < span class ="Normal "> ;</ span >
30
+ < span class ="Constant "> Let</ span > < span class ="Function "> N</ span > < span class ="Normal "> be</ span > < span class ="Normal "> number</ span > < span class ="Normal "> of</ span > < span class ="Normal "> discs</ span > < span class ="Normal "> ;</ span >
31
+ < span class ="Constant "> Let</ span > < span class ="Function "> A</ span > < span class ="Normal "> be</ span > < span class ="Normal "> first</ span > < span class ="Normal "> rod</ span > < span class ="Normal "> ;</ span >
32
+ < span class ="Constant "> Let</ span > < span class ="Function "> B</ span > < span class ="Normal "> be</ span > < span class ="Normal "> second</ span > < span class ="Normal "> rod</ span > < span class ="Normal "> ;</ span >
33
+ < span class ="Constant "> Let</ span > < span class ="Function "> C</ span > < span class ="Normal "> be</ span > < span class ="Normal "> third</ span > < span class ="Normal "> rod</ span > < span class ="Normal "> ;</ span >
34
34
35
- < span class =" NonText " > </ span > < span class ="Function "> Unless</ span > < span class =" NonText " > </ span > < span class ="Function "> Zero?</ span > < span class =" NonText " > </ span > < span class ="Function "> N</ span > < span class =" NonText " > </ span > (
36
- < span class =" NonText " > </ span > < span class ="Function "> Move</ span > < span class =" NonText " > </ span > < span class ="Operator "> -</ span > < span class =" NonText " > </ span > < span class ="Number "> 1</ span > < span class =" NonText " > </ span > < span class ="Function "> N</ span > < span class =" NonText " > </ span > < span class ="Normal "> discs</ span > < span class =" NonText " > </ span > < span class ="Normal "> from</ span > < span class =" NonText " > </ span > < span class ="Function "> A</ span > < span class =" NonText " > </ span > < span class ="Normal "> via</ span > < span class =" NonText " > </ span > < span class ="Function "> C</ span > < span class =" NonText " > </ span > < span class ="Normal "> to</ span > < span class =" NonText " > </ span > < span class ="Function "> B</ span > < span class ="Normal "> ;</ span >
37
- < span class =" NonText " > </ span > < span class ="Special "> Prints</ span > < span class =" NonText " > </ span > (< span class ="String "> "Move disc "</ span > < span class =" NonText " > </ span > < span class ="Function "> N</ span > < span class =" NonText " > </ span > < span class ="String "> " from "</ span > < span class =" NonText " > </ span > < span class ="Function "> A</ span > < span class =" NonText " > </ span > < span class ="String "> " to "</ span > < span class =" NonText " > </ span > < span class ="Function "> C</ span > )< span class ="Normal "> ;</ span >
38
- < span class =" NonText " > </ span > < span class ="Function "> Move</ span > < span class =" NonText " > </ span > < span class ="Operator "> -</ span > < span class =" NonText " > </ span > < span class ="Number "> 1</ span > < span class =" NonText " > </ span > < span class ="Function "> N</ span > < span class =" NonText " > </ span > < span class ="Normal "> discs</ span > < span class =" NonText " > </ span > < span class ="Normal "> from</ span > < span class =" NonText " > </ span > < span class ="Function "> B</ span > < span class =" NonText " > </ span > < span class ="Normal "> via</ span > < span class =" NonText " > </ span > < span class ="Function "> A</ span > < span class =" NonText " > </ span > < span class ="Normal "> to</ span > < span class =" NonText " > </ span > < span class ="Function "> C</ span > < span class ="Normal "> ;</ span >
39
- < span class =" NonText " > </ span > )
35
+ < span class ="Function "> Unless</ span > < span class ="Function "> Zero?</ span > < span class ="Function "> N</ span > (
36
+ < span class ="Function "> Move</ span > < span class ="Operator "> -</ span > < span class ="Number "> 1</ span > < span class ="Function "> N</ span > < span class ="Normal "> discs</ span > < span class ="Normal "> from</ span > < span class ="Function "> A</ span > < span class ="Normal "> via</ span > < span class ="Function "> C</ span > < span class ="Normal "> to</ span > < span class ="Function "> B</ span > < span class ="Normal "> ;</ span >
37
+ < span class ="Special "> Prints</ span > (< span class ="String "> "Move disc "</ span > < span class ="Function "> N</ span > < span class ="String "> " from "</ span > < span class ="Function "> A</ span > < span class ="String "> " to "</ span > < span class ="Function "> C</ span > )< span class ="Normal "> ;</ span >
38
+ < span class ="Function "> Move</ span > < span class ="Operator "> -</ span > < span class ="Number "> 1</ span > < span class ="Function "> N</ span > < span class ="Normal "> discs</ span > < span class ="Normal "> from</ span > < span class ="Function "> B</ span > < span class ="Normal "> via</ span > < span class ="Function "> A</ span > < span class ="Normal "> to</ span > < span class ="Function "> C</ span > < span class ="Normal "> ;</ span >
39
+ )
40
40
)< span class ="Normal "> ;</ span >
41
41
42
- < span class ="Function "> Move</ span > < span class =" NonText " > </ span > < span class ="Number "> 5</ span > < span class =" NonText " > </ span > < span class ="Normal "> discs</ span > < span class =" NonText " > </ span > < span class ="Normal "> from</ span > < span class =" NonText " > </ span > < span class ="String "> "a"</ span > < span class =" NonText " > </ span > < span class ="Normal "> via</ span > < span class =" NonText " > </ span > < span class ="String "> "b"</ span > < span class =" NonText " > </ span > < span class ="Normal "> to</ span > < span class =" NonText " > </ span > < span class ="String "> "c"</ span >
42
+ < span class ="Function "> Move</ span > < span class ="Number "> 5</ span > < span class ="Normal "> discs</ span > < span class ="Normal "> from</ span > < span class ="String "> "a"</ span > < span class ="Normal "> via</ span > < span class ="String "> "b"</ span > < span class ="Normal "> to</ span > < span class ="String "> "c"</ span >
43
43
</ pre > </ div >
44
44
< div class ="text "> As you can see, Cognate ignores words starting with lowercase letters, allowing them to be used to describe functionality and enhance readability. This makes Cognate codebases intuitive and maintainable.</ div >
45
45
< div class ="code "> < pre >
46
46
< span class ="Comment "> ~~ Square numbers in Cognate</ span >
47
47
48
- < span class ="Constant "> Def</ span > < span class =" NonText " > </ span > < span class ="Function "> Square</ span > < span class =" NonText " > </ span > < span class ="Normal "> as</ span > < span class =" NonText " > </ span > (< span class ="Operator "> *</ span > < span class =" NonText " > </ span > < span class ="Function "> Twin</ span > )< span class ="Normal "> ;</ span >
49
- < span class ="Function "> Map</ span > < span class =" NonText " > </ span > (< span class ="Function "> Square</ span > )< span class =" NonText " > </ span > < span class ="Normal "> over</ span > < span class =" NonText " > </ span > < span class ="Function "> Range</ span > < span class =" NonText " > </ span > < span class ="Number "> 1</ span > < span class =" NonText " > </ span > < span class ="Normal "> to</ span > < span class =" NonText " > </ span > < span class ="Number "> 10</ span > < span class ="Normal "> ;</ span >
48
+ < span class ="Constant "> Def</ span > < span class ="Function "> Square</ span > < span class ="Normal "> as</ span > (< span class ="Operator "> *</ span > < span class ="Function "> Twin</ span > )< span class ="Normal "> ;</ span >
49
+ < span class ="Function "> Map</ span > (< span class ="Function "> Square</ span > ) < span class ="Normal "> over</ span > < span class ="Function "> Range</ span > < span class ="Number "> 1</ span > < span class ="Normal "> to</ span > < span class ="Number "> 10</ span > < span class ="Normal "> ;</ span >
50
50
< span class ="Special "> Print</ span >
51
51
</ pre > </ div >
52
- < div class ="text "> Cognate is a stack-oriented programming language similar to Forth or Factor, except expressions are evaluated right to left. This gives the expressiveness of concatenative programming as well as the readability of prefix notation. Expressions can be delimited at arbitrary points, allowing them to read as sentences would in English.</ div >
52
+ < div class ="text "> Cognate is a stack-oriented programming language similar to Forth or Factor, except statements are evaluated right to left. This gives the expressiveness of concatenative programming as well as the readability of prefix notation. Statements can be delimited at arbitrary points, allowing them to read as sentences would in English.</ div >
53
53
< div class ="code "> < pre >
54
54
< span class ="Comment "> ~~ Prime numbers in Cognate</ span >
55
55
56
- < span class ="Constant "> Def</ span > < span class =" NonText " > </ span > < span class ="Function "> Factor</ span > < span class =" NonText " > </ span > (< span class ="Function "> Zero?</ span > < span class =" NonText " > </ span > < span class ="Function "> Modulo</ span > < span class =" NonText " > </ span > < span class ="Function "> Swap</ span > )< span class ="Normal "> ;</ span >
56
+ < span class ="Constant "> Def</ span > < span class ="Function "> Factor</ span > (< span class ="Function "> Zero?</ span > < span class ="Function "> Modulo</ span > < span class ="Function "> Swap</ span > )< span class ="Normal "> ;</ span >
57
57
58
- < span class ="Constant "> Def</ span > < span class =" NonText " > </ span > < span class ="Function "> Primes</ span > < span class =" NonText " > </ span > (
59
- < span class =" NonText " > </ span > < span class ="Constant "> Let</ span > < span class =" NonText " > </ span > < span class ="Function "> U</ span > < span class =" NonText " > </ span > < span class ="Normal "> is</ span > < span class =" NonText " > </ span > < span class ="Normal "> upper</ span > < span class =" NonText " > </ span > < span class ="Normal "> bound</ span > < span class ="Normal "> ;</ span >
60
- < span class =" NonText " > </ span > < span class ="Normal "> initially</ span > < span class =" NonText " > </ span > < span class ="Function "> List</ span > < span class =" NonText " > </ span > ()< span class ="Normal "> ;</ span >
61
- < span class =" NonText " > </ span > < span class ="Conditional "> For</ span > < span class =" NonText " > </ span > < span class ="Function "> Range</ span > < span class =" NonText " > </ span > < span class ="Number "> 2</ span > < span class =" NonText " > </ span > < span class ="Normal "> to</ span > < span class =" NonText " > </ span > < span class ="Function "> U</ span > < span class =" NonText " > </ span > (
62
- < span class =" NonText " > </ span > < span class ="Constant "> Let</ span > < span class =" NonText " > </ span > < span class ="Function "> P</ span > < span class =" NonText " > </ span > < span class ="Normal "> is</ span > < span class =" NonText " > </ span > < span class ="Normal "> potential</ span > < span class =" NonText " > </ span > < span class ="Normal "> prime</ span > < span class ="Normal "> ;</ span >
63
- < span class =" NonText " > </ span > < span class ="Constant "> Let</ span > < span class =" NonText " > </ span > < span class ="Function "> Found</ span > < span class =" NonText " > </ span > < span class ="Normal "> be</ span > < span class =" NonText " > </ span > < span class ="Normal "> list</ span > < span class =" NonText " > </ span > < span class ="Normal "> of</ span > < span class =" NonText " > </ span > < span class ="Normal "> found</ span > < span class =" NonText " > </ span > < span class ="Normal "> primes</ span > < span class ="Normal "> ;</ span >
64
- < span class =" NonText " > </ span > < span class ="Constant "> Let</ span > < span class =" NonText " > </ span > < span class ="Function "> To-check</ span > < span class =" NonText " > </ span > < span class ="Normal "> be</ span > < span class =" NonText " > </ span > < span class ="Function "> Take-while</ span > < span class =" NonText " > </ span > (< span class ="Operator "> <=</ span > < span class =" NonText " > </ span > < span class ="Function "> Sqrt</ span > < span class =" NonText " > </ span > < span class ="Function "> P</ span > )< span class =" NonText " > </ span > < span class ="Function "> Found</ span > < span class ="Normal "> ;</ span >
65
- < span class =" NonText " > </ span > < span class ="Function "> When</ span > < span class =" NonText " > </ span > < span class ="Function "> All</ span > < span class =" NonText " > </ span > (< span class ="Function "> Not</ span > < span class =" NonText " > </ span > < span class ="Function "> Factor</ span > < span class =" NonText " > </ span > < span class ="Normal "> of</ span > < span class =" NonText " > </ span > < span class ="Function "> P</ span > )< span class =" NonText " > </ span > < span class ="Function "> To-check</ span > < span class =" NonText " > </ span > (
66
- < span class =" NonText " > </ span > < span class ="Function "> Append</ span > < span class =" NonText " > </ span > < span class ="Function "> P</ span >
67
- < span class =" NonText " > </ span > ) < span class =" NonText " > </ span > < span class ="Normal "> to</ span > < span class =" NonText " > </ span > < span class ="Function "> Found</ span >
68
- < span class =" NonText " > </ span > )
58
+ < span class ="Constant "> Def</ span > < span class ="Function "> Primes</ span > (
59
+ < span class ="Constant "> Let</ span > < span class ="Function "> U</ span > < span class ="Normal "> is</ span > < span class ="Normal "> upper</ span > < span class ="Normal "> bound</ span > < span class ="Normal "> ;</ span >
60
+ < span class ="Normal "> initially</ span > < span class ="Function "> List</ span > ()< span class ="Normal "> ;</ span >
61
+ < span class ="Conditional "> For</ span > < span class ="Function "> Range</ span > < span class ="Number "> 2</ span > < span class ="Normal "> to</ span > < span class ="Function "> U</ span > (
62
+ < span class ="Constant "> Let</ span > < span class ="Function "> P</ span > < span class ="Normal "> is</ span > < span class ="Normal "> potential</ span > < span class ="Normal "> prime</ span > < span class ="Normal "> ;</ span >
63
+ < span class ="Constant "> Let</ span > < span class ="Function "> Found</ span > < span class ="Normal "> be</ span > < span class ="Normal "> list</ span > < span class ="Normal "> of</ span > < span class ="Normal "> found</ span > < span class ="Normal "> primes</ span > < span class ="Normal "> ;</ span >
64
+ < span class ="Constant "> Let</ span > < span class ="Function "> To-check</ span > < span class ="Normal "> be</ span > < span class ="Function "> Take-while</ span > (< span class ="Operator "> <=</ span > < span class ="Function "> Sqrt</ span > < span class ="Function "> P</ span > ) < span class ="Function "> Found</ span > < span class ="Normal "> ;</ span >
65
+ < span class ="Function "> When</ span > < span class ="Function "> All</ span > (< span class ="Function "> Not</ span > < span class ="Function "> Factor</ span > < span class ="Normal "> of</ span > < span class ="Function "> P</ span > ) < span class ="Function "> To-check</ span > (
66
+ < span class ="Function "> Append</ span > < span class ="Function "> P</ span >
67
+ ) < span class ="Normal "> to</ span > < span class ="Function "> Found</ span >
68
+ )
69
69
)< span class ="Normal "> ;</ span >
70
70
71
- < span class ="Special "> Print</ span > < span class =" NonText " > </ span > < span class ="Function "> Primes</ span > < span class =" NonText " > </ span > < span class ="Normal "> up</ span > < span class =" NonText " > </ span > < span class ="Normal "> to</ span > < span class =" NonText " > </ span > < span class ="Number "> 1000</ span > < span class ="Normal "> ;</ span >
71
+ < span class ="Special "> Print</ span > < span class ="Function "> Primes</ span > < span class ="Normal "> up</ span > < span class ="Normal "> to</ span > < span class ="Number "> 1000</ span > < span class ="Normal "> ;</ span >
72
72
</ pre > </ div >
73
73
< div class ="text "> Cognate borrows from other concatenative languages, but also adds unique features of its own.</ div >
74
74
< ul > < li > Point-free functions</ li > < li > Operation chaining</ li > < li > Multiple return values</ li > < li > Combinator oriented programming</ li > < li > Predicate pattern matching</ li > < li > Natural language programming</ li > < li > Gradual typing with inference</ li > </ ul >
0 commit comments