Add presentation
This commit is contained in:
parent
0fcc2dbf6c
commit
04253ffef8
53
doc/presentation.org
Normal file
53
doc/presentation.org
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
* Introduction
|
||||||
|
Write a static analyzer for ruby.
|
||||||
|
|
||||||
|
Used an existing parser for ruby called `ruby-parse`.
|
||||||
|
|
||||||
|
`ruby-parse` can generate an AST in JSON format.
|
||||||
|
|
||||||
|
This made the task of writing a ruby parser simpler: Haskell comes
|
||||||
|
with a great JSON parser. So we just have to specify how to convert
|
||||||
|
from the AST defined by `ruby-parse` to our own AST.
|
||||||
|
|
||||||
|
* Implementation
|
||||||
|
** ADTs
|
||||||
|
*** Purpose
|
||||||
|
Defining an Abstract Syntax Tree (AST) for Ruby using Algebraic Data
|
||||||
|
Types (ADTs).
|
||||||
|
|
||||||
|
*** Example
|
||||||
|
-- Value represents any JSON data (object, string, number, null, array)
|
||||||
|
Args = Value
|
||||||
|
Name = Value
|
||||||
|
Block = [Definition]
|
||||||
|
Definition = Module | Function | Send
|
||||||
|
Namespace = [Name]
|
||||||
|
Send = {args : Args, namespace : Namespace, name :: Name}
|
||||||
|
Module = {name : Name, block : Block}
|
||||||
|
Function = {name : Name, args : Args, block :: Block}
|
||||||
|
|
||||||
|
*** Live coding
|
||||||
|
|
||||||
|
Define `Function`
|
||||||
|
** Higher-order types
|
||||||
|
Missing a good example here.
|
||||||
|
|
||||||
|
** Type classes
|
||||||
|
*** Purpose
|
||||||
|
Be able to concert unstructured JSON data into our ADT.
|
||||||
|
|
||||||
|
*** Example
|
||||||
|
Consider the class
|
||||||
|
|
||||||
|
class FromJSON a where
|
||||||
|
parseJSON :: Value -> Parser a
|
||||||
|
|
||||||
|
It's saying that `a` is convertible from json if there is a function
|
||||||
|
`parseJSON` that takes a (json) `Value` and returns a `Parser a`.
|
||||||
|
`Parser a` can be thought of as a procedure for generating a value of
|
||||||
|
type `a`.
|
||||||
|
|
||||||
|
So for instance. The monomorphic type `Parser Function` is a
|
||||||
|
procedure that generates a value of type `Function`:
|
||||||
|
*** Live coding
|
||||||
|
Define an instance for `FromJSON` for `Function`.
|
Loading…
Reference in a new issue