[MUSIC] This segment is the beginning of the first of a couple of sections and we'll use the Racket language, so we need to start by getting used to a new programming language and we'll do that here. so we're going to use the Racket language instead of ML. We're going to recommend the DrRacket programming environment instead of another editor, so we won't use Emacs for this part of the course, and we have installation and usage instructions on the course website. I think you will find installation here very simple and straightforward, so just do it when you have a few minutes. Like ML, Racket is a mostly functional language, so a lot of what we've learned in ML, we just get to see in a new setting. We'll still have anonymous functions, we'll have first class function closures, everything is an expressions, so we need things like return statements and so on. We're not going to use Racket with a form of case expression, it does have support for some of that, but were going to access our one of types in a different way and that will be fine for our purposes. But there's two key differences from ML that make me want to use Racket for this portion of the course. The first, is that it does not rely so much on a static type system, it accepts many more programs and that just delays what in ML would be a type error until something occurs at run-time. So if you want to try to add a number and a string it will be just fine until you actually get to that expression and then you will get a run-time error. The other thing, as you'll see in future segments when we start writing some real code, is that Racket has a very minimalist syntax. It uses parentheses a lot to group things rather than having strange syntax rules, like most other programming languages. and it has many advanced features. we won't have time for most of them, but I want to at least have some optional discussion of the module system if we have time, I do want to discuss macros and so on. Now overall, because of the similarities with ML, the next homework assignment is not just going to be a get used to Racket assignment. The first problem or two will be, but after that, I want to talk about some new concepts, some new things that we could have done in ML, but worked out a little more cleanly in Racket. So we'll have some segments to get used to the Racket, the language, but then, we're going to move on, because the course is not just about trying out the same thing in different languages, it's about learning new concepts. I should mention that there's a related programming language called Scheme. Racket essentially evolved out of Scheme and was evolving for a while, and about 2010, the designers of Racket decided to stop using the Scheme name. so that they could be more different without feeling bad about it, if you will. I might occasionally slip up and say Scheme, because I'm still used to calling languages like this, Scheme. I'll try not to but just don't be confused if I do so. And, in case you have programmed in Scheme, and it was a very popular language, particularly in introductory programming languages, as well as for real use, Racket has made some non-compatible changes. The most, the ones you're most likely to notice are related to how lists are used, and in particular, that like ML list elements are not mutable. Okay? So, if you've seen Scheme before, you do need to get used to that. If not, we'll just introduce Racket as its own wonderful modern programming language. I should mention that, as a modern language, it's been used to build some real systems and continues to do so to be used in that way. it's also used a lot in education, which is probably what it's best known for. the language does continue to evolve, so it can be a bit of a moving target. I'm trying to keep everything up to date. It doesn't move that quickly and you can always consult the online documentation in particular, the Racket guide is a free user's guide that covers the important concepts of the language and has much more than what we need in this course, but it's easy to look up things as you need them. So, to get started, I'm going to show you DrRacket here in just a second. It's going to have what it calls a definitions window and an interactions window, this will feel very familiar to us. in Emacs, we had the buffer where we wrote the code, and the REPL where we ran the code. DrRacket is going to work the same way. I think you'll find it more user-friendly than how we used ML. and, you know, it will be fairly easy to learn on your own, ask questions if you have them on the discussion forum, and the lecture demos, of course, will show me using the tool. And as I mentioned, there's wonderful documentation, the general Racket website is where you download DrRacket and there's the Racket Guide, there's many tutorials there's no shortage of information. Okay. So why don't I flip over here now? So here is DrRacket and this is just the current buffer I'm showing you is, is just a buffer where you can write code and then, when I want to run it, I can just click this Run button here in the upper right, and now, I get this split where I have a REPL below and the code up above. You can flip between these, the Menu options have options to show, show just one or the other. I think control E-cycles between showing just the definitions and the definitions and the REPL. So, I'm just hitting Contol-E to switch back and forth here, and this is pretty much what DrRacket will look like for you, except I've increased the font size and changed the font, so that it looks a little better in the recordings. So now let's look at the actual code. this brownish text that you see are comments. Comments in Racket start with a semicolon and go until the end of the line. There is support for multi-line comments. I won't tend to use them much. this is fairly conventional to just have each line of a comments start with semicolon and you can have comments on the same line as other code, you just have to have it to the right. So this here down at the bottom, this is another comment. A couple bookkeeping things we're always going to do in our files. The first is to always have the first non-comment line in your file be exactly this. I'll type it again for you, although, you should only have it once, #lang racket. Okay? that tells DrRacket that this is Racket code in this file. DrRacket actually supports defining your own languages, running code in lots of different languages, so we have to say which language our code is and we say it with this first line. This second line provided all-defined-out is a bit of a workaround to keep things simple for us. By default in Racket, it has a module system, just like we studied in ML, but in Racket's module system, each file is a module, and by default, everything in it is private and you have to say what you want to make available to other files. Using our methodology in this course of putting our tests in a second file, that's a bit cumbersome, so this one line which you can just copy or we'll give it to you for the homework assignments, says change the default, make everything public, and that makes your code much easier to test. So with those two things out of the way you then, in the rest of your file just define a bunch of definitions, variables, other things. And for this lecture, I've just done one, we'll do a bunch more in the bunch more in the next segment, and I've defined the variable s to be the string constant, hello. So when you define a variable, it's open parentheses, keyword define, name of your variable, string hello, close parenthesis. So, this is like a val binding in ML. This would be like val s=hello. And if I go to run this, when I click this on the REPL, it did run all the codes. So it did create that definition for s, unlike in ML, it doesn't tell us any information. it just you know, it would give us an error if something didn't work, but since everything did work, it just gives us our prompt. And I could say here, I could add 2 and 2, and I would get back 4. That's how you do addition in Racket, parenthesis, plus, the arguments, and another parenthesis. I do have s, right? I get the string hello right there. If I use a different variable, like t, I get an error message that I have a reference to an unbound identifier. So that's just seeing DrRacket, we'll continue to use it in the next few segments as we introduce the Racket language, quickly covering a lot of the same ideas we already saw in ML. And then after a few segments of that, we'll move onto new concepts and new material.