1. 3

    Further recommendations from past offerings of @shriram’s Programming Language Theory course:

    I’ve personally referenced both Design Concepts in Programming Languages and TAPL quite a bit. Redex is a really fantastic tool for experimenting with executable operational reduction semantics.

    1. 1

      “Design Concepts” could be a bit heavy for a first course in PLT. I’d look at it after you get into the material a bit further. It seems like a decent book, though. I have to sit down and get through it some time.

    1. 2

      For me, the space-in-filenames issue is the main thing preventing me from using Make for everything. The limitations on pattern rules make scaling up Makefiles difficult, too.

      I’ve long thought that a prolog-like DSL would be perfect; makefiles are basically already logical specifications—I just needed something that worked with spaces and could perform some sort of unification-like process for smarter pattern rules. I nearly started writing my own.

      But then I discovered that someone already created such a tool: biomake. I’ve recently started using biomake to automate a large data science research project. It has been absolute bliss! Not only does it those two pain-points with using Make (and countless other pain-points), it features GridEngine integration out-of-the-box, and fantastic debugging information for when things don’t work as expected. I cannot see myself using any other tool.

        1. 7

          This made me full of blood rage when I happened upon it a few months ago. I just want to have some well-named markdown files be automatically converted to HTML and also concatenated, converted to HTML, and that HTML converted to PDF. All with good-looking file names with spaces in them. Like how normal people named files.

        1. 2

          Do you use Rust as your daily driver for your work/hobby stuff?

          For work, I now mostly write Pyret. I typically implement my side projects in either Rust or Racket, though! I have a strong preference towards data-oriented languages. The languages I use most (Pyret, Rust, Racket, Bash, MLs) all favor a data-oriented style of programming, so how I choose a language for a project tends to depend on the ‘shape’ of the data I’m working with.

          What language features do you leverage from Rust, and how do they make those projects easier?

          I reach for Rust when I need performance, sophisticated types (traits!), and well-defined structured data (ADTs!). It’s a thrill writing code at a high-level of abstraction and being confident that it will be performant. Cargo makes the entire ecosystem a joy to interact with and contribute to.

          Why aren’t you using your non-Rust languages for that project?

          There are a handful of projects for which I haven’t reached for Rust. Racket, though not tremendously performant, is tremendously expressive! When your data look like s-expressions, Racket is usually the best choice. I used Racket extensively for my encyclopedia remix project Liber Brunoniana, which involved processing lots of HTML.

          What could Rust do to make your life easier?

          I would love to use Rust for programming embedded devices, like Arduinos, and targeting browsers via WebAssembly.

          1. 5

            Hi, Pyret developer here (I hack on error messages)! If anyone has any questions, I’ll do my best to answer or grab someone who can!

            1. 4

              A couple questions, about the check and where blocks:

              1. Do you know if they’re consciously inspired by the Design by Contract ideas from Eiffel (and other languages)?
              2. The front page says “These assertions are checked dynamically” – are those conditions checked at compile time, first execution of each function, only during a separate testing run, or what?
              1. 2

                check, where and examples blocks all exist to support the ‘examples’ and ‘testing’ phases of How to Design Program’s functional design recipe. The placeholder expression syntax (...) and doc blocks are other features that Pyret has to encourage the design recipe.

                Testing statements are executed in the order they appear in the program alongside other top-level expressions. If you run:

                print(1)
                
                check:
                  print(2)
                end
                
                print(3)
                

                The result is that 1, 2, and 3 are printed (in that order).

                1. 1

                  Interesting. For the where expressions on function definition: are those executed when the function definition is first encountered, or when the function itself is first executed?

                  1. 2

                    At the point when the definitions are “encountered” is a good way to think about it. So, the former.

            1. 5

              Warning: live streams require flash.

              1. [Comment removed by author]

                1. 9

                  A) Using your browser’s devtools, spoof a phone.
                  B) ‘view-source’ on those pages, ctrl-f for m3u8_url, and copy the address next to that key. Open VLC, ctrl+n, paste the address you copied.

                  1. 4

                    Or, if you have jq, curl, and vlc installed (assumes GNU sed / awk, but shouldn’t matter):

                    hope.sh:

                    #!/bin/sh
                    STREAM=${1-http://livestream.com/internetsociety/hopeconf}
                    URL=$(curl -s $STREAM | grep 'window.config' | awk -F '>' '{print $2}' | sed 's|;</script||g' | sed 's|window.config = ||' | jq -r '.event.stream_info.m3u8_url')
                    vlc $URL
                    

                    Then, use it like hope.sh LIVESTREAM_URL and it’ll default to the first one otherwise.

                    1. 3

                      Or youtube-dl if you wish to be very lazy. :)

                       vlc $(youtube-dl -g "$url")
                      
                      1. 1

                        That works, too!

                        1. 1

                          or instead of vlc and it’s many desktop dependencies, try mplayer ;-)

                          1. 1

                            Why yes indeed, I just used VLC because the above examples did. :P

                            Though personally, I use mpv (for no reason other than somebody else was using it).

                            1. 1

                              Ah didn’t mplayer had a fork!

                              (Tried to install it under OpenBSD but it was about to bring samba as a dependency!)

                1. 3

                  I adore the simplicity of make as a declarative build tool, but for a build system whose operative principle is a close correspondence with the filesystem, the placement of additional, subtle restrictions on valid filenames are ridiculous. I’d happily trade away most of make’s features for a core that didn’t choke on spaces.

                  (If anybody knows of such an alternative, please share!)

                  1. 2

                    I think it’s pretty common on UNIX platforms to avoid spaces where possible. Finding spaces in filenames is peculiar, and generally not a good sign.

                  1. 2

                    Internet: 192.91.235.243 Toponymic: Providence, Rhode Island

                    1. 8

                      Oh I do so hope Apple counter whacks them with a DMCA suite for reversing engineering a protection mechanism…….

                      …. my sense of Schadenfreude would know no bounds.

                        1. 1

                          Would’ve been funny. ?