 Saya sangat risau. Ini adalah kali pertama saya bercakap dengan sebuah perempuan besar seperti ini. Jadi, ya. Jadi, hanya... Terima kasih. Hanya sebuah kata-kata tentang MADS Talk. Sebelumnya, ia sangat bagus. Saya sangat suka idea pembentangan. Saya juga suka pembentangan. Dan ia menolak saya buat perkara seperti ini. Sangat bagus. Dan... Oh ya, dan bila-bila... Ya, seperti yang saya katakan, saya sangat risau. Sebab, jika saya mempunyai, saya akan mempunyai di depan 300 orang. Saya tidak tahu jika saya harus balik ke conference Ruby lagi. Tetapi, bila-bila, ada kopi di luar, dan mereka sebenarnya mempunyai skala. Ya, jadi, saya fikir mungkin itu adalah sebuah perempuan. Mungkin saya harus pergi ke komuniti skala lain kali. Jadi, ya. Okey, jadi... Hai, bila-bila, nama saya Jason. Ini adalah pembentangan saya. Dan ini adalah pembentangan Github saya. Saya sebenarnya bekerja di Source Clear. Ia adalah pembentangan dari startup di San Francisco. Kita sebenarnya adalah pembentangan sekuriti-sekuriti. Jadi, kita sebenarnya melihat pembentangan di luar, dan biar anda tahu apapun yang ada di sana. Siapa-siapa pembentangan di luar, dan biar anda tahu bagaimana membuatnya. Oh, sesuatu berlaku pada pembentangan. Okey. Bagaimanapun, jadi... Ya, saya akan bercakap tentang... bagaimana untuk memelakkan perempuan. Jadi, anda mungkin fikir, apa yang kita bincangkan dengan pembentangan? Ada apa-apa yang boleh dibuat dengan perempuan dan perempuan? Game of Thrones? Tidak. Ia sebenarnya memerlukan... pembentangan di sini. Ia sebenarnya adalah pembentangan yang terkenal di universiti. Pembentangan pembentangan di luar untuk pembentangan. Jadi, ia juga terkenal sebagai pembentangan perempuan. Tetapi, perkara-perkara orang fikir, apabila mereka ingin mempunyai pembentangan, mereka perlu membaca pembentangan ini. Tapi hari ini, saya akan tunjukkan kepada anda bahawa anda tidak... dan saya akan tunjukkan kepada anda bagaimanapun anda boleh memperkenalkan pembentangan perempuan anda sendiri. Dan dalam pembentangan perempuan kita, Ruby. Ya. Tapi anda mungkin fikir, kenapa... kenapa kita perlu memperkenalkan pembentangan perempuan? Pertama-tama, ia menarik. Paling kurang untuk saya, saya rasa itu menarik. Dan anda dapat faham bagaimana pembentangan perempuan berlaku. Dan anda dapat faham bagaimana pembentangan anda berlaku. Jadi anda mungkin dapat eurang seperti ini kadang-kadang di dalam pembentangan anda. dan anda... apabila anda sebenarnya memperkenalkan pembentangan, anda sebenarnya faham mengapa anda dapat memperkenalkan pembentangan ini. Dan anda dapat memlepaskan diri sendiri dalam pembentangan perempuan perempuan. Seperti Matz, anda tidak akan tanya, kenapa dia menarik pembentangan perempuan Python dan memperkenalkan pembentangan perempuan? Yé, paus-pausnya sangat bagus. Ya. Jadi anda dapat memlepaskan diri sendiri dalam pembentangan perempuan perempuan. Dan anda dapat menghargai semua perkaraan seperti... whoops... ...gapis koleksi... ...dan ruang skoping. Jadi hari ini, saya sebenarnya akan menunjukkan... ...berapa untuk mempunyai bahagian dan bahagian yang kita akan mempunyai adalah... ...lisp. Ya, jadi... ...kita akan membuat bahagian. Jadi kenapa bahagian? Kerana itu sangat mudah untuk mempunyai. Kamu boleh sebenarnya mempunyai bahagian... ...in sebuah pagi singgah di sini. Ya, percaya saya ini hanya sebuah pagi singgah. Jadi kamu mungkin tak dapat melihat. Dan ada banyak guide online. Jadi di sini kita ada... Peter Norvig, dia menulis guide... ...on bagaimana mempunyai bahagian yang mempunyai bahagian... ...dan bahagian. Ada guide... ...yang disebutkan untuk membuat bahagian. Tetapi ini adalah dalam bahagian. Jadi jika kamu berfikir... ...memperkenalkan untuk melihat Ruby... ...dan kamu mahu belajar bahagian... ...meriksa bahagian ini. Dan... ...terakhir, bahagian yang tidak diulis... ...adalah ini yang saya menemukan. Ia sebenarnya memiliki... ...bahagian ini sebenarnya... ...dia mempunyai bahagian... ...memperkenalkan dalam 56 bahagian... ...kongsi Ruby... ...dan dia mempunyai bahagian yang sangat baik... ...dengan guide setiap bahagian. Dan ia sangat mudah untuk memahami. Kerana... ...ada diagram... ...kita semua memahami diagram... ...sebab ini lebih mudah untuk memahami. Jadi... ...dan juga... ...bila kamu memahami... ...bila kita memahami bahagian ini... ...dia sebenarnya memahami bahagian... ...bagaimana kita memahami bahagian. Jadi Matz... ...berada pada tahun 2006... ...dia sebenarnya menulis e-mail... ...untuk bahagian Ruby Talk... ...berkongsi. Dia kata ini... ...dan saya memahami bahagian untuk kamu... ...sebenarnya untuk kamu tidak dapat melihat. Dia kata... ...Ruby adalah langgan yang membuatkan dalam perjalanan. Pindahkan langganan yang mudah... ...menerima makro dan kemaharan... ...dan memadamkan sistem objek yang mudah dan lebih mudah... ...ambil blog... ...ambil metod yang ditempatkan di laptop... ...ambil fungsi, menempatkan peri... ...dan ini cara ia mengakhirkan. Jadi Ruby adalah sebuah list yang sebenarnya... ...berkongsi. Mari kita panggilnya... ...list dari sekarang. Ya, jadi... ...saya memulakan... ...sebab Matz berkata... ...dia mahu memadamkan Ruby... ...jadi untuk membantu... ...memadamkan Ruby... ...saya memadamkan nama... ...untuk list Matz... ...sebelum sekarang. Dan saya... ...masukkan logo untuknya. Dan saya memahami bahawa... ...nama domain... ...tidak dibawarkan oleh sesiapa... ...jadi saya memadamkan untuk memadamkan website... ...dan memadamkan domain. Dan dengan kata, ini benar. Kita boleh sebenarnya memadamkan website... ...dan melihatnya. Ya, memadamkan list Matz. Ia sebuah langgan yang mudah. Baiklah, jadi... ...bila-bila... ...bukan lagi bahan yang serius... ...bagaimana kemukulisannya? Bersulitkan dengan benda... ...bagi list Matz. Jadi seperti yang saya katakan... ...saya akan mengetahui... ...seorang perempuan ini. Awak dapat betul-betul... ...ijakannya... ...dan jemput mencabar. Saya beritahu awak untuk mencabar. Saya melihatnya... ...berkata, dan... ...dengan kebenaran... ...tidak adalah mel. Kenapa saya cakap... ...sebelum mengucapkan list Matz? Sebab... ...dia banyak kebenaran list Matz. Jadi... ...pertugah dia... ...tidak adalah mel. untuk membuat lisp. Sebelum kita mula memperkenalkan, saya pasti tidak ada lisp. Tapi saya tidak fikir banyak anda tahu bagaimana untuk membuat lisp dan bagaimana untuk membaca lisp. Jadi saya akan memberikan lisp dalam 5 minit. Jadi di sini, kita ada rappel atau interpreter. Jadi saya akan membutuhkan kode, dan saya akan membutuhkan kode. Saya akan membutuhkan kode, dan keadaan ini akan di-evaluasi dan keadaan ini akan di-evaluasi. Di sini, ada kode. Boleh seseorang bercerai? Apa yang anda fikir ini akan di-evaluasi ke keadaan lain? Saya tidak tahu, saya hanya mengenai keadaan lain. 8. Ya, saya dengar 8. Jadi apa yang anda ada di sini adalah actually a lisp form on an expression. Ia adalah usually enclosed in parenthesis or brackets depending on which part of the world you come from. Dan kita ada di sini, apa yang anda fikir ini akan di-evaluasi ke minus 4? Kamu semua sangat senang. Baiklah, apa tentang ini? 6. Bagus. Dan ini, di sini. Benar. Terima kasih. Okey, satu yang sulit. Apa ini? 42. Ya. Dan di sini, ini cara kita mempunyai fungsi dalam email. Jadi kita akan menggunakan fn star dalam ekspresi kita. Jadi mengikut parameter dan seluruhkan square brackets. Dan mengikut body fungsi. Jadi fungsi ini sebenarnya membantu kita mempunyai fungsi yang mempunyai parameter sendiri. Ya, ini seperti bagaimana kita membuat ini dalam Ruby menggunakan lambda. Dan untuk sebenarnya mempunyai ini, kita memperkenalkan fungsi dan parameter dalam sebuah parenthesis lagi. Di pilihan pertama kita mempunyai fungsi yang kita mahu mempunyai dan mengikut argument. Dan anda akan memberikan kita 64. Dan ini seperti bagaimana kita membuat ini dalam Ruby. Kita hanya mempunyai dot-call dan memperkenalkan argument. Jadi jika anda mahu menggunakan nama, hanya menggunakan def dan menggunakan nama. Saya menggunakan sq dan memperkenalkan square brackets. Dan saya akan mengunakan nama dan fungsi dan parameter dan memperkenalkan kita 64. Sebenarnya anda tahu basic list. Baik saja. Saya akan memberikan perusahaan yang sangat cepat untuk interpretasi. Kerana kita akan menerima perusahaan untuk itu. Perusahaan itu mengambil kode dan memperkenalkan dan memperkenalkan kode tetapi itu akan menjadi 1.8. Kita tidak lebih membuat itu. Kita akan memperkenalkan kode dan memperkenalkan kode dan memperkenalkan perusahaan yang diperkenalkan untuk memperkenalkan kode tetapi anda mungkin tahu bagaimana perusahaan itu. Perusahaan itu memperkenalkan perusahaan. Perusahaan itu memperkenalkan kode lebih tinggi daripada perusahaan yang negatif. Perusahaan itu juga perusahaan yang diperkenalkan perusahaan dan perusahaan yang negatif. Jadi kita boleh menerima perusahaan yang sama untuk perusahaan yang berbeda, bahkan arm atau x86. Sebenarnya anda tahu saya tidak akan membuat ini di MRI. Saya akan menggunakan Rubinius. Sebenarnya mengenai Rubinius adalah lagi implementasi Rubi. Sebenarnya Rubinius bukan hanya sebuah implementasi Rubi, ia juga sebuah platform perusahaan. Jadi ia memperkenalkan perusahaan yang lebih tinggi daripada perusahaan. Dan ia memperkenalkan perusahaan yang diperkenalkan perusahaan dan perusahaan yang diperkenalkan. Dan saya akan menunjukkan bagaimana nanti. Jadi mari kita memperkenalkan. Kita akan memperkenalkan perusahaan yang berbeda. Ada dua perkara yang kita akan menggunakan. Pertama adalah perusahaan dan yang kedua adalah perusahaan yang diperkenalkan perusahaan. Pertama adalah perusahaan. Pertama adalah penerima. Pertama adalah perusahaan. Untuk perusahaan yang dibuat oleh nama adalah nama untuk berpenerima. Jadi ia akan mengambil nama dan membuat nama untuk berusahaan. Pertama adalah perusahaan, perusahaan dan perusahaan. Dan ia akan menerima perusahaan seperti ini. Saya akan menggunakan pilihan dan menggunakan pilihan. Ia seperti perusahaan. Sebab itu saya akan memperkenalkan perusahaan yang lebih mudah untuk mengingat perusahaan. Ia sangat mudah. Pilihan saya adalah pilihan yang sederhana. Sebenarnya, anda juga boleh menikmati leksin dan matzlips. Jadi jika anda mempunyai leksin dan matzlips, dan anda hanya memperkenalkan perusahaan, panggil dot-legs pada perusahaan, menerima pilihan, dan menerima pilihan yang mempunyai pilihan. Jadi anda mempunyai pilihan 1,2,3 pada pilihan terakhir dan anda boleh mencoba sekarang. Untuk memperkenalkan, kita telah mengambil pilihan dan menerima pilihan leksin. Apa yang pilihan adalah pilihan pilihan. Tetapi tidak begitu mudah. Jadi ia akan mengambil pilihan dan mengubah pilihan S. Jadi ia adalah sesuatu dari leksin dan bagaimanapun, ia hanya memperkenalkan pilihan yang memperkenalkan pilihan saya. Sebelum kita membuat itu, saya perlu jelaskan pilihan kerana pilihan kita akan berdasarkan pilihan. Jadi saya akan menunjukkan perkara yang mencari, tetapi tidak sangat susah. Di sini, kita mempunyai 3 pilihan dan setiap pilihan mempunyai pilihan. Pilihan pertama adalah pilihan yang memperkenalkan pilihan. Ia bermakna ia boleh diperkenalkan juga. Pilihan yang terlihat dan untuk pilihan yang memperkenalkan, ia boleh diperkenalkan semua. Pilihan yang lebih tinggi boleh diperkenalkan semua. Dan pilihan yang memperkenalkan bermaksud 0 atau lebih. Untuk menunjukkan contoh, saya akan menggunakan bahagian untuk menunjukkan contoh. Saya mempunyai 5 pilihan di sini. Untuk menunjukkan contoh, pilihan yang dapat diperkenalkan sebab terkenal dan sebab itu adalah pilihan yang sama untuk pilihan yang juga namun. Pilihan yang dapat diperkenalkan atau memasukkan. Pilihan yang boleh diperkenalkan, saya, dia, Ruby atau Python. Jadi contoh yang yang saya mengenali saya suka Ruby atau dia memasukkan Python. By the way, the Python conference was so happening at the same time. I had no idea why. But yeah, so they want to still put grammars from us. So anyway, yeah, I'm not a very big fan of Python, by the way. Alright, so okay, back to our grammar. So let me explain what this grammar is. So for the first rule, our form or list is like an expression in list. So a form can be expanded to either a list or an atom. And a list is basically a bunch of forms enclosed in a pair of parenthesis or square brackets. And an atom is basically a bunch of characters or a bunch of numbers or our true and false intervals. So like I said just now, the reader implementation is based on the grammar. So for our first rule, we're going to have a function that corresponds to it. So in this function, I'm going to call it read form. I'm just going to take the first token and check whether it is an open parenthesis. If it is, I'm just going to call read list on it. If it's not, I'm going to call read atom. Simple as that. Just like five lines. So as for the second rule, since it's a bunch of tokens enclosed in parenthesis, I'm going to put it in the loop and call read form on it. And as for our last rule, atom. So since it's a few cases of the strings, I'm going to put it into a case-when statement and comparing it against regular expressions and strings. So if it's an integer, I'll return the integer symbol along with the token itself. So just to recap, I have converted my code into tokens and my tokens are transformed into S expressions. So now to the last stage. So what are we going to do with S expressions? We're going to actually transform this into abstract syntax tree. So what are abstract syntax tree? It's basically syntax trees that are extract. So it represents the synthetic structure of the code. And just to give an example, so this expression here will be represented by this tree with the add node and two children. The add node will be the root. So the child on the left is called the left operant which corresponds to our symbol, my var. And the right child corresponds to the right operant which is our integer 42. So how is this implemented in code? Just like this. So my integer node is basically a class that holds a value, the integer value. And for my add node, it's basically a class that holds references to the node objects and the node objects to the left and right operants. And they themselves are node objects. So and now moving on to the most exciting part which is bytecode generation. So and one thing that's special about Ruby, I mean mess lips and Rubenius is that it actually uses a stack-based version machine. So what's a stack-based version machine? So basically it's a version machine that operates where its instructions operates. Operants are actually on a stack. So let me give you an example. So let's say I want to compete 1 plus 2 on my stack-based version machine. So on the left are my instructions and on the right is my stack where my instructions are going to operate on. So I have to, first what I'm going to do is I'm going to push the integer value 1 to the stack. Next I'm going to push the integer value 2 to the stack. And next I'm going to execute the add instruction. What this add instruction do is that it will pop the operants. So 1 and 2 will be popped and it will push the result onto a stack. What do you think will be on top of a stack after this instruction? Yup, I hear a tree, yes. That's right. So what if I want to multiply the result of 1 plus 2 by 3? So I'm going to push 3 and execute the multiply instruction. So what do you think will be at the top of a stack right now? 9. That's right. You guys are really smart. So you can actually see this actually happening right now if you have an interpreter with you. You don't need to connect to the internet. If you have a Ruby interpreter, you guys are Rubyis, right? So you have an interpreter right now. So go to interpreter and we're going to use this class from the Ruby BM module. The class is called Instruction Sequence. So assign your code so over here I have a piece of code which is 15 plus 6 times 2. Then I'll pass it to this method from that class. I'll call .compile on the code and I'm going to call this assemble for short. So it will actually return us this and you'll see that 15 and 6 are being pushed onto a stack or rather over here it uses the word put object and it calls odd plus which corresponds to the plus instruction. Then you'll push the integer value 2 to the stack and execute multiply. So you can try it right now. So as for Rubyis, how does it work? So the first thing we're going to do is that we're going to create an empty class or rather some form of interface and what's cool about Rubyis is that it actually provides a pure mass-lips bytecode generation DSL. So this is how the DSL look like. So in my integer node class, we just push them to the stack. So in my bytecode method I just have to call or rather I just have to execute the push integer instruction. DSL and this is how it looks like. It reads just like the bytecode. And for our add node this is what we do. So we just have to push the left operands bytecode and the right operands bytecode we just call, sorry, the left operands and the right operands bytecode method and we execute the plus instruction. So once you have actually implemented the bytecode instructions for all your nodes, obviously I don't have a lot of time so it's not a complete programming language. So where to get help if you need help. So I really recommend you to check out this repository. It has a very nice guide, a step by step guide to teach you how to implement a language be it in Java, C or Ruby. And most importantly it has diagrams, very nice diagrams. It's actually a language implemented in Rubiness and it's done out by a bunch of beginners from the Rails Girls community. And of course you can check out my repository and give a star if you like it. And if you're interested in the internals of Ruby go check out this book. It's called Ruby Under Microscope. That's all. Any questions? We welcome some questions for Jason. If you have questions. Can you can you show us those repositories that you, you know. Sorry, I went too fast, right? So this is the Rubinius one. Queen Frankie slash Lenny. And this is Mel one. Kanaka slash Mel. And of course last but not least my own repository GSEO slash Ya, quite melody. It's a sick quote. Nobody got that reference. It's okay. Any other questions? Hey, Gid. Hey. I don't know if you said this and you're talking if you did and I just forgot it and I'm sorry. What got you interested in learning how to build your own programming language like a Lisp? Ya, ya, ya. Oh, why? Ya, what's the origin story behind this talk, I guess? Origin story. I was beaten by a spider. So I always thought that because basically I spent a lot of time on Hacker News. So on Hacker News you have Paul Graham talking about Lisp. And he has all these blogs and all these articles. So he kind of inspired me. He said that Lisp is really easy to implement and one day I just tried it out and followed one of the guides right here. Cool, thank you. Any more questions for Jason? Okay. Right, it seems like. Oh wait, cool. So you showed an example from the language. So is it possible to generate some code in some other language from that particular language? So you're saying is it possible to let's say I have a Java that compels to this mic? Ya, so using these tools or the tools that you talked about right now. Is it possible to generate functions from, maybe not a C function but maybe a Ruby function from the syntax that we showed. Yes, the DSL actually compels to the Rubinius version machine. So it actually has some instructions for you to generate functions. I'm not sure whether that answer the question. Right here, I think yes. Ya, there's a link right here. It's kind of small and I went fast. So we can check out it's an article about the DSL in Rubinius. So it will show you what some of the constructs can generate in your programming language. Okay, it seems like we have a last quick question. Alright, ya. Hello, I've got a question. Why don't you use AACC for lexing analysis and AACC for example for parsing? Because regular it seems to be much better than usual regular expressions since it, for example, allows to parse recursive structures etc. Yes, very simply because the regular expression works. It works just for my use case. So, ya. It's pretty it's it just works. I don't need another dependency because it's not that high level like Ruby or some other programming language like C or JavaScript. So I don't need such a I find it over queued to use Rekko just for parsing like parenthesis and square brackets. Thank you, Jason. Thank you, Jason. For any other questions for Jason you can reach him on his Twitter handle which is Jason YoJS Thank you very much.