Add README
This commit is contained in:
parent
e0946200ea
commit
0718b4c5ca
72
README.md
Normal file
72
README.md
Normal file
|
@ -0,0 +1,72 @@
|
|||
# Cow Description Language (CDL)
|
||||
In times of the pandemic, it's not easy to get real input data from your cows to
|
||||
demonstrate the functionality of your front end. To be able to test some
|
||||
features of the application, we would like to have scripts that
|
||||
insert fake data points into our database, allowing us how our app
|
||||
would behave in real time, without the need to hook up any collars.
|
||||
These scripts would be tedius to write...
|
||||
|
||||
Unless, of course, you have a Domain Specific Language (DSL) for it!
|
||||
Enter CDL. We can describe a cow in a turtle-style imperative language:
|
||||
|
||||
```Haskell
|
||||
squareCow = do
|
||||
move 10
|
||||
turn 90
|
||||
move 10
|
||||
turn 90
|
||||
move 10
|
||||
turn 90
|
||||
move 10
|
||||
```
|
||||
|
||||
This DSL is shallowly embedded into Haskell, which means that we can
|
||||
use all of Haskell's abstraction capabilities:
|
||||
|
||||
```Haskell
|
||||
repeat 0 _ = return ()
|
||||
repeat n thing = do
|
||||
thing
|
||||
repeat (n-1) thing
|
||||
|
||||
squareCow = repeat 4 $ do
|
||||
move 10
|
||||
turn 90
|
||||
```
|
||||
|
||||
Given a sampling frequency, CDL can generate a Python script that
|
||||
inserts data points into our database each "sample":
|
||||
|
||||
```Python
|
||||
from server.fgs.model import *
|
||||
from server.fgs import db
|
||||
import datetime
|
||||
db.session.add(DataPoint(longitude=0.0, latitude=0.0, datetime=datetime.now()))
|
||||
db.session.commit()
|
||||
sleep(0.1)
|
||||
db.session.add(DataPoint(longitude=9.0000094e-7, latitude=0.0, datetime=datetime.now()))
|
||||
db.session.commit()
|
||||
sleep(0.1)
|
||||
db.session.add(DataPoint(longitude=1.8000019e-6, latitude=0.0, datetime=datetime.now()))
|
||||
db.session.commit()
|
||||
sleep(0.1)
|
||||
# ...
|
||||
```
|
||||
|
||||
To generate scripts, load the program into GHCI and execute as follows:
|
||||
```
|
||||
cd src
|
||||
ghci
|
||||
:load Cdl/SampleCows.hs Cdl/Codegen.hs Cdl/Cow.hs
|
||||
:module Cdl.SampleCows Cdl.Codegen Cdl.Cow
|
||||
outputCow "test.py" 0.1 (1, 1, Coord 0 0, squareCow)
|
||||
```
|
||||
|
||||
In `outputCow`, the `0.1` is the sampling frequency (how often
|
||||
the database will receive mock data from the cows), the first `1` is
|
||||
the collar ID sending the data, the second `1` is the cow's walking speed (in meters/second),
|
||||
the `Coord 0 0` is the initial longitude and latitude of the cow, and `squareCow` is
|
||||
the cow's actions described above.
|
||||
|
||||
Note that the script relies on being in the same directory as the `server` repository
|
||||
containing our database model.
|
Loading…
Reference in New Issue
Block a user