 Hei. Hei. Hei. Saya sangat risau. Ini adalah kali pertama saya bercakap dalam mesyuarat perkembangan. Jadi, disini saya bercakap. Saya bercakap terhadap Slain the Dragon. Dan ia adalah sebuah guide untuk memperkenalkan pengalaman perkembangan sendiri di Ruby. Jadi, Hei, nama saya Jason. Saya bekerja di Source Clear. Saya berjaya dari NUS se peaceful tahun dan sehalf tahun yang lalu. Ya. Dan, Source Clear. Ini adalah logo. Ini adalah kota sosial yang ditahun-tahun dari Crystal Clear. Jadi, kita sebenarnya adalah perkembangan yang berkongsi dengan keadaan sosial yang digunakan. Jadi, kami melihat library di mana-mana yang anda gunakan dan memberitahu anda apakah apa yang ada di library dan beritahu anda berapa untuk memperkenalkan. Jadi, kami mahu Google saja mencari kita. Jadi, Jadi, seperti yang saya katakan, saya akan bercakap tentang bagaimana untuk memperkenalkan langgan dan Ruby. Jadi, apa yang perlu dibuat dengan berkata pada Dragon? Jadi, apabila ini benda yang dikenali sebagai Dragon Book, ia adalah sebuah benda yang sangat popular dalam kelas kompalasi universiti. Jadi, apabila orang akan fikir, oh, saya harus berjalan melalui hal ini untuk memperkenalkan bagaimana untuk memperkenalkan langgan dan kompalasi. Tapi, hari ini saya akan menunjukkan bagaimana. Saya akan memberi anda beberapa benda, memberi anda beberapa guide dan beberapa link untuk melihat jika anda mahu memperkenalkan satu-satunya. Saya akan sebenarnya menunjukkan bagaimana untuk memperkenalkan satu-satunya dalam Ruby. Dan anda mungkin akan fikir, hey, kenapa saya harus memperkenalkan langgan permainan? Saya adalah pembangunan yang benar. Saya tidak perlu memperkenalkan langgan. Jadi, pertama, satu hal yang besar. Saya bermaksud, at least, melewatkan, terkenal. Dan anda dapat faham berapa menggunakan langgan permainan. Anda dapat faham segala-galanya, para pembangunan, cara mengetahui bahaya, memaulahkan kelas garis, melewati yg yang menjaga kelihatan. Dan apakah yang berlaku dengan masin VRI, dan anda akan menjawab... anda akan memasang pertanyaannya, apa ini bahan anda yang membuat dalam kode. dan anda akan dapat menjawab Hei, bagaimana dari kedua kota ini bagaimana yang lebih cepat? Bagaimana apabila fungsinya atau fungsinya yang mencari khas Semua orang tahu? Tidak mengapa khas atau bagaimana Oh, minta maaf Tidak mengapa Ya Semua orang tahu? Ya, itu betul Ya, saya tidak akan beri anda sebab saya akan melihatnya Baiklah, dan bahagian yang saya akan menunjukkan Ada sesiapa yang tahu khas apa khas? Itu bahagian program Bukannya, bukan Ya, bahagian Ada sesiapa yang tahu khas program khas? Oh, tiada sesiapa? Ya Tidak mengapa Oh, Tidak mengapa Ya, ya Jadi Anda menggunakan Ruby Jadi, apabila Jadi, apabila Saya bermaksud anda menggunakan Ruby, bukan? Saya adalah programa Ruby dalam kerja sebelum saya Sekarang saya sebenarnya melakukan Java Tetapi, saya minta maaf Saya dapat menyebabkan keadaan saya setelah saya balik ke rumah, saya akan berkata Kenapa saya mempunyai banyak pergabungan? Dan kenapa saya tidak dapat memandangkan fungsinya dan meletakkan keadaan? Jadi, bagaimanapun kembali ke Lisp Ruby sebenarnya berdasarkan Lisp Jika anda tidak tahu Ya Jadi, bagaimanapun dan kenapa saya mempunyai Lisp? Jadi, ia sebab ia sebenarnya sangat mudah mempunyai Alan Kay berkata, ini adalah bahagian paling kuat di dunia yang boleh digunakan dalam sebuah kode Dan bahagian yang sangat mudah sangat mudah sebab sangat mudah untuk memperbaiki dan memperbaiki Jadi, dalam beberapa bahagian lain anda sebenarnya perlukan sebuah kode banyak kode anda harus mempunyai berkata-kata tetapi untuk Lisp ia sebenarnya sangat mudah kerana kode ia sebenarnya bahagian yang anda mahu mempunyai dan mempunyai dan anda menyebabkan ini beberapa orang menyebabkan ini homoikonik Sebenarnya seseorang yang pernah beritahu saya Ruby adalah homoikonik tetapi saya akan menyebabkan itu untuk berbicara dan ada banyak guide online ada sebenarnya banyak guide di sana untuk beritahu anda bagaimanapun anda apabila anda beritahu saya beritahu Lisp adalah sebuah kata-kata untuk pelanggan yang lebih banyak anda tidak boleh beritahu saya adalah pelanggan yang lebih banyak tanpa beritahu saya saya beritahu Lisp sebelumnya bagaimanapun itu? Jadi, ya Jadi, pertama ada guide ini oleh Peter Norvig Peter Norvig adalah seorang yang beritahu sebuah kode yang terkenal dia... bagaimanapun itu dia seorang yang membuat kode AI kembali pada tahun 2011 dengan Sebastian Trung Trung? Ya, Trung Saya tidak boleh beritahu itu Ya, tapi Sebastian adalah seorang yang berada di belakang Udacity saya hampir dapatnya salah Ya, jadi dan... ya, kode AI itu semua itu yang memulakan kode Mope pada tahun 2012 Ya, dan lain-lain guide yang anda patut periksa adalah membuat kode Lisp membuat kode Lisp sendiri jadi, kode Lisp sebenarnya beritahu sebuah kode online di mana anda beritahu bagaimanapun untuk membuat kode Lisp tanpa sebuah kode C jadi, jika anda beritahu saya rasa saya rasa C, Ruby saya terlalu kecil saya ingin beritahu C saya ingin beri mesej dan beritahu C jadi, anda boleh belajar C dengan belajar bagaimanapun untuk beritahu Lisp beritahu Lisp dan C jadi, tapi sebuah... sebuah kode ini sebenarnya sangat keren jadi kode ini sebenarnya mempunyai kode Repository yang digunakan ML yang mempunyai kode Lisp dia mempunyai Repository yang mempunyai kode Lisp yang mempunyai kode Lisp 44 mempunyai kode Lisp mempunyai kode Lisp kita mempunyai kode Lisp Haskell Bash Even seseorang pun membuat dan ML juga ada kode Ruby jadi dia mempunyai kode Lisp yang sangat baik dan juga membuat kode Lisp untuk menjelaskan kode Lisp dalam kode Lisp mungkin mempunyai kode Lisp atau atau apa-apa pun kode Lisp yang anda mungkin tahu jadi saya akan mengikuti kode Lisp mempunyai kode Lisp dan saya akan mengajar anda bagaimana membuat kode Lisp sebab kenapa anda mempunyai kode Lisp sebab ia sangat mudah untuk memahami dan anda boleh belajar lebih daripada 10 minit jadi dan seperti kode Lisp seperti kode Ruby kode Lisp kode Rappel kode Re-eval seperti kode Interactive kode Command Line kode Shell yang anda boleh mengikuti dan sesuatu yang akan berlaku jadi ia seperti RRB yang anda sangat berkenal dengan jadi Mel saya akan mencari ini seperti kode Lisp jadi jika saya mengikuti kode Lisp apa yang akan berlaku? 8 6 plus oh iya 8 betul betul jadi apabila anda tahu sedikit jadi sangat baik-baik jadi sebuah perkara yang ditutup adalah kode Lisp anda dapat melihat itu? saya harap anda boleh kode Lisp seperti kode Expression kode Expression biasanya ditutup dan juga anda mempunyai kode Expression untuk keputusan kode String dan bulan dan apa yang saya dapat jika saya mencari ini? 4 negatif 4 itu betul dan bukan 4 kerana ia 4-8 baiklah terima kasih apa ini? 6 dan ini betul baiklah dan perkara yang berlaku apa yang saya dapat? 42 iya, itu jawapan betul dan ini sebenarnya sebuah cara untuk anda mempunyai fungsi seperti di Ruby anda dapat mempunyai fungsi dan mengambilnya dan jadi dalam kota anda pilih pertama anda adalah sebenarnya Fn star pilih kedua anda adalah pilihan anda pilihan anda pilihan anda dan pilihan anda pilihan anda pilihan fungsi seperti di Ruby anda mempunyai lambda dan mengambilnya sehingga X dalam perkara itu saya tidak tahu apa yang anda katakan pilihan Fn dan sebuah pilihan anda pilihan lambda atau pilihan fungsi atau pilihan pilihan pilihan dan apa yang berlaku dari interpreter adalah pilihan fungsi dan saya dapat pilihan fungsi dengan sebenarnya dalam kota anda bukan pilihan pilihan dan mengambilnya jadi pilihan pertama saya adalah pilihan yang saya mahu pilihan dan pilihan kedua adalah pilihan yang saya mahu mengambil jadi ia seperti Ruby dan anda pilihan anda pilihan lambda dan mengambil parameter anda dan saya juga dapat mempunyai dan mengambilnya jadi saya mempunyai fungsi saya akan mengambilnya SQ dan sekarang saya mempunyai fungsi saya nama SQ jadi saya dapat pilihan SQ 8 saya akan mempunyai yang mempunyai 8 saya akan mempunyai 64 jadi sekarang anda akan tahu ini beri diri baik-baik jadi sebelum kita mempunyai sebelum kita sebenarnya mempunyai listan dan Ruby saya akan mempunyai dari mel sekarang kerana guide jadi guide sebenarnya mengajar anda bagaimana mempunyai perangkatan dan penggambaran tapi saya akan menunjukkan anda bagaimana mempunyai jadi perangkatan adalah yang saya sebenarnya mencari perangkatan dan sebenarnya memperkenalkan perangkatan ia tidak mempunyai ke dalam masin atau kode berbunyi tapi saya akan mempunyai dan saya akan mempunyai ke perangkatan Ruby ya Ruby jadi ya Ruby iya saya akan mempunyai seperti sesuatu yang sangat bersyukur saya tidak akan memperkenalkan bersyukur tidak ada apa-apa tentang perangkatan dan COCs jadi mari kita berhenti berhenti jadi Rubiness Rubiness yang anda mungkin dengar adalah sebenarnya implementasi atau Ruby dan mempunyai LLVM JIT JIT mempunyai perangkatan saya akan memperkenalkan jika anda berminat lihat dan apabila tidak hanya perangkatan dan perangkatan atau Ruby ia juga platform perangkatan jadi perangkatan perangkatan dapat menggunakan Rubiness untuk memperkenalkan perangkatan perangkatan jadi saya menggunakan perangkatan perangkatan dan kode berbunyi anda mungkin memikirkan perangkatan perangkatan dan perangkatan perangkatan yang berbunyi jadi ia adalah perangkatan perangkatan jadi ia adalah perangkatan yang sebenarnya di atas OS dan ia akan membaca kode berbunyi seperti perangkatan perangkatan perangkatan dan sebenarnya memperkenalkan perangkatan yang berbunyi ia juga memperkenalkan perangkatan perangkatan dan beberapa perkara seperti itu dan satu perkara yang sangat baik adalah orang boleh memulai berlainan dan memperkenalkan perangkatan perangkatan perangkatan dan boleh memperkenalkan pada sebuah perangkat pada jalan-jalan anda tidak perlu peduli jika anda memperkenalkan perangkatan perangkatan atau perangkatan perangkatan perangkatan jadi ini seperti ada program java? anda mungkin tidak di sini tentu jadi itu adalah perangkatan jadi jadi jadi anda boleh memulai ini dan memulai JVM di sini java perangkatan perangkatan dan anda boleh memulai Closure, java, Scala, Groovy, Kotlin, whatever iya jadi similar dan mari kita memulai seperti yang saya katakan anda akan memulai pengalaman di atas perangkat perangkatan perangkatan perangkatan perangkatan dan sejak ia adalah sebuah perangkat perangkatan anda boleh memastikan perangkatan perangkatan sangat mudah ini sesuatu yang kita tidak boleh membuat dan MRI selamat beritahu baik jadi ini adalah perangkat ber.." Sebab kita sebenarnya mencari bahagian yang berlainan yang berlainan yang berlainan yang berlainan yang berlainan Kita tidak akan melakukan seperti seperti kawasan metode atau sesuatu plus sesuatu Jadi kita tidak akan melakukan itu Kita sebenarnya melakukan seperti plus MyVar2 Notation Prefix Jadi kita akan mengubah pasir Itu adalah perkara pertama Pertama yang kedua kita akan mengubah adalah actually AST Kenapa? Sebab kita mengubah object AST ke alasan pipeline Alasan pipeline kita sebenarnya mengubah method bytecode di alasan node AST alasan object AST Jadi Ini sebenarnya sangat menarik kepada MRI btw Jadi saya dengar Siapa itu? Aaron Aaron Patterson Jadi dia Sebenarnya Saya dengar dan saya kata Hei Ini sangat menarik kepada Rubinus Ya, jadi apa yang mereka lakukan adalah Mereka mempunyai method bytecode Untuk setiap node AST Dan setiap node AST tahu bagaimana untuk mengubah bytecode untuk diri Betul Jadi Oh Ya, pasir AST Sintax 3 btw Itu apa? AST stands for Maaf Ya Saya akan jelaskan apa yang mereka lakukan nanti Jangan risau, awak akan kata Apa ini? Jangan risau Baik Jadi pasir AST Okey, jadi ada tiga jenis pasir Tokenizer Reader Dan logic pasir Dalam bahagian lain Maksud saya, awak mungkin berjalan dengan sebuah kelas pembalas Awak nampak apa? Tokenizer Oh, tidak, saya perlu mempunyai 1,000 Lengah 1,000 alasan code Mempunyai? Tidak Tidak Saya akan tunjukkan bagaimana mudah Ini untuk mempunyai Ia akan berkode Tidak, ia akan berkode Lisp Ya, jadi tokenizer apa yang dia lakukan Ia sebenarnya mengambil alasan pasir Atau sebuah kode Dan sebenarnya mengambil alasan Jadi Tokenizer seperti Maivar Tak sepatutnya M, y, nama Ia sepatutnya Sebenarnya Ia sepatutnya Saya panggil itu sepatutnya Dan 42 Tak sepatutnya Ia sepatutnya Ia sepatutnya Saya... Seperti bagaimana saya akan membaca Seperti sepatutnya Jadi ini adalah tokenizer Dan untuk membuatnya Ia sebenarnya sangat mudah Ia hanya satu alasan pasir Ya, jadi Apa yang saya lakukan adalah Saya akan Seperti sepatutnya Membangunkan Alasan pasir Untuk Alasan pasir Dan Bersendirikan Ya, tolong jangan mencuba Hei, apa ini? Macam mana? Tolong jangan mencuba Saya juga tidak Tengoknya Tapi saya hanya menggunakan Kopi dan pasir dari internet Dan ia berlaku Ya, seperti apa Kita selalu melakukannya, kan? Ya Jadi Dan Dan kemudian ini Ia sebenarnya sangat berbeza Untuk apa yang kita nama Lexing dan Ruby Dan Jika anda mempunyai Ruby interpreter RRB atau Pry Anda boleh sebenarnya Membangunkan ini sekarang Jadi kita hanya mempunyai Ripper Saya tidak tahu kenapa Mereka nama Ripper Tapi Mereka mempunyai Ripper Dan nama Dot Lex Untuk Ripper Dan menggunakan String Kode Ruby yang anda ingin melihat Token-4 Dan anda akan menerima Semuanya Yang sebenarnya Token-4 Di kode anda Baiklah, jadi Sekarang kita telah Untuk kode kita Untuk Token-4 Sekarang kita boleh sebenarnya Untuk ke depan yang lain Yang adalah Ripper Ripper Apa yang ia lakukan Sebenarnya Ia sebenarnya mengambil Semuanya Token-4 Liss atau Token-4 Orang-Orang-Orang Token-4 Dan membuatnya Untuk Selepas itu Tapi ia sebenarnya Ia sebenarnya Membangunan Yang membuat Apa yang kode Sebenarnya Membangunan Betul Jadi Ia sebenarnya Membangunan Ia sedikit lebih penting Untuk kode anda Jadi Orang-Orang tanya Ia sebuah ekspresi Jika anda sebenarnya Membangunan Sebenarnya Ruby Ia sebenarnya Membangunan Ia sedikit lebih penting Untuk Ya Jadi Dan Ya, anda lihat jemput Seperti Ruby AST Dan Ruby Passer Ia sebenarnya Membangunan Kode Ruby Dalam Ia sebuah ekspresi Sebab itulah Ia sebab Ia sebab Ia sebab Ia sebab Ia sebab Ya, jadi Dan untuk melakukan Ia sebenarnya Untuk Token-4 Untuk Ia Ruby array Yang menarik kodi Kita perlu melihat pergerakan Anda akan rasa Hei, awak tahu Di pergerakan ked Wherever Ligetan berusaha Ligetan berpada dua, dua, tiga Anak Ligetan berpada 10,000 Tetapi Dalam pergerakan kord di musti Nanti ada lelaki-lelaki Jadi Ini itu apa yang kita nampak Perniatan mengatak Ia sangat mudah dibahas Okey Apa yang saya cuba katakan Ia adalah Ia berורan Oh, dan atom Jadi anda boleh meneritanya Seperti kamu Ia sebab So, a form is actually like an expression in a mel, so it's either a list or an atom. And a list is actually a bunch of forms, that's why forms star, a sequence of forms, and close in either parenthesis or square brackets. And atoms are just simply your tags, strings, numbers, and boolean values. So, to implement the reader to read forms is actually very simple. So, I just need to check whether the first token is actually a parenthesis or not. If it is, I'll call readList, if it's not, just call readForm. Simple as that. So, as for the second rule, the second rule actually will correspond to this function, readList. And this readList, what it does is it just call readForm repeatedly on it until it encounters a closing parenthesis. That's it. And we have our last function. This is like this simple. So, it's just a bunch of case when, cases, yeah. And we will return a pair that represent what the token is. So, if it's an integer, my first element is a symbol. And the second element is the token itself. So, just to recap, what we have done is that we have turned a piece of code into a stream of tokens, array of tokens, and into array that represent the data structure. The data structure that represent what the code is in a form of ruby array. All right. Hey, take a break. All right. So, now onto the passing logic. So, what we're going to do is that from the AS expression, we're going to turn it into AST. Extract syntax tree. All right. So, who knows what is this? All right. Yes. Finally, some people understand what I'm trying to say. Thank you. All right. So, apparently, what's an AST? So, I'll give you an example. So, this expression or form here, this will be represented in the AST form by this tree. And a tree is like, it's like an upside-down tree. I don't know. I assume you know what trees are, right? So, yeah. So, why I call it upside-down tree? Because the root of the tree is at the top. Yup. So, what's at the root? The add node, right? Yes. Okay. Right. So, the add node is at the root and we call this the children. Children nodes. So, this boxes are called nodes. The whole thing is called a tree. So, they are related by lines. So, which means like, so this guy is the children of add node. The symbol node is the children of add node. So, that's a tree. So, it actually represents a bit of the structure of the code and even a semantic in other words, meaning of code already. So, the left-hand side of my add operation is the symbol, which is my var. And the right-hand side is the integer 42. Yup. And it's actually a Ruby object. Okay. This is what I want eventually. So, I can actually invoke or instantiate it like this. Right. A more complex example is this. And an if statement or if, not real statement, a if form. So, for a if node, a if AST, that will look like this. So, on the most left-hand side is children of the if node is the conditional. The next, the one in middle is the then branch, which is the, what if it's true, then I'll do this. Then branch, I call it. And the else branch, if the condition is false, I evaluate the else branch. Yeah. So, and this is the object that I want to instantiate. If I want to instantiate as object, this is what I do. Yup. So, I can, I also have assessors that I want to define on this object. So, if I call condition, I should get a less than node. If I call then branch, I should get 42. The else branch, I should get 88. 88, because like Chinese news coming. Whoo. Okay. So, to parse it, it's just, okay, it's actually kind of nasty. I wouldn't say nasty, but it's just basically it's too mutually recursive function. I won't go into detail, but I'll show you the easier, easier to understand mutually recursive function, one of it. So, what I do, I'll just look at the type of the pair. I'll just call the, I'll just instantiate the object for it. If it's a Boolean, instantiate a true or false. If it's a symbol, I just create a symbol node. Right. So, if you want to check out the other function, go to my repository. I'll show you the link at the end. Or you can start it. Give me 50 stars. I'll appear on I'll appear on the website. Okay. So, now, so now that we have our ASD, we're going to define the bytecode method on our ASD nodes. So, I need to talk about bytecode a bit-bit. So, I'm, am I still on time? Okay. Thank you. So, so in Rubinius, the virtual machine is actually a stack-base virtual machine just like MRI. Okay. What is stack-base? It just means that instructions operands are on the stack. So, but for your x86, your Intel computer, the operands are in the form to our registers, the stuff that is very close to the CPU. So, let me try explain what's a stack-base VM? It's actually very simple. It's simpler to explain than a register-base machine. So, let's say if I want to calculate one plus two. So, I'll have the stack of the virtual machine over there on your right. And the instructions to do it on the left. So, I need to push one onto the stack. Push two. All right. And I need to add. So, I need to execute the add instruction. So, what, at this point, what it does is that the add instruction will pop both operands off the stack and put the result onto the stack. I'm sorry. Ya. So, the result will be three. You'll find the result on top of the stack. So, so that the next instructions can actually read the result whatever it may be. So, and if you want to look at rubiness bytecode, you can actually do this. Ya. Let's just call this execute this command and you'll be able to see that, hey, oh, it's pushing one, one, two, three and it's pushing 42 and executing and sending the plus message to the integer object. Ya. So, you can do this in MRI by the way. So, we're just going Google like what we do every day and look for the first stack overflow link. Stack overflow link. Yes. Right. So, and so now I'm going to show you how we're going to generate bytecode for our AST. So, just a quick reminder, so now we have have our AST nodes. Now we're going to actually define the bytecode method on the AST nodes. So, over here I have an integer node. So, integer node is actually a subclass of the node class. The node class simply is just a class that has a bytecode method. So, all the nodes, the subclass of the node class just have to define read override the bytecode method. Overwrite, Ruby has overread. Oh, okay. I'm a Java programmer. Okay. So, here, here, as you see here, the integer nodes bytecode method is position which tells gives you some debugging in output and also I'm going to push the integer to the stack simple as that. So, what you see G.push underscore in is actually a DSL offered by Rubinius. What's cool about Rubinius bytecode is that they actually have a DSL in Ruby for you to write Rubinius bytecode. It's like mind blowing for me. So, and what's cool cooler is that this bytecode actually just look the same as the actual bytecode in what you saw just now. Yeah. So, so for the integer like I said we just had to push the integer to the stack. If it's an add node or add operator what I'm going to do is I'm going to call the bytecode method on the left hand side and on the right hand side. So, because the left hand side and the right hand side are also themselves node objects and my add operator may be nested. So, like I might be adding a expression which is nested. So, but I know but I don't know what it is. It may be a symbol it may be an integer but what I know is that it's a node object. That's why I'm going to call bytecode on it. So, once I call those bytecode methods I'm going to send the add message. So, just in case you guys don't know like Ruby is based on small talk another language. So, small talk just how they actually do OO is that they actually send messages. So that's why this is the legacy pass down right now. That's why Ruby inherited this and actually use send to call make method calls. All right. So, and for a more complicated example oh you can't even see this. Yeah just to show that it's very complicated but you just have to look at a bytecode can't you guys see? All right. Okay. So, you just have to look at a bytecode method. So, what we're going to generate is for the if expression. So, the if expression just to remind you has the condition that else the then branch and the else branch. So, if your condition is true what do I evaluate? Then yeah, if it is false else. Thank you very much. Yes, you guys are still awake. So, what we're going to do is that how are we going to do the the bytecode generation is I need to create two labels one for the end of the if expression if else block and one for the else block. All right. So, once I've generated these labels okay, so I forgot to explain what's label. So, labels are like places for your go-to instructions to go directly to. Yeah. So, go-to instructions are kind of like flow control for you to jump. So, you can imagine like in instructions will be read line by line. Okay. But when I encounter go-to instruction I should just go to the place where the label is set. So, instead of just going line by line. So, and in Rubina's bytecode instruction said you can go to if true and you can do like go to if false. Which I'll show you later on. And I will set these labels one at the start of the else one at the start of the else branch and one at the end of the if else block. So, then I'm going to call the bytecode method on the condition. So, the condition should actually evaluate to either a true or false value. So, and I will go to if it's false to the else block. It reads I English. Thank thank God for DSLs. So, and and yeah so if it's false I'll just go to the else block and call bytecode on it. And I'll just get out of the if else block. But if it's true I'm going to execute bytecode the bytecode method on the then branch and go to the end. I'm going to skip the else branch entirely. Alright. So, when you define the bytecode method for the rest of the nodes like def fn let and a symbol you have a working programming language. Yes. Alright. So, obviously I'm running short of time. I don't have much time to actually explain to you the rest of it. But this is the very high level overview of like how we're going to actually implement a language or even compile a language actually in this case. So, if you need help so there are some places to actually look at. So, go to this one. I really recommend you to go and try it. You can actually do it in a weekend or two to actually implement a list in Ruby or whatever language you're secretly learning. You don't have to tell us. Maybe Java. Right. So, go and look at now. Yeah. So, like I said, he has a very nice written guide. It's language agnostic. It's very easy to understand. Even if you don't understand, just look at one of the implementations on the repo. Alright. And this one so this one actually heavily inspired me. So, this is a language done by a bunch of so this is a language that compiles Rubinius by code. Okay. And it's done by a bunch of beginners from Rails Girls. They did it over summer. So, yeah. They, so it's over at this repository so you can check it out how they actually do done it. So, but the language that are compiling is not list. It's actually a more complicated language and they have a working parser to actually parse their language. They use one of the parser to I can't remember what it's called. It's in Ruby. Yeah. So, can take a look at it and and if you playing to like compile to Rubinius by code you should look at the instruction set it's over here. So, this is a website we can find all the instructions in Rubinius. And lastly, start my repo. Thank you very much. No, I'm just kidding. Yeah, yeah. So, I, so this is an implementation of Mel in Rubinius by code. So, I call it Melody. Just, I mean Ruby programmers we have very weird names to our gems. I know. Come on. Noko Kiwi. All right. Are there any questions? That's all. I have. Yes. What kind of situations would be beneficial to use list if you're doing it if you're coding a route or making a match? When your when your company forces you to write on the JVM and I would use closure. My colleagues are laughing. Yeah, because I I was like, yeah, um, because okay, the real question the real answer is I think in this DNH I mean if you want to use if you want to cure yourself with parenthesis you can write a list. I haven't seen a very good list implementation nowadays. The best out there is probably closure or even or doctor racket but I haven't seen a real like real world production code. Yeah, that is there's that has actually say that this is that justifies the use of this. Yeah. And don't need right now I've see list as something that is fun to implement for weekend and something and I think it's easy to teach. I actually taught a workshop for CDAC. You guys the Singaporeans you know like 50 cent we go to we pay goes to a CDAC so so I taught racket another dialect or lisp to a bunch of secondary school kids and some of them actually managed to get it. The problem is that they have to they didn't know that the brackets are above nine and zero. So they be like hey, I'm pressing nine but nothing comes out. You know, like they have to press shift. Yeah, so I think it's a very simple language that I can teach in less than 30 minutes or so. It's easier than javascript. Ha ha. It's not doesn't have any more questions. So running a bit short also if you have any more questions just look for Jason afterwards. Oh man. Yeah. Is there anything more time? If there's no no more time, I won't talk. But anyway, so another one one one very nice tidbit about Lisp is that this guy has called Matt Nox, I think. So he's actually Rubius working at Twitter right now. So in his past life he was writing adware for this company. The reason why he was hired because he know a bit of sea and he was hired to write sea to kick off some viruses that will disabling them their adware on their windows machines. So every time like a competitor he's so good at it that the company actually ask him to kick off their ad company's competitors and yeah. So what he did is that he actually did something very impressive. He actually wrote the adware in scheme dialect on Lisp and the reason why is because every time he need to kick off someone from their victim's machine he had to write a sea binary which is very painful. So what he did he needed he thought he needed something comfortable something touring complete. So he actually ship tiny scheme it's actually a 20k executable and on to like the victim's machine. So and every time he needed to kick off a competitor he just need to upload a scheme code to the server and the competitors and viruses will actually go dark. So he claims that he has ship the most scheme runtime on this planet than anyone else. Yeah. So just a nice tip it's for you to read if you're interested I'll post the slides. Yeah have have fun implementing a language inside another language. Thank you guys. Yeah.