Coder Social home page Coder Social logo

diku-canvas's People

Contributors

henglein avatar joshniemela avatar kfl avatar madsobitsoe avatar melsman avatar sporring avatar xatha avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

diku-canvas's Issues

`scale` is undocumented and may do something wrong

The following code is expected to show a white canvas:

let bug =
    let canvas = Canvas.create 120 108
    Canvas.runApp "Opps" 120 108
                  (fun w h _ -> Canvas.scale canvas w h) (fun _ _ -> None) ()

However some garbled data is shown:

image

May be related to #13

Stack Overflow on multiple examples on Windows

@sporring @kfl

We have found that on windows 10/11 certain examples results in stack overflow. Adjusting the drawLines examples to show 100 lines instead of 1000 solves the issue.

Tested examples are: https://github.com/diku-dk/diku-canvas/blob/main/examples/drawLines.fsx

And circles (Slide 9 on 2.4Lecture.pdf):

#r "nuget:DIKU.Canvas, 2.0.0"
open Canvas
open Color
open System
let w = 400
let R = 100.0
let c = 200.0
let point R c0 c1 t =
    let s = t*System.Math.PI/180.0
    (c0+R*cos s, c1+R*sin s)
let rec makeCircle p0 t1 =
    if t1 <= 360.0 then
        let p1 = point R c c t1
        let line = piecewiseAffine blue 1.0 [p0;p1]
        let line2 = (makeCircle p1 (t1+0.1))
        onto line line2
    else
        emptyTree
let draw =
    let p0 = point R c c 0.0
    let tree = makeCircle p0 0.1
    make tree
render "Circle" w w draw

Error message from Windows 10:

Stack overflow.
   at SixLabors.ImageSharp.Drawing.Processing.SolidBrush..ctor(SixLabors.ImageSharp.Color)      
   at SixLabors.ImageSharp.Drawing.Processing.SolidPen..ctor(SixLabors.ImageSharp.Color, Single)
   at SixLabors.ImageSharp.Drawing.Processing.Pens.Solid(SixLabors.ImageSharp.Color, Single)    
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.compile(Int32, Boolean, PrimitiveTree)
   at Canvas.make(PrimitiveTree)
   at <StartupCode$FSI_0002>.$FSI_0002.main@()
   at System.RuntimeMethodHandle.InvokeMethod(System.Object, Void**, System.Signature, Boolean)
   at System.Reflection.MethodInvoker.Invoke(System.Object, IntPtr*, System.Reflection.BindingFlags)
   at System.Reflection.RuntimeMethodInfo.Invoke(System.Object, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object[], System.Globalization.CultureInfo)
   at System.RuntimeType.InvokeMember(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object, System.Object[], System.Reflection.ParameterModifier[], System.Globalization.CultureInfo, System.String[])
   at System.Type.InvokeMember(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Object, System.Object[], System.Globalization.CultureInfo)
   at [email protected](Microsoft.FSharp.Core.Unit)
   at FSharp.Compiler.Interactive.Shell.arg10@2041(FsiDynamicCompiler, DiagnosticsLogger, Microsoft.FSharp.Core.FSharpRef`1<Microsoft.FSharp.Collections.FSharpList`1<Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Core.Unit,Microsoft.FSharp.Core.FSharpOption`1<System.Exception>>>>, Microsoft.FSharp.Core.Unit)
   at FSharp.Compiler.Interactive.Shell+FsiDynamicCompiler.ProcessCodegenResults(Internal.Utilities.Library.CompilationThreadToken, DiagnosticsLogger, FsiDynamicCompilerState, IncrementalOptimizationEnv, TcState, TcConfig, Microsoft.FSharp.Collections.FSharpList`1<FSharp.Compiler.Syntax.Ident>, Boolean, Boolean, System.String, Microsoft.FSharp.Collections.FSharpList`1<CheckedImplFile>, IlxAssemblyGenerator, IlxGenResults, FSharp.Compiler.Text.Range)
   at FSharp.Compiler.Interactive.Shell+FsiDynamicCompiler.ProcessInputs(Internal.Utilities.Library.CompilationThreadToken, DiagnosticsLogger, FsiDynamicCompilerState, Microsoft.FSharp.Collections.FSharpList`1<FSharp.Compiler.Syntax.ParsedInput>, Boolean, Boolean, Boolean, Microsoft.FSharp.Collections.FSharpList`1<FSharp.Compiler.Syntax.Ident>, FSharp.Compiler.Text.Range)
   at FSharp.Compiler.Interactive.Shell+FsiDynamicCompiler.EvalParsedDefinitions(Internal.Utilities.Library.CompilationThreadToken, DiagnosticsLogger, FsiDynamicCompilerState, Boolean, 
Boolean, Microsoft.FSharp.Collections.FSharpList`1<FSharp.Compiler.Syntax.SynModuleDecl>)
   at FSharp.Compiler.Interactive.Shell.loop@3847-108(FsiInteractionProcessor, DiagnosticsLogger, Internal.Utilities.Library.CompilationThreadToken, FsiDynamicCompilerState, InteractionGroup)
   at System.Runtime.CompilerServices.RuntimeHelpers.DispatchTailCalls(IntPtr, Void (IntPtr, Byte ByRef, System.Runtime.CompilerServices.PortableTailCallFrame*), Byte ByRef)
   at [email protected](FsiDynamicCompilerState)
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.InteractiveCatch[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](DiagnosticsLogger, Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,System.Tuple`2<System.__Canon,FsiInteractionStepStatus>>, System.__Canon)
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.ExecuteParsedInteractionInGroups(Internal.Utilities.Library.CompilationThreadToken, FsiDynamicCompilerState, Microsoft.FSharp.Core.FSharpOption`1<FSharp.Compiler.Syntax.ParsedScriptInteraction>, DiagnosticsLogger, Microsoft.FSharp.Core.FSharpOption`1<FsiValue>, System.Threading.CancellationToken)
   at System.Runtime.CompilerServices.RuntimeHelpers.DispatchTailCalls(IntPtr, Void (IntPtr, Byte ByRef, System.Runtime.CompilerServices.PortableTailCallFrame*), Byte ByRef)
   at [email protected](Microsoft.FSharp.Core.FSharpOption`1<FsiValue>, FsiDynamicCompilerState)
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.ExecuteParsedInteraction(Internal.Utilities.Library.CompilationThreadToken, FsiDynamicCompilerState, Microsoft.FSharp.Core.FSharpOption`1<FSharp.Compiler.Syntax.ParsedScriptInteraction>, DiagnosticsLogger, Microsoft.FSharp.Core.FSharpOption`1<FsiValue>, System.Threading.CancellationToken)
   at System.Runtime.CompilerServices.RuntimeHelpers.DispatchTailCalls(IntPtr, Void (IntPtr, Byte ByRef, System.Runtime.CompilerServices.PortableTailCallFrame*), Byte ByRef)
   at [email protected](Internal.Utilities.Library.CompilationThreadToken, FsiDynamicCompilerState)
   at FSharp.Compiler.Interactive.Shell+clo@4017-584[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]].Invoke()
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.mainThreadProcessAction[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e],[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](System.__Canon, Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,System.Tuple`2<System.__Canon,FsiInteractionStepStatus>>>, System.__Canon)
   at [email protected](Internal.Utilities.Library.CompilationThreadToken, FsiDynamicCompilerState)
   at FSharp.Compiler.Interactive.Shell+ParseAndExecuteInteractionFromLexbuf@4112.Invoke(FsiDynamicCompilerState)
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.InteractiveCatch[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](DiagnosticsLogger, Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,System.Tuple`2<System.__Canon,FsiInteractionStepStatus>>, System.__Canon)
   at FSharp.Compiler.Interactive.Shell.run@4154-1(FsiInteractionProcessor, DiagnosticsLogger, Internal.Utilities.Library.CompilationThreadToken, LexFilter, FsiDynamicCompilerState)    
   at [email protected](Microsoft.FSharp.Core.Unit)
   at FSharp.Compiler.Interactive.Shell.WithImplicitHome[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](TcConfigBuilder, System.String, Microsoft.FSharp.Core.FSharpFunc`2<Microsoft.FSharp.Core.Unit,System.__Canon>)
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.EvalIncludedScript(Internal.Utilities.Library.CompilationThreadToken, FsiDynamicCompilerState, System.String, FSharp.Compiler.Text.Range, DiagnosticsLogger)
   at [email protected](FsiDynamicCompilerState)
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.InteractiveCatch[[System.__Canon, System.Private.CoreLib, Version=7.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]](DiagnosticsLogger, Microsoft.FSharp.Core.FSharpFunc`2<System.__Canon,System.Tuple`2<System.__Canon,FsiInteractionStepStatus>>, System.__Canon)
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.EvalIncludedScripts(Internal.Utilities.Library.CompilationThreadToken, FsiDynamicCompilerState, Microsoft.FSharp.Collections.FSharpList`1<System.String>, DiagnosticsLogger)
   at FSharp.Compiler.Interactive.Shell.consume@4178-1(FsiInteractionProcessor, DiagnosticsLogger, Internal.Utilities.Library.CompilationThreadToken, FsiDynamicCompilerState, Microsoft.FSharp.Collections.FSharpList`1<System.Tuple`2<System.String,Boolean>>)
   at FSharp.Compiler.Interactive.Shell+FsiInteractionProcessor.LoadInitialFiles(Internal.Utilities.Library.CompilationThreadToken, DiagnosticsLogger)
   at FSharp.Compiler.Interactive.Shell+FsiEvaluationSession.Run()
   at Sample.FSharp.Compiler.Interactive.Main.evaluateSession(System.String[])
   at Sample.FSharp.Compiler.Interactive.Main.MainMain(System.String[])

Events only fire for one button at a time

@kfl

Executing interact and holding down any button will repeatedly fire KeyPress events for that button. If a second button is pressed at the same time then KeyPress events for the second button will fire repeatedly, however KeyPress events for the first button will stop.

E.g. holding down first DownArrow then UpArrow at the same time will result in the following events firing:

...
DownArrow
DownArrow
DownArrow
DownArrow
DownArrow
UpArrow
UpArrow
UpArrow
UpArrow
UpArrow
...

When these events should supposedly be firing:

...
DownArrow
DownArrow
DownArrow
DownArrow
DownArrow
UpArrow
DownArrow
UpArrow
DownArrow
UpArrow
DownArrow
UpArrow
DownArrow
UpArrow
...

Demonstrative snippet:

#r "nuget:DIKU.Canvas, 2.0"
open Canvas
open Color

let tree = ellipse darkCyan 2.0 85.0 64.0 |> translate 128.0 128.0
let draw _ = make tree
let react _ e = printfn "%A" e; None
interact "Render an image" 256 256 (Some 1000) draw react 0

API for drawing round shapes

There is no way to draw round/curvy shapes.

For circular shapes:

val strokeArc : canvas -> color -> (x:int, y:int) -> (radius:int) -> (startAngle:int) -> (endAngle:int) -> unit
val fillArc : canvas -> color -> (x:int, y:int) -> (radius:int) -> (startAngle:int) -> (endAngle:int) -> unit

For a circular arc with color color centered at (x, y) with a radius of radius. The path starts at startAngle, ends at endAngle, and travels in clockwise direction, angles are given in radians. Thus, to draw a full blue circle (moon) at position (42, 69) with a radius of 20:

fillArc canvas blue (42,69) 20 0 (2 * int(2.0 * System.Math.PI))

Similar for elliptical shapes:

val strokeEllipse : canvas -> color -> (x, y) -> radiusX -> radiusY -> rotation -> startAngle -> endAngle -> unit
val fillEllipse : canvas -> color -> (x, y) -> radiusX -> radiusY -> rotation -> startAngle -> endAngle -> unit

For an elliptical arc centred at (x, y) with the radii radiusX and radiusY. Starts at startAngle and ends at endAngle, and travels in clockwise direction.

Add support for window titles

#7 adds support for window titles.

There might be problems with Windows, since the title is currently marshalled as a utf-8 string (required by SDL), but who knows what a windows user will come up with.

(If I recall correctly, UTF16-LE is the internal encoding used in dotnet on all platforms).

Add support for time based animations

This is a feature request and not at all urgent.

Request
Add support for animations, i.e. a sequence of draw events that will execute in a fixed time-step

Problems
The current structure is:

  1. Enter our recursive drawLoop() function
  2. Draw a new canvas by calling the draw function with the "old" state
  3. Wait indefinitely for an SDL_KeyboardEvent. If one happens that doesn't cause an error, is a of type SDL_KEYDOWN and not the escape-key being pressed:
    1. convert the key to one of our internal representations
    2. Call react to update the state
  4. Call drawLoop() recursively

Not so easy fix
It should be possible to write a state: 's that incorporates a small state-machine.
example:

type State = Waiting of 'a | Drawing of 'a * int

let draw w h s = 
    let bmp = Canvas.create w h
    match s with
       | Drawing (s, framesLeft) -> 
           // somehow update the state based on the last state
           // update the state. (Can we? If it is a ref, we should be able to)
       | Waiting (s) -> // "Normal" draw stuff

It is not pretty to do state-updates in both the react function and the draw function, but I think it would require no or minimal changes to the library.
The hard part of this is:

  • To match this up with frames, since we only draw on new SDL-events.
  • Re-triggering a "fake" SDL-keyevent so we can redraw.

Hard fix
Rewrite the API, so it becomes frame based instead of reactive - i.e. just do things the SDL/GameEngine way.
I believe this would require major changes to the Canvas-API and, although nice, is probably not what Jon wants for the library wrt. the PoP-course.

Type restructuring?

When reading through the code I notice that most of the functions use int * int types everywhere whilst a point type is defined down near "interp", is there a reason not to change this and make the code more readable?

SDL2 not found on ubuntu 20.04 with dotnet-sdk installed from snap

When running dotnet fsi someFile.fsx on ubuntu 20.04 with dotnet-sdk installed via snap, SDL2 is not found. Neither the shipped SDL2.so or a user-installed SDL2, through libsdl2-dev.

The problem seems to be related to ld not finding GLIBC. The system were the issue was discovered has glibc-2.35, confirmed by ldd --version.

An abbreviated output from LD_DEBUG=libs dotnet fis someFile.fsx is seen below:

> grep SDL2 lddebug\ \(1\).log
     50390:	find library=SDL2.so [0]; searching
     50390:	  trying file=/snap/dotnet-sdk/177/shared/Microsoft.NETCore.App/6.0.8/../../../lib/x86_64-linux-gnu/SDL2.so
     50390:	  trying file=/snap/dotnet-sdk/177/shared/Microsoft.NETCore.App/6.0.8/../../../usr/lib/x86_64-linux-gnu/SDL2.so
     50390:	  trying file=/snap/dotnet-sdk/177/usr/lib/x86_64-linux-gnu/SDL2.so
     50390:	  trying file=/snap/dotnet-sdk/177/lib/x86_64-linux-gnu/SDL2.so
     50390:	  trying file=/lib/x86_64-linux-gnu/SDL2.so
     50390:	  trying file=/usr/lib/x86_64-linux-gnu/SDL2.so
     50390:	  trying file=/lib/SDL2.so
     50390:	  trying file=/usr/lib/SDL2.so
     50390:	find library=libSDL2.so [0]; searching
     50390:	  trying file=/snap/dotnet-sdk/177/shared/Microsoft.NETCore.App/6.0.8/../../../lib/x86_64-linux-gnu/libSDL2.so
     50390:	  trying file=/snap/dotnet-sdk/177/shared/Microsoft.NETCore.App/6.0.8/../../../usr/lib/x86_64-linux-gnu/libSDL2.so
     50390:	  trying file=/snap/dotnet-sdk/177/usr/lib/x86_64-linux-gnu/libSDL2.so
     50390:	  trying file=/snap/dotnet-sdk/177/lib/x86_64-linux-gnu/libSDL2.so
     50390:	  trying file=/lib/x86_64-linux-gnu/libSDL2.so
     50390:	/snap/dotnet-sdk/177/lib/x86_64-linux-gnu/libm.so.6: error: version lookup error: version `GLIBC_2.29' not found (required by /lib/x86_64-linux-gnu/libSDL2.so) (fatal)
     50390:	find library=SDL2 [0]; searching
     50390:	  trying file=/snap/dotnet-sdk/177/shared/Microsoft.NETCore.App/6.0.8/../../../lib/x86_64-linux-gnu/SDL2
     50390:	  trying file=/snap/dotnet-sdk/177/shared/Microsoft.NETCore.App/6.0.8/../../../usr/lib/x86_64-linux-gnu/SDL2
     50390:	  trying file=/snap/dotnet-sdk/177/usr/lib/x86_64-linux-gnu/SDL2
     50390:	  trying file=/snap/dotnet-sdk/177/lib/x86_64-linux-gnu/SDL2
     50390:	  trying file=/lib/x86_64-linux-gnu/SDL2
     50390:	  trying file=/usr/lib/x86_64-linux-gnu/SDL2
     50390:	  trying file=/lib/SDL2
     50390:	  trying file=/usr/lib/SDL2
     50390:	find library=libSDL2 [0]; searching
     50390:	  trying file=/snap/dotnet-sdk/177/shared/Microsoft.NETCore.App/6.0.8/../../../lib/x86_64-linux-gnu/libSDL2
     50390:	  trying file=/snap/dotnet-sdk/177/shared/Microsoft.NETCore.App/6.0.8/../../../usr/lib/x86_64-linux-gnu/libSDL2
     50390:	  trying file=/snap/dotnet-sdk/177/usr/lib/x86_64-linux-gnu/libSDL2
     50390:	  trying file=/snap/dotnet-sdk/177/lib/x86_64-linux-gnu/libSDL2
     50390:	  trying file=/lib/x86_64-linux-gnu/libSDL2
     50390:	  trying file=/usr/lib/x86_64-linux-gnu/libSDL2
     50390:	  trying file=/lib/libSDL2
     50390:	  trying file=/usr/lib/libSDL2
     50390:	/snap/dotnet-sdk/177/lib/x86_64-linux-gnu/libc.so.6: error: version lookup error: version `GLIBC_2.33' not found (required by /home/peter/.nuget/packages/diku.canvas/1.0.0/runtimes/linux-x64/native/libSDL2.so) (fatal)
System.DllNotFoundException: Unable to load shared library 'SDL2' or one of its dependencies. In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: libSDL2: cannot open shared object file: No such file or directory

Add support for mouse events

Adding support for mouse events does not seem too complicated and would greatly increase the possibilities for "reactive programming" - one of the things we "lost" when WinForms-support was removed from Mono.

The SDL_MouseButtonEvent looks a lot like the key-event (at least complexity-wise).

https://wiki.libsdl.org/SDL_MouseButtonEvent

// Edit
Having looked a bit into it, "not too complicated" is an understatement.

Currently we define the SDL_KeyboardEvent struct, and assume all events are keyboard-events (or that we only need the event type).
To handle SDL_MouseButtonEvent as well, (I think) we need to implement support for SDL_Event, a union of event-structs.
Since the SDL_KeyboardEvent and SDL_MouseButtonEvent structs have overlapping fields, they are hard to convert to managed code. I am not experienced enough with PInvoke/Interop-stuff to see a good solution to this.

I guess it might be possible to marshall all events into a byte array of fixed size and construct the managed objects we need manually.

Fix bundling of SDL2_image

Currently saving a canvas to png works in these cases:

  • Windows
  • Linux/Mac, if the user has SDL2.{so,dylib} in the search path(s) used by ld/dyld.

SDL2_image attempts to load SDL2 but can not find the bundled SDL2.{so,dylib}.

My best proposed fix, which will also solve other problems (and bring more, yay!):

New problems:

  • We have to build SDL2_image ourselves, for at least 3 platforms
    New benefits:
  • We can remove all the unneeded dependencies such as jxl-support

Mac

  1. Build a custom SDL2_image.dylib either as a fat lib or as two separate libs for x64 and arm64.
  2. Either:
    2a. Use install_name_tool to edit RPATH of the library.
    2b. Give up on life, learn CMAKE and set the RPATH correctly when building the library.

Linux

  1. Build a custom SDL2_image.so.
  2. Use e.g. patchelf to change the RPATH.

Better image API

Currently there is no easy way to work with multiple images. For instance, sprites in a game.

I think we need a separate Image type and support API, perhaps something like:

type Image

val dimensions : Image -> {width : int; height : int}
val loadImage : string -> Image
val saveImage : Image -> string -> unit
val drawImage : canvas -> Image -> (int*int) -> unit
val toImage : canvas -> Image

piecewiseAffine function crashes when all elements in list are equal

Calling the piecewiseAffine function such that it would draw no line crashes the program.
The issue only appears when all elements in the list are equal.
Calling piecewiseAffine white 1 [(0,0);(0,0);(0,0)] will crash, but piecewiseAffine white 1 [(0,0);(0,0);(0,1)] will not.

Problem occurs if the react function evaluates slower than the rate of events

When giving the interact function a react function that is slower to evaluate than the time it takes for a new event to appear, new events flood the queue, meaning that the evaluation of new events get further and further behind.

The problem is also dependent on the speed of the system, e.g. some systems won't experience it while slower ones might.

An example would be the 10g reference solution: https://github.com/diku-dk/PoP/blob/main/referenceSolutions/2023/10g/AsteroidApp.fs

The behaviour of `runApp` with wrong sized canvas is strange

If the draw argument for runApp returns a canvas that's to small or to big wrt the given arguments, the result is strange.

For instance, the following program:

#r "nuget:DIKU.Canvas, 1.0.0"

let bug =
    Canvas.runApp "Opps" 42 69
                  (fun _ _ _ -> Canvas.create 420 4220) (fun _ _ -> None) ()

Will give an System.ArgumentException: Destination array was not long enough error.

Likewise, the following program:

#r "nuget:DIKU.Canvas, 1.0.0"

let bug =
    let apple = Canvas.fromFile "apple.jpg"
    Canvas.runApp "Oh no" (Canvas.height apple) (Canvas.width apple) // width and height is swapped
                  (fun _ _ _ -> apple) (fun _ _ -> None) ()

Where the width and height arguments to runApp are swapped, results in garbled output.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.