Wednesday, January 24, 2018

Important programming languages to learn (a break from C++17 and friends)

A break from C++17 and friends. If I had to name the programming languages that are important to learn I would include LISP somewhere near the top of the list (no pun intended). One thing that speaks in favor of LISP is the fact that learning it will develop your programmer mind in ways that other programming languages will not. The other factor in favor of learning this language is the doors it will open for you. Armed with your knowledge of LISP you will be able to use a great number of good tools and platform. In Linux for example there is a large number of implementations available (Steel Bank Common Lisp, GNU Common Lisp and possibly others). LISP is also available on the Java VM in the form of Clojure, ABCL, KAWA (a Scheme) and possibly other implementations. For a few years now Lisp is also an option when programming for the Erlang VM as LFE (Lisp flavor Erlang). Erlang has a Virtual machine (BEAM) that has interesting characteristics and is certainly worth taking a look at. However, Erlang (the primary language for this platform) is not a language that has the same availability as Lisp so learning Erlang might be considered too large an investment. Fortunatly with a dialect of Lisp available you now have an interesting alternative. Here is me fooling around in the Erlang LFE REPL:
Erlang R14B04 (erts-5.8.5) [source] [smp:2:2] [rq:2] [async-threads:0] [kernel-poll:false]

lfe: (set mytuple #(1 "Winston Churchill"))
#(1 "Winston Churchill")
lfe: (element 1 mytuple)
1
lfe> (element 2 mytuple)
"Winston Churchill"
lfe: (defun nth (n atuple) (element n atuple))
nth
lfe: (nth 1 mytuple)
1
lfe: (nth 2 mytuple)
"Winston Churchill"
lfe: (defun doubleit (x) (* 2 x))
doubleit
lfe: (doubleit 2342342342)
4684684684
I create a tuple and peek at the values inside using the 'element' function. Since 'element' feels a little long I define a function named 'nth' to mimic a function available for List in other Common Lisp implementation, I also create a simple function 'doubleit'. Here is me fooling around in the GNU GCL REPL:
GCL (GNU Common Lisp)  2.6.7 CLtL1    Feb  1 2012 09:07:26
Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)
Binary License:  GPL due to GPL'ed components: (XGCL READLINE UNEXEC)
Modifications of this banner must retain notice of a compatible license
Dedicated to the memory of W. Schelter

Use (help) to get some basic information on how to use GCL.
Temporary directory for compiler files set to /tmp/

::(defvar *mylist*)

*MYLIST*

::(setf *mylist* '(1 "WInston"))

(1 "WInston")

::(nth 1 *mylist*)

"WInston"
>>(nth 0 *mylist*)

1
::(defun doubleit (x) (* 2 x))

DOUBLEIT
::(doubleit 4598349)

9196698
Clojure alone is enough of a reason to learn Lisp. Even more so now that Clojure Script is available.

Friday, January 5, 2018

Fooling around with C++17 (part 1)

New years resolution

In 2018 I will be back writing post here and I will try to be more consistent. I will eventually go back to the subject of 'dynamic like' Java programming but just for fun I will start the year by looking at C++17 (including x14 and x11) C++ is starting too look like a 21 century programming language so I think it is well worth looking at a few features that are starting to make programming really more productive. WARNING: this is not a C++ style guide.

auto this, auto that

C++14 and 17 extend the power of auto and really make it more productive. In C++11 they added the posibility of using auto for the return type of functions but you still had to provide the type using the new arrow syntax. In C++14 they completely removed the need to explicitly provide the type. Here is an example with both syntax:
class LazyCoder
    {
    public:
        auto get_it_Cv11 () -> int
            {
            return 11;
            }

        auto get_it_Cv17 ()
            {
            return 17;
            }
    };
I don't think this is the best use of auto since the type in function declaration is also good documentation (better than comments). In C++11 you could use auto for local variable declaration, for loop variables, function parameters. With C++14 and C++17 you can now also use auto when declaring a variable in the scope of an 'if' and also when doing structured bindings (similar to other languages 'destructuring')
    // Create a tuple
    auto tuple = std::make_tuple(3, 7);

    // C++14
    int i, j;
    std::tie(i,j) = tuple;

    assert (i == 3 && j == 7);

    // C++17 (look ma, no explicit variable declaration)
    auto [x, y] = tuple;

    assert (x == 3 && y == 7);

    // and then ...
    if (auto t = (x != y))
        {
        // I can use t here
        cout << "This is getting ridiculous like t=" << t << endl;
        }
C++z17 has one more trick up its sleeve. The 'structured binding' works with user data types.
    // I have this struct defined somwhere
    struct Zmas
        {
        int z, w;
        };

    // Now I can do this:
    Zmas zmas {7, 11}; // Uniform intialization with curly brackets (next post)
    
    // The number of items between square bracket here must match the number of public 
    // members of Zmas
    auto [z, w] = zmas;

    assert (z == 7 && w == 11);
Of course C++11 addition of auto was already a major improvement when working with complicated types but the latest extensions are even more icing on the cake. For more details about auto check out C++17 Structured Bindings