├── README ├── rapport ├── kapitel │ ├── teori.tex │ ├── forkortningslista.tex │ ├── kallor.tex │ ├── forord.tex │ ├── appendix.tex │ ├── slutsatser.tex │ ├── sammanfattning.tex │ ├── abstract.tex │ ├── diskussion.tex │ ├── metod.tex │ ├── inledning.tex │ └── resultat.tex ├── image1.png ├── parser_1.png ├── hiji_screen3.png ├── opponering │ ├── opponering.pdf │ └── opponering.tex ├── rapport.tex ├── kallor.bib └── MasterThesis.tex ├── haskell.js ├── haskell.utilities.js ├── hiji.css ├── typecheckertests.html ├── test.htm ├── hiji.html ├── haskell.hiji.primitives.js ├── hs └── Prelude.hs ├── typecheckertests.js ├── lib ├── jquery.cookie.js ├── json2.js └── jsparse.js ├── haskell.primitives.js~ ├── haskell.interpreter.js ├── haskell.hiji.js ├── haskell.primitives.js └── haskell.ast.js /README: -------------------------------------------------------------------------------- 1 | Yeeeah, you read me! 2 | -------------------------------------------------------------------------------- /rapport/kapitel/teori.tex: -------------------------------------------------------------------------------- 1 | \section{Teori} 2 | -------------------------------------------------------------------------------- /rapport/kapitel/forkortningslista.tex: -------------------------------------------------------------------------------- 1 | \section{Ordlista} 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /rapport/kapitel/kallor.tex: -------------------------------------------------------------------------------- 1 | \section{Källor} 2 | 3 | 4 | nigger stole my bike 5 | -------------------------------------------------------------------------------- /rapport/image1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johang88/haskellinjavascript/HEAD/rapport/image1.png -------------------------------------------------------------------------------- /rapport/parser_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johang88/haskellinjavascript/HEAD/rapport/parser_1.png -------------------------------------------------------------------------------- /rapport/hiji_screen3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johang88/haskellinjavascript/HEAD/rapport/hiji_screen3.png -------------------------------------------------------------------------------- /rapport/opponering/opponering.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johang88/haskellinjavascript/HEAD/rapport/opponering/opponering.pdf -------------------------------------------------------------------------------- /rapport/kapitel/forord.tex: -------------------------------------------------------------------------------- 1 | \section{Förord} 2 | TODO: Här tackar vi de som på ett eller annat sätt 3 | hjälpt oss med projektet... 4 | -------------------------------------------------------------------------------- /haskell.js: -------------------------------------------------------------------------------- 1 | var haskell = { 2 | parser: {}, 3 | interpreter: {}, 4 | ast: {}, 5 | primitives: {}, 6 | utilities: {}, 7 | typechecker: {} 8 | }; 9 | -------------------------------------------------------------------------------- /rapport/kapitel/appendix.tex: -------------------------------------------------------------------------------- 1 | \appendix 2 | \section{Bidragsrapport} 3 | Alla gruppmedlemmar var delaktiga i likvärdig utsträckning under planeringsfasen. Större delen av projektet har genomdrivits gemensamt men varje person har haft en inriktning enligt projektets olika delar. Johan Gustafsson har haft ansvar över parsern, Mikael Bung har ansvarat för interpretatorn och det abstrakta syntaxträdet, Mattis Jeppsson för typcheckaren och Adam Bengtsson för HIJi. Rapporten har skrivits enligt samma uppdelning men med ett övergripande ansvar av Adam Bengtsson. Arbetet har i så stor utsträckning som möjligt skett gemensamt och vi har därför både bidragit till och tagit del av varandras respektive ansvarsområde. 4 | -------------------------------------------------------------------------------- /haskell.utilities.js: -------------------------------------------------------------------------------- 1 | (function(utilities){ 2 | utilities.expectType = function(o,t) { 3 | if (!(o instanceof t)) { 4 | throw new Error("Expected " + typeof t + " " + typeof o + " given."); 5 | }; 6 | }; 7 | 8 | utilities.expectTypeOf = function(o, t) { 9 | if ((typeof o) != t) { 10 | throw new Error("Expected " + t + ", " + typeof o + " given."); 11 | }; 12 | }; 13 | 14 | utilities.expectTypeArray = function(os, t) { 15 | for (i in os) { 16 | if (!(os[i] instanceof t)) { 17 | throw new Error("Expected " + typeof t + ", " + typeof os[i] + " given at index " + i); 18 | }; 19 | }; 20 | }; 21 | })(haskell.utilities); 22 | 23 | if (!console) { 24 | var console = { 25 | log: function() {} 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /rapport/kapitel/slutsatser.tex: -------------------------------------------------------------------------------- 1 | \section{Slutsatser} 2 | I den här rapporten har vi visat hur vi har implementerat en haskelltolk Javascript. 3 | Vi har implementerat namngivna och anonyma funktioner, algebraiska datatyper och pattern matching. 4 | Vi har dock inte implementerat typklasser, men stöd för det finns i typcheckaren och parsern. 5 | 6 | Vi har beskrivit hur vi med parser combinators har implementerat Haskells layoutregler och grammatik, en typcheckare som kan typchecka Haskell enligt de regler som haskellstandarden föreskriver samt en interpretator som tolkar Haskell med lat evaluering. Slutligen beskriver vi HIJi, ett enkelt användargränssnitt till haskelltolken. 7 | 8 | En rad förbättringsåtgärder har identifierats för att göra tolken mer användbar för nybörjare. Främst handlar det om att göra ett snyggt interaktivt användargränssnitt till HIJi, men även att generera bättre felmeddelanden i parsern. 9 | Totalt sett har projektet visat sig vara lyckat, även om vi är medvetna om att mycket finns kvar att förbättra. 10 | -------------------------------------------------------------------------------- /hiji.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #000000; 3 | } 4 | 5 | .ghci-look * { 6 | margin:0; 7 | padding:0; 8 | font-family:monospace; 9 | font-size: 12px; 10 | } 11 | 12 | .ghci-look { 13 | cursor:text; 14 | } 15 | 16 | .ghci-look ol{ 17 | width:800px; 18 | height:400px; 19 | background-color: #000; 20 | overflow-x:auto; 21 | overflow-y:scroll; 22 | list-style-type:none; 23 | overflow: hidden; 24 | color: #fff; 25 | } 26 | 27 | .ghci-look .input input { 28 | border:0; 29 | display:inline-block; 30 | margin-left:-1px; 31 | background-color: #000; 32 | width : 90%; 33 | color: #fff; 34 | font-size: 12px; 35 | outline: none; 36 | } 37 | 38 | .ghci-look .modules { 39 | display:inline; 40 | } 41 | 42 | .ghci-look .modules li { 43 | display:inline; 44 | padding-right:0.5em; 45 | } 46 | 47 | .ghci-look .modules li:last-child { 48 | padding-right:0; 49 | } 50 | 51 | .ghci-look .modules:after { 52 | content:">"; 53 | padding-right:0.5em; 54 | } 55 | -------------------------------------------------------------------------------- /rapport/kapitel/sammanfattning.tex: -------------------------------------------------------------------------------- 1 | \renewcommand{\abstractname}{Sammanfattning} 2 | 3 | \begin{abstract} 4 | 5 | Haskell är ett programmeringsspråk med en begränsad användarbas. Vår förhoppning är att göra det enklare för programmerare att lära sig Haskell genom att implementera språket i Javascript. På så vis blir det möjligt att köra Haskell i en webbläsare utan att behöva ladda ner en haskellkompilator, som till exempel \emph{Glasgow Haskell Compiler} (GHC). 6 | I den här rapporten beskriver vi vårt arbete och resultat av att implementera Haskell i Javascript. 7 | \\ 8 | \\ 9 | Resultatet består av en parser, typcheckare, interpretator och ett användargränssnitt liknande GHCi. 10 | Parsern tar användarens indata och konverterar den till en intern datastruktur, kallat abstrakt syntaxträd. Typcheckaren analyserar sedan det abstrakta syntaxträdet för att kontrollera att det ej förekommer några typfel. Om inga fel har påträffats så skickas trädet vidare till interpretatorn som tolkar trädet på ett väldefinierat vis. 11 | \\ 12 | \\ 13 | Resultatet visar att det är möjligt att implementera Haskell i Javascript, men det behövs mycket mer arbete för att skapa en nybörjarvänlig miljö att lära sig Haskell i. 14 | 15 | \end{abstract} 16 | -------------------------------------------------------------------------------- /rapport/kapitel/abstract.tex: -------------------------------------------------------------------------------- 1 | \renewcommand{\abstractname}{Abstract} 2 | \begin{abstract} 3 | Haskell is not a widely used programming language, nor very known to the average programmer. By implementing a subset of the Haskell 98 specification in Javascript our intention is to make it possible to run Haskell in a web browser, thus making it easier for beginners to try Haskell by eliminating the need of downloading Haskell compilers such as the Glasgow Haskell Compiler (GHC). 4 | In this paper we describe the process and result from the project of implementing Haskell in Javascript. 5 | \\ 6 | \\ 7 | Our result consists of a parser, type checker, interpreter and a front end similar to GHCi. 8 | The parser processes the text input, creating an internal structure called abstract syntax tree (AST). The type checker then analysis the AST to confirm that there are no type errors. If no errors have been detected, the AST is sent to the interpreter. The interpreter then interprets the AST in a well defined way. 9 | \\ 10 | \\ 11 | The results show that it is possible to successfully implement Haskell in Javascript, but a lot of more work needs to be done for making a beginner-friendly environment for learning Haskell. 12 | 13 | \end{abstract} 14 | -------------------------------------------------------------------------------- /typecheckertests.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 25 | 26 | 39 |27 | 28 | -------------------------------------------------------------------------------- /test.htm: -------------------------------------------------------------------------------- 1 | 3 | 4 |
5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 | 37 | 38 |