[HN Gopher] Mal - Make a Lisp
       ___________________________________________________________________
        
       Mal - Make a Lisp
        
       Author : AlexeyBrin
       Score  : 139 points
       Date   : 2021-04-24 12:15 UTC (10 hours ago)
        
 (HTM) web link (github.com)
 (TXT) w3m dump (github.com)
        
       | progre wrote:
       | One interesting thing about this project is the extensive use of
       | Make. Not only is the test suite Make based, there is also a Mal
       | implementation in Make
        
         | harryvederci wrote:
         | If I recall correctly, the project started as "Make Lisp" (a
         | lisp made with Make), and later changed to "Make A Lisp".
        
       | macintux wrote:
       | I attempted this a few years back, didn't get far before I got
       | hung up on the regular expression(s) required for parsing. Silly
       | to get stopped there, but there was just enough friction between
       | the specified expression, the language I was using (Erlang), and
       | my understanding of the subtleties that I punted.
       | 
       | I think with Regex101 in my back pocket I'll give it another try.
       | 
       | https://regex101.com
        
         | progre wrote:
         | I also could not get the regex to work, so I ended up writing a
         | custom tokenizer. It ended up being like 30 lines of code, and
         | unlike the regex I could understand how it works
        
         | agumonkey wrote:
         | Brown University PLT textbook used lisp/scheme and their first
         | paragraph was something like "nobody cares about parsing, let's
         | get down to business in sexps"
         | 
         | I like parsing, I like regexes but I agree it's often a waste
         | of time :)
        
         | duncaen wrote:
         | Regex to parse lisp expressions?
        
           | bgorman wrote:
           | The regex is used as a tokenizer, the outputs of which are
           | then fed into the reader module.
        
           | the-smug-one wrote:
           | Regexes are at least useful for parsing numbers and symbols.
           | 
           | But yeah, that shouldn't be where you get stuck.
        
             | macintux wrote:
             | [\s,] _(~@|[\\[\\]{}() '`~^@]|"(?:\\\\.|[^\\\"])_"?|;.
             | _|[^\s\\[\\]{}( '"`,;)]_)
             | 
             | Step 0, so I didn't get very far.
             | 
             | https://github.com/kanaka/mal/blob/master/process/guide.md#
             | s...
        
               | cellularmitosis wrote:
               | Whoa that regex is a monster. Try starting with simpler
               | pieces and see if you get further this time around. Good
               | luck! https://gist.github.com/cellularmitosis/75dc4aefe88
               | 438c14e94...
        
         | SanFranManDan wrote:
         | If you are using erlang you should be using pattern matching
         | not regex. Erlang/Elixir are one of the easiest languages to
         | build parsers in with their binary string pattern matching.
        
           | macintux wrote:
           | I agree, pattern matching is what I sorely miss every time I
           | use anything other than Erlang. It's just enough of a hurdle
           | I set it aside and didn't return.
           | 
           | It's a big step.
           | 
           | https://github.com/kanaka/mal/blob/master/process/guide.md#s.
           | ..
        
         | KineticLensman wrote:
         | In C#, I ended up with                  static public
         | List<string> Tokenizer(string source)        {           //
         | Initialise the token list.           List<string> tokens = new
         | List<string>();                // Define a regex pattern whose
         | groups match the MAL syntax.           string pattern = @"[\s
         | ,]*(~@|[\[\]{}()'`~@]|""(?:[\\].|[^\\""])*""|;.*|[^\s
         | \[\]{}()'""`~@,;]*)";           //                 empty  ~@ |
         | specials     |   double quotes      |;  | non-specials
         | // Break the input string into its constituent tokens.
         | string[] result = Regex.Split(source, pattern);
         | 
         | This took a while to understand and get going but it really
         | improved my understanding of regex.
        
       | tom_mellior wrote:
       | I went through this a while ago (in Prolog). It was interesting,
       | but with a lot of room for improvement. My criticisms as I
       | remember them:
       | 
       | - Error messages about output being different from the expected
       | use some sort of very explicit printing mode with lots of quotes
       | and escaping. A message saying that one got "\\\\\'\\\\\'" where
       | "\'\\\\\\\'" was expected is needlessly hard to parse when the
       | actual difference is \'\' vs. '\\\' (or whatever).
       | 
       | - Many parts are marked optional, but the test script complains
       | if you don't implement them, and later sections assume that they
       | are implemented, so you have to treat them as compulsory anyway.
       | 
       | - Some things regarding environment updates were contradictory or
       | at least not explained properly at first, with some very relevant
       | information only coming later. I don't remember the specifics,
       | but the problem was roughly that I set up my data structures
       | thinking that everything could be implemented in a pure way, but
       | at some point it became clear that you either need some other
       | data structure or must use destructive modifications.
        
       | miloignis wrote:
       | I went through MAL last year and had a blast! It's an excellent
       | project to help you get a feel for Lisps and tiny languages, and
       | I think is what finally got me over my "eww parentheses" feeling.
       | After finishing MAL, I modified it to implement John Shutt
       | Kernel-style f-exprs to really up the power-to-weight ratio, and
       | had a blast doing it. MAL makes a great basis for experimenting
       | with additional language features, highly recommended!
        
         | diminish wrote:
         | I liked MAL similar to Linux from scratch (LFS).
        
       | Y_Y wrote:
       | Interesting languages that aren't on the list of implementations:
       | APL/J/Kx       Verilog       Fortran       LISP 1.5
        
         | jmrm wrote:
         | Also COBOL and VHDL. I don't know how a hardware description
         | language could implement a Lisp variant btw.
        
           | Y_Y wrote:
           | They actually do include a VHDL implementation! COBOL would
           | be cool though.
        
           | rjsw wrote:
           | There is a Verilog implementation of the MIT Lisp Machine.
        
           | sedachv wrote:
           | > I don't know how a hardware description language could
           | implement a Lisp variant btw.
           | 
           | https://dspace.mit.edu/handle/1721.1/6334
        
         | nicklecompte wrote:
         | I was a bit surprised nobody's tried a "verified"
         | implementation in something like Coq/Idris/Agda (unless i
         | missed one - I wasn't familiar with all the languages in the
         | list).
         | 
         | Might be a fun project!
        
       | pygy_ wrote:
       | This is unintentional given the history of the name of the
       | project explained in another comment on this page, but "mal" in
       | French means "evil", tying into the famous aphorism.
        
         | rbonvall wrote:
         | In Spanish it means "badly", which is an encouraging goal to
         | give the project a try :)
        
       | KineticLensman wrote:
       | I did this a while back. I documented my experience in several
       | blog posts, the last of which is [0]. These describe the process,
       | the gotchas and how I got round them. I was working on C# on a
       | Windows box so the result isn't quite the same as the vanilla
       | MAL.
       | 
       | I was massively pleased when I got MAL to self-host.
       | 
       | [0] https://www.non-kinetic-effects.co.uk/blog/2019/04/28/MAL-5
        
       | dang wrote:
       | If curious, past threads:
       | 
       |  _Mal - Make a Lisp, implemented in 79 languages_ -
       | https://news.ycombinator.com/item?id=21670442 - Nov 2019 (11
       | comments)
       | 
       |  _Mal - Make a Lisp, in 68 languages_ -
       | https://news.ycombinator.com/item?id=15226110 - Sept 2017 (69
       | comments)
       | 
       |  _Mal - Make a Lisp_ -
       | https://news.ycombinator.com/item?id=12720777 - Oct 2016 (1
       | comment)
       | 
       |  _Make a Lisp_ - https://news.ycombinator.com/item?id=9121448 -
       | Feb 2015 (41 comments)
       | 
       |  _Lisp implemented in under 1K of JavaScript_ -
       | https://news.ycombinator.com/item?id=9109225 - Feb 2015 (16
       | comments)
        
       ___________________________________________________________________
       (page generated 2021-04-24 23:00 UTC)