WEBVTT captioned by bhavin192 NOTE Introduction 00:00:04.880 --> 00:00:10.000 Hello, and welcome to EmacsConf 2023! 00:00:10.001 --> 00:00:12.109 My name is Musa Al-hassy, 00:00:12.109 --> 00:00:15.549 and I will be talking about "REPL-driven development." 00:00:15.549 --> 00:00:18.269 I like programming languages so much. 00:00:18.269 --> 00:00:20.269 I want to use them all over the place. 00:00:20.269 --> 00:00:23.069 I got a PhD in the topic. 00:00:23.069 --> 00:00:25.349 So let's just dive in. 00:00:25.349 --> 00:00:27.949 This is a lightning talk, 00:00:27.949 --> 00:00:31.309 so the details will be available in the repository. 00:00:31.309 --> 00:00:33.469 Links to longer videos and GIFs 00:00:33.469 --> 00:00:35.989 for those who are interested. NOTE The wonders of C-x C-e 00:00:35.989 --> 00:00:37.309 So the wonderful thing about Emacs 00:00:37.309 --> 00:00:40.589 is that you can execute Lisp anywhere. 00:00:40.589 --> 00:00:42.829 For example, I can go to this piece of Lisp, 00:00:42.829 --> 00:00:45.576 press Ctrl-x Ctrl-e (`C-x C-e`) 00:00:45.576 --> 00:00:47.549 and get a little pop-up. 00:00:47.549 --> 00:00:49.669 Alright, so here I pressed `C-x C-e` 00:00:49.669 --> 00:00:51.389 and this is what it ran. 00:00:51.389 --> 00:00:52.776 And what this package gives you 00:00:52.776 --> 00:00:54.509 is the same ability 00:00:54.509 --> 00:00:56.909 for any language of your choosing. 00:00:56.909 --> 00:00:59.229 So for example, here is some Java, 00:00:59.229 --> 00:01:02.469 and I bound it to Ctrl-x, Ctrl-j (`C-x C-j`). 00:01:02.469 --> 00:01:07.149 So I say `C-x C-j`, and this runs some code, 00:01:07.149 --> 00:01:13.709 and over here I get a little pop-up. 00:01:13.709 --> 00:01:15.069 The wonderful thing about 00:01:15.069 --> 00:01:16.829 being able to run code from anywhere 00:01:16.829 --> 00:01:19.029 is that you can keep it in normal text files 00:01:19.029 --> 00:01:20.629 or any kind of file you like. 00:01:20.629 --> 00:01:23.669 For example, you can have hyperlinks, 00:01:23.669 --> 00:01:25.109 as it were…, like this one. 00:01:25.109 --> 00:01:28.549 `C-x C-e`, and now we can see this down here. 00:01:28.549 --> 00:01:30.789 Learn about it. 00:01:30.789 --> 00:01:34.189 But being able to run other languages besides Emacs 00:01:34.189 --> 00:01:36.149 lets us do some interesting things. 00:01:36.149 --> 00:01:39.589 For example, in the middle of a JavaScript program, 00:01:39.589 --> 00:01:43.429 you might write a line like this. `C-x C-n`. 00:01:43.429 --> 00:01:45.229 And that says down here 00:01:45.229 --> 00:01:47.269 `javascript-eval` in the mode line, 00:01:47.269 --> 00:01:49.643 and so this just checks that some endpoint 00:01:49.643 --> 00:01:51.189 is working as intended. 00:01:51.189 --> 00:01:52.749 So you don't need to use an external tool 00:01:52.749 --> 00:01:53.589 to check endpoints. 00:01:53.589 --> 00:01:57.469 You can just use Emacs in your favorite language. 00:01:57.469 --> 00:01:59.629 You know, you can keep your spirit up. 00:01:59.629 --> 00:02:03.709 So, `C-x C-a` runs `applescript-eval`. 00:02:03.709 --> 00:02:06.376 [Computer]: You can do it, buddy. 00:02:06.376 --> 00:02:13.269 [Musa]: Maybe you heard that in the background? 00:02:13.269 --> 00:02:15.389 The cool thing is, your code immediately takes form. 00:02:15.389 --> 00:02:18.469 Right away, you see it doing things, you know, 00:02:18.469 --> 00:02:20.349 altering your environment. 00:02:20.349 --> 00:02:24.429 For example, this is JavaScript, 00:02:24.429 --> 00:02:28.349 and JavaScript here is gonna change Emacs for us. 00:02:28.349 --> 00:02:32.109 So `C-x C-n`. And you can see down here 00:02:32.109 --> 00:02:34.669 `javascript-eval` was invoked. 00:02:34.669 --> 00:02:38.789 It returned true, and this line of JavaScript 00:02:38.789 --> 00:02:41.709 altered our Emacs. So that's really nice. 00:02:41.709 --> 00:02:43.749 So you don't need to use just Emacs Lisp if you like. 00:02:43.749 --> 00:02:46.149 You can use other systems. 00:02:46.149 --> 00:02:50.069 As you saw, the output is shown in overlays. 00:02:50.069 --> 00:02:52.869 So here's, for example, `C-x C-p` to run 00:02:52.869 --> 00:02:54.109 some Python code. 00:02:54.109 --> 00:02:55.476 Notice it blinked in red 00:02:55.476 --> 00:02:56.869 because I thought red was nice. 00:02:56.869 --> 00:02:58.389 You can configure as you like. 00:02:58.389 --> 00:02:59.409 And if you hover over it, 00:02:59.409 --> 00:03:01.869 you can see the solution there, 00:03:01.869 --> 00:03:04.669 and you can see it in a variety of familiar ways 00:03:04.669 --> 00:03:08.709 if you use `C-x C-e` regularly. 00:03:08.709 --> 00:03:09.989 You can insert the results. 00:03:09.989 --> 00:03:14.269 You can find documentation about them. 00:03:14.269 --> 00:03:15.989 The idea here is that 00:03:15.989 --> 00:03:20.389 you have this familiar Lisp workflow 00:03:20.389 --> 00:03:24.989 with `C-x C-e`, and this package ports it over 00:03:24.989 --> 00:03:27.069 to your favorite language out. 00:03:27.069 --> 00:03:28.343 So you can eval things, 00:03:28.343 --> 00:03:30.789 you can insert them, and do as you like. 00:03:30.789 --> 00:03:35.809 I think that's really neat. NOTE An overview of REPL Driven Development 00:03:35.809 --> 00:03:37.209 This package allows you to do 00:03:37.209 --> 00:03:39.109 REPL driven development. 00:03:39.109 --> 00:03:42.309 In that, you can use it to grow your program. 00:03:42.309 --> 00:03:43.709 You don't need to restart it. 00:03:43.709 --> 00:03:45.549 You can see changes live. 00:03:45.549 --> 00:03:50.149 So here's, for example, this is in a Java runtime. 00:03:50.149 --> 00:03:52.869 You can see some balls bouncing around. 00:03:52.869 --> 00:03:54.509 I don't really know which one is the second one, 00:03:54.509 --> 00:03:57.229 but let's increase its size. `C-x C-j`. 00:03:57.229 --> 00:04:00.189 And this one increased in size, 00:04:00.189 --> 00:04:02.189 and you can see down here I pressed `C-x C-j`. 00:04:02.189 --> 00:04:05.549 Let's change the color to blue, 00:04:05.549 --> 00:04:09.309 `C-x C-j`, the color is blue. 00:04:09.309 --> 00:04:12.376 So all these changes are happening live. 00:04:12.376 --> 00:04:14.429 Three balls isn't really a ball pit. 00:04:14.429 --> 00:04:18.989 Let's go to 50 balls. There you go. 00:04:18.989 --> 00:04:21.469 So it's nice that you can do this 00:04:21.469 --> 00:04:23.209 without leaving your environment, 00:04:23.209 --> 00:04:26.189 without building, you can rapidly modify and see. 00:04:26.189 --> 00:04:29.776 I think that's nice. 00:04:29.776 --> 00:04:32.829 Unfortunately, I'm at the halfway point, 00:04:32.829 --> 00:04:35.309 so I won't be able to work through 00:04:35.309 --> 00:04:37.109 some of these nice problems, 00:04:37.109 --> 00:04:38.676 but you can see the videos 00:04:38.676 --> 00:04:41.509 or GIFs on the associated repo. 00:04:41.509 --> 00:04:42.709 Likewise for this one. 00:04:42.709 --> 00:04:43.909 This one would have been a lot of fun, 00:04:43.909 --> 00:04:46.509 but unfortunately, we're running short on time. 00:04:46.509 --> 00:04:51.143 Apologies. NOTE REPL Driven Development with Java 00:04:51.143 --> 00:04:56.209 The neat thing here is: this package tries to 00:04:56.209 --> 00:05:00.269 bring the feeling of Lisp to other languages. 00:05:00.269 --> 00:05:03.509 So the idea of a REPL, or a Read Eval Print Loop 00:05:03.509 --> 00:05:06.949 is R and P are data interchange protocols. 00:05:06.949 --> 00:05:09.869 Unfortunately, not every language has those, 00:05:09.869 --> 00:05:12.709 but this package kind of encourages us to 00:05:12.709 --> 00:05:14.643 implement them if we don't have them. 00:05:14.643 --> 00:05:16.909 Let me show you an example. 00:05:16.909 --> 00:05:20.589 What do I mean here? 00:05:20.589 --> 00:05:22.709 This is a Java file. 00:05:22.709 --> 00:05:25.189 I've loaded this definition in. 00:05:25.189 --> 00:05:28.543 We can press `C-x C-j`, 00:05:28.543 --> 00:05:30.909 and you see it's a list of person. 00:05:30.909 --> 00:05:33.829 I didn't give this a name, so its name is $59. 00:05:33.829 --> 00:05:40.829 If I hover over it, we can see the definition again. 00:05:40.829 --> 00:05:44.429 So it's a person called Hamid, age 5, 00:05:44.429 --> 00:05:46.229 another person called Jaafar, age 6. 00:05:46.229 --> 00:05:52.229 This pretty printing is nice for me as a human, 00:05:52.229 --> 00:05:56.349 but I can't execute this. This isn't valid Java. 00:05:56.349 --> 00:06:00.609 So I could do `C-u C-x C-j`. 00:06:00.609 --> 00:06:05.109 If I have the help of a read protocol inserted. 00:06:05.109 --> 00:06:09.469 Sorry, `C-x C-j`. There it is. 00:06:09.469 --> 00:06:12.549 So look, it gives me a `new Person` 00:06:12.549 --> 00:06:14.349 with the construction everything. 00:06:14.349 --> 00:06:16.549 Now I can work with. 00:06:16.549 --> 00:06:17.949 Java can work with this. 00:06:17.949 --> 00:06:21.709 So this can be quite useful for regression testing 00:06:21.709 --> 00:06:25.749 or just to find out what your method spits out. 00:06:25.749 --> 00:06:29.869 We can do the same thing. Here's a bigger example. 00:06:29.869 --> 00:06:32.389 Trying to see it in the overlay is a bit cramped. 00:06:32.389 --> 00:06:34.589 We can say `C-u C-x C-j`. 00:06:34.589 --> 00:06:38.669 All right, and now we have executable code. 00:06:38.669 --> 00:06:40.876 Okay, this is neat. 00:06:40.876 --> 00:06:42.389 If you want to do something with it. 00:06:42.389 --> 00:06:45.789 I'm not really interested. I have four new persons. 00:06:45.789 --> 00:06:49.309 If I really want to look at this, 00:06:49.309 --> 00:06:55.649 I can say `M-x java-eval-navigate-output`, 00:06:55.649 --> 00:07:00.829 and now I see my output as this hierarchical tree. 00:07:00.829 --> 00:07:03.589 I go down, I can see what's inside these, 00:07:03.589 --> 00:07:06.709 what's the type of this thing, what's in there. 00:07:06.709 --> 00:07:09.349 All right, so that's nice. 00:07:09.349 --> 00:07:14.189 The idea is that we're not limited to 00:07:14.189 --> 00:07:15.629 just textual output. 00:07:15.629 --> 00:07:19.589 We can render output, 00:07:19.589 --> 00:07:22.229 thanks to the power of Emacs, in any way we want. 00:07:22.229 --> 00:07:26.749 In a browser, in a LaTeX file, in an Org mode (file), 00:07:26.749 --> 00:07:28.029 however we really desire. NOTE Bring your own Read Protocol 00:07:28.029 --> 00:07:32.989 And if our language doesn't have an easy protocol, 00:07:32.989 --> 00:07:36.143 so what I did for Java in particular was: 00:07:36.143 --> 00:07:38.643 you take a blob, and you use some 00:07:38.643 --> 00:07:43.149 parsing expression grammars, or if you really want 00:07:43.149 --> 00:07:44.949 regular expression pattern matching, 00:07:44.949 --> 00:07:46.829 and you get some property list out, 00:07:46.829 --> 00:07:51.349 and then you construct an executable expression 00:07:51.349 --> 00:07:53.149 out of that. Like this `new Person`. 00:07:53.149 --> 00:07:56.749 It's nice that you can do these kind of things 00:07:56.749 --> 00:07:59.669 and that this software encourages you to do them. NOTE Use Case: RDD & Job Interviews 00:07:59.669 --> 00:08:07.549 So one use case I actually use 00:08:07.549 --> 00:08:10.909 besides learning things is… 00:08:10.909 --> 00:08:14.776 oops oops oopsies oopsies showing you metadata 00:08:14.776 --> 00:08:15.509 you shouldn't be looking at. 00:08:15.509 --> 00:08:19.409 Don't look at my metadata. Sorry about that. 00:08:19.409 --> 00:08:23.209 One place I actually use this besides learning 00:08:23.209 --> 00:08:25.029 and trying new libraries and APIs 00:08:25.029 --> 00:08:26.776 and stuff like that is, 00:08:26.776 --> 00:08:29.509 for example, when I interviewed for jobs 00:08:29.509 --> 00:08:33.229 last year (I was changing jobs), 00:08:33.229 --> 00:08:34.676 I would share my screen, 00:08:34.676 --> 00:08:37.869 and if the interviewer gave me 00:08:37.869 --> 00:08:39.949 some inputs and outputs to play with, 00:08:39.949 --> 00:08:41.576 I could do essentially 00:08:41.576 --> 00:08:42.976 some sort of test driven development 00:08:42.976 --> 00:08:45.149 and constantly evaluate things 00:08:45.149 --> 00:08:46.589 right in front of the interviewer. 00:08:46.589 --> 00:08:49.949 For some design questions 00:08:49.949 --> 00:08:53.909 rather than sketching out my ideas in a Google Doc, 00:08:53.909 --> 00:08:55.509 I would share my screen and be like, 00:08:55.509 --> 00:08:57.989 "Hey, here's actual executable code, 00:08:57.989 --> 00:08:59.229 we can stub some things out 00:08:59.229 --> 00:09:00.576 and have some types," 00:09:00.576 --> 00:09:03.476 and the idea is we can still check things 00:09:03.476 --> 00:09:05.643 and run them right there and then, 00:09:05.643 --> 00:09:08.143 which I thought was quite nice, and it helps to 00:09:08.143 --> 00:09:10.309 clarify your thought process, I guess. 00:09:10.309 --> 00:09:15.149 Anyhow, so that's my time, 00:09:15.149 --> 00:09:19.829 I hope you've enjoyed this little package, 00:09:19.829 --> 00:09:22.869 and again, sorry for the rush, 00:09:22.869 --> 00:09:24.149 it's a lightning talk. 00:09:24.149 --> 00:09:29.069 Feel free to find everything on the associated repo. 00:09:29.069 --> 00:09:34.389 And have a wonderful December Saturday. 00:09:34.389 --> 00:09:37.029 Take care! Bye bye, everyone.