diff --git a/site/writings/unhappy/MEME0.PNG b/site/writings/unhappy/MEME0.PNG new file mode 100644 index 0000000..6cfc9ec Binary files /dev/null and b/site/writings/unhappy/MEME0.PNG differ diff --git a/site/writings/unhappy/MEME1.PNG b/site/writings/unhappy/MEME1.PNG new file mode 100644 index 0000000..0f473c7 Binary files /dev/null and b/site/writings/unhappy/MEME1.PNG differ diff --git a/site/writings/unhappy/MEME2.PNG b/site/writings/unhappy/MEME2.PNG new file mode 100644 index 0000000..722a990 Binary files /dev/null and b/site/writings/unhappy/MEME2.PNG differ diff --git a/site/writings/unhappy/MEME3.PNG b/site/writings/unhappy/MEME3.PNG new file mode 100644 index 0000000..d25256a Binary files /dev/null and b/site/writings/unhappy/MEME3.PNG differ diff --git a/site/writings/unhappy/MEME4.PNG b/site/writings/unhappy/MEME4.PNG new file mode 100644 index 0000000..5291c73 Binary files /dev/null and b/site/writings/unhappy/MEME4.PNG differ diff --git a/site/writings/unhappy/MEME5.PNG b/site/writings/unhappy/MEME5.PNG new file mode 100644 index 0000000..2d88fcc Binary files /dev/null and b/site/writings/unhappy/MEME5.PNG differ diff --git a/site/writings/unhappy/MEME6.PNG b/site/writings/unhappy/MEME6.PNG new file mode 100644 index 0000000..664c77b Binary files /dev/null and b/site/writings/unhappy/MEME6.PNG differ diff --git a/site/writings/unhappy/MEME7.PNG b/site/writings/unhappy/MEME7.PNG new file mode 100644 index 0000000..43e9604 Binary files /dev/null and b/site/writings/unhappy/MEME7.PNG differ diff --git a/site/writings/unhappy/MEME8.PNG b/site/writings/unhappy/MEME8.PNG new file mode 100644 index 0000000..144d50b Binary files /dev/null and b/site/writings/unhappy/MEME8.PNG differ diff --git a/site/writings/unhappy/MEME9.PNG b/site/writings/unhappy/MEME9.PNG new file mode 100644 index 0000000..7350bb7 Binary files /dev/null and b/site/writings/unhappy/MEME9.PNG differ diff --git a/site/writings/unhappy/UNHAPPY.PNG b/site/writings/unhappy/UNHAPPY.PNG new file mode 100644 index 0000000..8956074 Binary files /dev/null and b/site/writings/unhappy/UNHAPPY.PNG differ diff --git a/site/writings/unhappy/index.org b/site/writings/unhappy/index.org new file mode 100644 index 0000000..d9b34ad --- /dev/null +++ b/site/writings/unhappy/index.org @@ -0,0 +1,256 @@ +#+title: Unhappy About Happy: A Reflection or Something Like That +#&summary +Rant about Haskell's parser "Happy". +#& +#+license: wtfpl +#+startup: showall +#&toc + +#&img;url=UNHAPPY.PNG,float=right + +* Unhappy About Happy: A Reflection or Something Like That + +For the purposes of my quiet rage, this document will be written in all caps. +I also will not use proper language. I won't even give suggestions on how to +improve Happy; I'll just complain. + +STARTING NOW + + +** WHAT HAPPY ??? + +HAPPY IS PARSER GENERATOR. IT GENERATE HASKELL CODE. VISIT +[[http://www.haskell.org/happy/][HTTP://WWW.HASKELL.ORG/HAPPY/]] FOR UGLY INFO. + + +** HOW HAPPY GOOD + ++ EFFICIENT I GUESS ++ WORKS OK ++ PRETTY LOGO + + +** WHY I NOT LIKE HAPPY + +*** JUZT TYPICAL + +#+caption: ONE REASON. TRUST NOT BUSH WITH HAPPY +#&img;url=MEME0.PNG,float=center + +ONE ERROR IN PARSER.Y GIVE HUGE TYPE ERROR + +*WHAT IS THIS!* + + +#+BEGIN_SRC +dist/build/l0c/l0c-tmp/Language/L0/Parser/Parser.hs:2452:42: + Couldn't match type `Value' with `BasicValue -> Value' + Expected type: HappyAbsSyn + (Name, SrcLoc) + [(Name, + DeclTypeBase Name, + [ParamBase Name], + ExpBase NoInfo Name, + SrcLoc)] + (Name, + DeclTypeBase Name, + [ParamBase Name], + ExpBase NoInfo Name, + SrcLoc) + Uniqueness + ([Maybe (DimSize Name)], ElemTypeBase NoInfo Name) + (ElemTypeBase NoInfo Name) + [TypeBase NoInfo Name] + [TypeBase NoInfo Name] + [ParamBase Name] + (Maybe (CertificatesBase NoInfo Name), [ExpBase NoInfo Name]) + [ExpBase NoInfo Name] + [ExpBase NoInfo Name] +/* ... 200-300 MORE LINES ... */ + [TupIdentBase NoInfo Name] + (TupIdentBase NoInfo Name) + (LambdaBase NoInfo Name) + (TupleLambdaBase NoInfo Name) + (BasicValue -> Value) + Int + (BasicValue -> Value) + (BasicValue -> Value) + (BasicValue -> Value) + (BasicValue -> Value) + (BasicValue -> Value) + Value + (BasicValue -> Value) + (BasicValue -> Value) + [Value] + [Value] + In the second argument of `happySpecReduce_3', namely + `happyReduction_191' + In the expression: happySpecReduce_3 38# happyReduction_191 + In an equation for `happyReduce_191': + happyReduce_191 = happySpecReduce_3 38# happyReduction_191 +#+END_SRC + +*NOT NICE NOT NICE AT ALL* + + +*** MONADA CAN I HAZ + +MAYHAPS U NEED TO PARSE DIFFERENT THAN NORMAL KAY. HOW U THINK. YES: +MENTALINCRMENTAL PARSING IT IS + +#+caption: TWO REASON (I UNGOOD TO MEMES) +#&img;url=MEME1.PNG,float=center + +YOU GOT NEED TO PARSE IO GETLINE SOURCES YEAH + +PARSE EXPRESSION "2 + 1 *4" OVER MULTI LINES LIKE THIS HERE + +#+BEGIN_SRC +WELCOM TO DA FUNKY MULTILINE EXPRESSION PARSER; ENTER UR EXPRESSION +> 2 + +1 *4 +TY GOT IT!! PARSED EXPRESSION IS "2 + 1 * 4" AND U NICE; RESULT IS 6 BTW +> +#+END_SRC + +PARSER SHOULD KNOW "YEAH NOT DUHNE PARSIN YET" WHEN "2 +" READ, SHOULD TEHN +READ NEW LINE AND PARSE MORE! + +WE CAN PARSE FROM BEGINNING EVERY TIME SURE BUT INEFECICIENT!!! + +#+caption: WE NOT WANT TIS SAYS PICARD 8-) +#&img;url=MEME2.PNG,float=center + +BUT HOW WE SHOULD / COULD DO THAT SMARTLY I IMPLORE TO LIKE ASK U + +#+caption: CLEVER GILES HAS OUR SOLUTION!!!!! +#&img;url=MEME3.PNG,float=center + +YES WE USE CONTINUATION WHICH SMART. LOOK ATTOPARSEC USE CONTINUATION IN +RETURN! +[[http://hackage.haskell.org/package/attoparsec-0.11.1.0/docs/Data-Attoparsec-Text.html#t:IResult][HTTP://HACKAGE.HASKELL.ORG/PACKAGE/ATTOPARSEC-0.11.1.0/DOCS/DATA-ATTOPARSEC-TEXT.HTML#T:IRESULT]] + +YEAH BUT NOT IN HAPPY............ + +SO WE MAKE IT MANUAL. WE SPECIFY OWN LEXER AND IMPROVE MONAD. WHEN END OF +LINE IS REACH, WE TELL PARSER (FROM INSIDE DA PRASER) DAT DERE IS NO MORE EVER; +IF THAT FAILS WE CATCH ERROR (EITHER-LIKE MONAD) AND READ NEW LINE FOR REALS + +#+caption: AS MANY LINES AS LE POSSIBLÉ +#&img;url=MEME4.PNG,float=center + +CLEVER SOLUTION OF US! BUT IN PARSE EXPRESION EXAMPLE ABOV WE USE IO TO GETLINE + +*WE NOT WANT IO IN ALL PARSING.... EVER EVER!!!!!!!!* + +HOWTO ABSTRACT IO AWAY? WE WANT TYPE OF EXPORTED FUNCTIONS FROM PARSER TO NOT +USE _IO_ /AT ALL/ + +#+caption: YAEH BABBY +#&img;url=MEME5.PNG,float=center + +SO WE USE WHATEVER MONAD TO GETLINE RIGHT? + +#+BEGIN_SRC haskell +class GetLiner m where -- KAY SO m IS MONAD RIGHT + getSomeLine :: m String + +instance GetLiner IO where + getSomeLine = getLine +#+END_SRC + +WAIT I DONT GET IT + +#+BEGIN_SRC haskell +CLASS GETLINER M WHERE -- KAY SO M IS MONAD RIGHT + GETSOMELINE :: M STRING + +INSTANCE GETLINER IO WHERE + GETSOMELINE = GETLINE +#+END_SRC + +MUCH BETTR. COZ TEHN WE CAN USE + +#+caption: ... THEN WAT. Y U SO SLACK +#&img;url=MEME6.PNG,float=center + +BUT YIAH WE COULD USE TYPE CONSTRAINTS! + +#+BEGIN_SRC haskell +LEXER :: GETLINER M => M SOMETHNIG +LEXER = MEHMEHMEH + WOO <- GETSOMELINE + MEH MEH +#+END_SRC + +SURE COULD WORK WE NEED JUST TELL HAPPY BOUT IT. + +#+BEGIN_SRC +%MONAD { GETLINER M => SOMETHINNG M } +#+END_SRC + +FAILS MISERBLY.................... :-( :( :( + +WE ARE LEFT 4 PONDER HOW TO SOLVE! HOWTO ABSTRAKT OUT IO! HOW!! + +#+caption: TRANCEND CONVENTIONAL COMPUTATIN U CAPITALIS PIG +#&img;url=MEME7.PNG,float=center + +SOOOO..... WE NEED KINDA CONTINUATIN COMPUTATON MONADY THINGY. I GOT FRIEND +WHO COME WIT CODE, SAY IT GOOD CODE. I CHECK, HE RIGHT! IS HERE + +#+BEGIN_SRC haskell +DATA READLINEMONAD A = VALUE A + | GETLINE (STRING -> READLINEMONAD A) + +INSTANCE MONAD READLINEMONAD WHERE + RETURN = VALUE + VALUE X >>= F = F X + GETLINE G >>= F = GETLINE $ \S -> G S >>= F +#+END_SRC + +HA CLEVER!!! NOW WE NEED NO TYPE CONSTRAINTS BECAUSE NOW COMPUTATION IS MONAD +ITSELF! HOW YOU ASK. + +READLINEMONAD HAS NO IO OR ANY ELSE BUILTIN; IT GETS LINE BY CREATE FUNCTION +WHICH TAKES LINE TO CONTINUU EXECUTION. AGAIN AND AGAIN! LINE CAN COME FROM +ANYTHIN. + +EXAMPLE FOR USING RESULT! +#+BEGIN_SRC haskell +GETLINESFROMIO :: READLINEMONAD A -> IO A +GETLINESFROMIO (VALUE X) = RETURN X +GETLINESFROMIO (GETLINE F) = DO + S <- GETLINE + GETLINESFROMIO $ F S +#+END_SRC + +U SEE WAT GOIN ON DERE! IN OUR LEXER WE NAMELI USED +#+BEGIN_SRC haskell +GETLINE VALUE +#+END_SRC + +TO GET LINE (BECAUSE FITS WITH CLEVER MONAD!) + +*NICE-O!* + + +** CODE IN QUSTION + +LOOKIE HER FOR FULL DETAILS (ALTHOU WITH NO FULL CAPS): +[[https://raw.github.com/HIPERFIT/L0Language/master/src/Language/L0/Parser/Parser.y][HTTPS://RARRW.GITHUB.COM/HIPERFIT/L0LANGUAGE/MASTER/SRC/LANGUAGE/L0/PARSER/PARSER.Y]] + + +** CONCLUSION + +#+caption: TRU STORY +#&img;url=MEME8.PNG,float=center + +#+caption: NOT ME +#&img;url=MEME9.PNG,float=center + +THIS IS ENTRELY OBJECTIVE. + +THIS IS ENTIREY OBJECTIVE. + +THIS IS ENTIRLY OBJECTIVE.