[HN Gopher] April, an APL Compiler for Common Lisp [video]
       ___________________________________________________________________
        
       April, an APL Compiler for Common Lisp [video]
        
       Author : tosh
       Score  : 59 points
       Date   : 2020-09-10 17:45 UTC (1 days ago)
        
 (HTM) web link (youtube.com)
 (TXT) w3m dump (youtube.com)
        
       | ncmncm wrote:
       | Without watching the video, can we guess correctly that "for
       | Common Lisp" means "in Common Lisp"? Or is it really meant for
       | use within Common Lisp programs?
        
         | phantomics wrote:
         | April is usable within Common Lisp. When writing a CL program,
         | you can invoke APL code on arrays. For example:
         | 
         | (april-c "{[?][?],(3[?]2*8)[?]3 1 2[?][?]}" (opticl:read-png-
         | file "/path/to/image.png"))
         | 
         | This snippet uses the opticl library to load a PNG file, and
         | then uses April to count the number of unique colors in the
         | image. Consider the amount of code this would take in CL.
        
           | smabie wrote:
           | It would be cool if it was implemented as a reader macro
           | instead of just passing a string to a function.
        
             | phoe-krk wrote:
             | Do it yourself! (Implementation loosely based on
             | phantomics' comment below.)                   (defun april-
             | reader (stream char)           (declare (ignore char))
             | `(april ,(read stream t nil t)))                  (set-
             | macro-character #\[?] #'april-reader)
        
               | Avshalom wrote:
               | You're probably gonna want something more complicated
               | than that. Glancing at the github page it looks like at
               | least the following need to be dealt with:
               | (april "apl code") ; and april-f       (april (with
               | (stuff)) "apl code") ; and april-f       (april-c "apl
               | code" (input))       (april-c (with (stuff)) "apl code"
               | (input))
        
               | phoe-krk wrote:
               | Yes, the above is a trivial implementation; handling
               | multi-form input would need to be much more complex.
               | Thankfully, for simple one-liners, you'll likely want
               | either April literals (implemented above) or April
               | anonymous functions, both of which won't take additional
               | arguments; you should be able to implement both as simple
               | reader macros.
        
             | phantomics wrote:
             | Wouldn't be too hard to do, someone in the video suggested
             | a #[?] reader macro followed by APL. Like take '#[?]string'
             | then expand that to '(april "string")'.
             | 
             | But April has many ways of passing options and external
             | data for the compiled code to operate upon, and
             | implementing a reader macro system that would support all
             | those parameters would be complicated and require
             | developers to learn a bunch of new syntax in order to use
             | April with reader macros.
        
       | phantomics wrote:
       | Since the video's quite long, here are some basics on April.
       | 
       | Repo: https://github.com/phantomics/april
       | 
       | April compiles APL to Common Lisp. It has almost all of the
       | lexical functions and operators featured in Dyalog APL, the
       | leading commercial APL interpreter and the most featureful APL
       | implementation. It has many more features than the FOSS GNU APL,
       | which is based on the old IBM APL2.
       | 
       | Dyalog APL's source code is about 500KLOC according to Dyalog's
       | staff. GNU APL is over 100KLOC per its homepage. April's .lisp
       | files currently stand at 6350LOC.
       | 
       | APL interpreters have traditionally been hard to connect to
       | external data sources. Because APL is typically implemented as an
       | interpreter, any connection to a database or other external
       | system needs to be built into that interpreter as a plugin. April
       | is called from within a Lisp program and you can pass it any
       | array-formatted data. You can use CL libraries to read from any
       | database or other source, format the data as an array and pass it
       | to April for processing.
       | 
       | April takes some features from the k language, including
       | ($[oneorzero;1;0]) if-statements and (g-{[a;b;c]a+bxc} [?]
       | g[1;2;3]) n-argument functions.
       | 
       | April is extensible - you can easily create an extension to the
       | language with more functions and operators, and you can also re-
       | implement the utility functions that are used to parse and
       | compile the language. The language is designed from the ground up
       | to support extension. There is also a framework to extend the
       | compiler to optimize common idioms, for instance [?][?],200 200
       | 200[?][?]9 is optimized to just fetch the last row-major-ordered
       | element of the big array instead of actually taking the time and
       | memory to ravel and reverse it.
       | 
       | The second half of the video features a preview of a hardware
       | startup called Bloxl that's powered by Common Lisp and April.
       | Bloxl is a big transparent block wall with LEDs inside the light
       | up to create pixel graphics. April was used to build the
       | animations that run on Bloxl.
        
         | jonahx wrote:
         | > Dyalog APL's source code is about 500KLOC according to
         | Dyalog's staff. GNU APL is over 100KLOC per its homepage.
         | April's .lisp files currently stand at 6350LOC.
         | 
         | What accounts for this discrepancy?
        
           | mlochbaum wrote:
           | A ways into the video it says the core Dyalog interpreter is
           | about 100KLOC, with the rest being GUI code and interop such
           | as file handling and formats, cross-platform support, .NET
           | interop, and so on. If the 100k figure surprises you then
           | what you are missing is just how deep array optimization is.
           | For example, searching through an array will use an SSSE3
           | table lookup for 1-byte elements, a different table for
           | 2-byte elements, and several different kinds of hash tables
           | for other types. I tried to give a sense of the scale of this
           | sort of thing in the first slide of my Dyalog '19 talk on
           | Reductions (https://www.youtube.com/watch?v=TqmpSP8Knvg). You
           | can write pages and pages of code and still there will be a
           | way to speed up a common operation substantially.
           | 
           | By working on multidimensional arrays, APL expands the range
           | of computations that are accessible to optimization. I think
           | the writer of a scalar compiler like C would generally be
           | happy making a single loop as fast as possible. APL
           | immediately makes the implementer think about what happens if
           | there are many axes (each of which is equivalent to a nested
           | loop) even if the later axes (inner loops) are small.
        
           | Avshalom wrote:
           | -Common Lisp vs C/C++
           | 
           | -April implements the language and just punts to CL for all
           | the I/O and system level stuff. Like it doesn't have to
           | implement a REPL, or a line editor or APL workspace
           | files/array stores.
        
             | jonahx wrote:
             | Thanks. I'm guessing (based on my knowledge of J and all
             | its optimizations/special forms) that Dyalog APL would
             | still be more performant too? I didn't see it mentioned on
             | the GH README.
        
               | phoe-krk wrote:
               | Yes, the talk mentions that Dyalog is still much more
               | performant, given how much time and effort has been spent
               | on optimizing it.
        
         | kazinator wrote:
         | > _any connection to a database or other external system needs
         | to be build into that interpreter as a plugin._
         | 
         | Guess: that could be the general area where Dyalog is burning
         | most of its alleged, monstrous 500 KLOC.
        
       | phantomics wrote:
       | Thanks for posting my presentation, April's been great fun to
       | write.
        
       ___________________________________________________________________
       (page generated 2020-09-11 23:00 UTC)