Code Monkey home page Code Monkey logo

slap's Introduction

The SLAP Programming Language

| Doc |

Ubuntu macOS Windows

WARNING!! THIS LANGUAGE IS IN DEVELOPMENT (AND FOR LEARNING PURPOSES). ANYTHING CAN CHANGE AT ANY MOMENT.

๐Ÿ– SLAP stands for "SLow And Powerless." And I hope to make it "Powerful" someday.

SLAP is a dynamically- and strongly-typed, object-oriented programming language. Its syntax is a member of the C family with a bit of difference.

Example

As of March 2022, you can write pretty decent, small programs in SLAP.

Note: The SLAP-to-JS transpiler is in progress (see compiler branch).

SLAP-to-JS Compiler Example
Screen.Recording.2022-04-07.at.11.41.19.PM.mov

Installation

On Linux/macOS, you may be able to run the following commands to install SLAP.

$ git clone https://github.com/bichanna/slap.git
$ cd slap
$ chmod +x ./build.sh 
$ ./build.sh         # The SLAP Vim highlighter automatically gets installed

For Windows, I haven't written bat version of build.sh, so you have to manually compile the source code.

$ nimble build --multimethods:on -d:release

Then, mark it as an executable file if necessary, and try running slap --version.

$ slap --version
SLAP 0.0.3

You may want to test current SLAP you just built before running your programs.

$ nimble test

TODO

Note: If you have a feature request, please open an issue.

Main

  • Basic Data Types
    • Integer
    • Float
    • String
    • Boolean
    • Null
    • List
    • Map
  • Basic Arithmetics
  • Variables
  • If Statements
    • elif
    • else
  • While Loops
  • For Loops
    • Break
    • Continue
    • "Enhanced" for loop (in the form of forEach)
  • Try-except Blocks
  • Functions
    • Lambdas (anonymous functions)
    • Default Arguments
    • Rest Parameters
  • Standard Library
    • Std
    • String
    • OS
    • I/O interfaces
    • Math
    • Networking
  • Classes
    • Class Methods
    • Inheritance
    • Abstract Class (Interface)
  • Import
  • Concurrency
  • Virtual Machine Compiler

Others

  • Assignment Shorthands (e.g, +=, *=)
  • String Interpolation
  • Optional Type Annotations
  • Multi-line Comments
  • Vim Highlighter
  • VSCode Highlighter
  • Transpiler (to JavaScript)
  • Newline As Statement Separator

Contribution

Bug reports and contributions are always welcome :)
Please be sure to add test files if you want to add new features (see tests directory for more info).

Credits

I learned a lot from

slap's People

Contributors

bichanna 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  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

slap's Issues

Infinite Syntax Errors

Code entered to REPL:

rm(o1)

or

anything(1231312312413012340120oo)

Result:

1: rm(o1)
Syntax Error: Expected ';'
1: rm(o1)
Syntax Error: Expected Expression
1: rm(o1)
... and so on

README.md code typo

The code from README.md in the line with writeln(s)
s should be sortedArray

Map and List assignment fails

code:

def merge(x, y) {
    let newMap = {};
    let func = def (k, v) => newMap@[k] = v;

    x -> forEach(func);
    y -> forEach(func);

    return newMap;
}

error:

> let func = def (k, v) => newMap@[k] = v;
RuntimeError: 'newMap' is not defined

Cannot access nested lists

let i = [[[[[[[[0]]]]]]]];
println(i@[0]@[0]);

This code causes an error:


2: let i = [[[[[[[[0]]]]]]]];
3: 
4: println(i@[0]@[0]);

SyntaxError: Expected ')' after arguments

This should be fixed!

Another function expression

Right now, SLAP has this:

let func = define (x) {
    println(x);
};

But it's kind of awkward to use curly braces, {...}, if we just wanted one expression inside the body.
So, I might add another function expression (anonymous function, lambda) that can only have one expression in the body and may look something like this:

let func = ~(x) -> println(x);
# similar to
# let func = define (x) { println(x); };

This new feature may come in handy when we just want to print each content in a list using forEach with minimal code.

import std;

let names = ["bichanna", "nobu", "noby", "Nobuharu Shimazu"];

forEach(names) <- ~(name) -> println(name);
# same as
# forEach(names) <- define (name) { println(name); };

#{
output:
bichanna
nobu
noby
Nobuharu Shimazu
}#

List assignment is broken

code:

let list = [1, 3, 4];
list@[0] = "string";
println(list);

error:


1: let list = [1, 3, 4];
2: list@[0] = "string";
3: println(list);

RuntimeError: '' is not defined

Super expressions don't work

code:

class Car {
    drive() {
        println("driving a car");
    }
}

class Mazda <- Car {}

let myCar = Mazda();
myCar.drive();

#{
driving a car
}#

error:

/Users/nobu/WorkSpace/Nim/SLAP/src/main.nim(90) main
/Users/nobu/WorkSpace/Nim/SLAP/src/main.nim(42) runFile
/Users/nobu/WorkSpace/Nim/SLAP/src/main.nim(36) execute
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(515) interpret
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(397) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(400) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(27) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(244) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(60) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(419) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(397) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(400) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(27) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(233) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(27) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(285) eval
/usr/local/Cellar/nim/1.6.2/nim/lib/pure/collections/tables.nim(246) []
/usr/local/Cellar/nim/1.6.2/nim/lib/pure/collections/tables.nim(236) raiseKeyError
Error: unhandled exception: key not found [KeyError]

Not able to handle CTRL-D

Nim error:

>> /home/myuser/somefolder/slap/src/main.nim(48) main
/home/myuser/somefolder/slap/src/main.nim(35) repl
/usr/lib/nim/system/io.nim(343) readLine
/usr/lib/nim/system/io.nim(132) raiseEOF
Error: unhandled exception: EOF reached [EOFError]

Update on the module system

Right now, importing in SLAP can be done like so:

import std;

let name = "bichanna";
forEach(name) <- define(char) { print(char->upper()); };

But I would like to do something like this:

import std -> GLOBAL; # imported like above

import std -> s; # SLAP equivalent of the `as` keyword in Python.
s.forEach(something, define(a) {});

This is kind of a reminder for me.

Make SLAP extendable

Is your feature request related to a problem? Please describe.
Nope, not related to a problem.

Describe the solution you'd like
I do not really have current solutions to really solve, but the basic idea is to call a function from a shared object file (*.so or *.dll) and call it.
As for this shared object file to be communicate with the program SLAP needs an API just like python does.

Describe alternatives you've considered
I think you could use libffi(I don't know if it can work on Nim or can really help with this feature).

Additional context
None.

Feature Discussion

What do you think about traits? Do you think it'd be nice if SLAP has one?
It may look like this.

trait Triangle {
    calculateArea(height, width) {
        return height * width * 0.5;
    }
}

class Isosceles | Triangle {
    calculateArea(length, width) {
        return super.calculateArea();
    }
}

Should I create an Error type?

Do you think I should implement some kind of error type so that we can do try-catch or try-except blocks?

try {
    println(100 / 0);
} except(DivideByZeroError) {
    print("Cannot divide by zero");
}

Call-limit-reached-error not handled

code:

define func() { func(); }
func();

error:

Traceback (most recent call last)
/Users/nobu/WorkSpace/Nim/SLAP/src/main.nim(86) main
/Users/nobu/WorkSpace/Nim/SLAP/src/main.nim(42) runFile
/Users/nobu/WorkSpace/Nim/SLAP/src/main.nim(36) execute
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(528) interpret
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
(1874 calls omitted) ...
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(45) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(432) executeBlock
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(410) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(413) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(106) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(221) eval
/Users/nobu/WorkSpace/Nim/SLAP/src/interpreter.nim(41) :anonymous
/Users/nobu/WorkSpace/Nim/SLAP/src/env.nim(20) newEnv
/usr/local/Cellar/nim/1.6.2/nim/lib/pure/collections/tableimpl.nim(168) initTable
/usr/local/Cellar/nim/1.6.2/nim/lib/system/gc.nim(494) newSeq
/usr/local/Cellar/nim/1.6.2/nim/lib/system/gc.nim(486) newObj
/usr/local/Cellar/nim/1.6.2/nim/lib/system/alloc.nim(762) rawAlloc
/usr/local/Cellar/nim/1.6.2/nim/lib/system/alloc.nim(635) getSmallChunk
/usr/local/Cellar/nim/1.6.2/nim/lib/system/alloc.nim(606) getBigChunk
/usr/local/Cellar/nim/1.6.2/nim/lib/system/alloc.nim(548) splitChunk
/usr/local/Cellar/nim/1.6.2/nim/lib/system/alloc.nim(543) splitChunk2
/usr/local/Cellar/nim/1.6.2/nim/lib/system/alloc.nim(527) updatePrevSize
/usr/local/Cellar/nim/1.6.2/nim/lib/system/alloc.nim(492) isAccessible
/usr/local/Cellar/nim/1.6.2/nim/lib/system/alloc.nim pageIndex
Error: call depth limit reached in a debug build (2000 function calls). You can change it with -d:nimCallDepthLimit=<int> but really try to avoid deep recursions instead.

Map access bug

code:

let map = {"a": "bichanna"};
println(map@["a"]);

error:

RuntimeError: Value with this key does not exist

String Interpolation

I'm still a newbie on creating languages, so I don't know how to implement string interpolation.
Do you guys have any idea?

let name = "bichanna";
println("Hello, ${name}");

About list...

I'm not sure whether I want this:

writeln(someList@(0));

Or this:

writeln(someList@[0]);

Either way, I want to use the @ because I just like typing it.

Which one do you like?

Stack overflow when multiplying

Error:

/home/nope/nope/slap/src/main.nim(57) main
/home/nope/nope/slap/src/main.nim(33) runFile
/home/nope/nope/slap/src/main.nim(27) execute
/home/nope/nope/slap/src/interpreter.nim(445) interpret
/home/nope/nope/slap/src/interpreter.nim(355) eval
/home/nope/nope/slap/src/interpreter.nim(389) eval
/home/nope/nope/slap/src/interpreter.nim(355) eval
/home/nope/nope/slap/src/interpreter.nim(379) eval
/home/nope/nope/slap/src/interpreter.nim(374) executeBlock
/home/nope/nope/slap/src/interpreter.nim(355) eval
/home/nope/nope/slap/src/interpreter.nim(358) eval
/home/nope/nope/slap/src/interpreter.nim(126) eval
/home/nope/nope/slap/src/interpreter.nim(164) eval
/home/nope/nope/slap/src/interpreter.nim(126) eval
/home/nope/nope/slap/src/interpreter.nim(291) eval
/usr/lib/nim/system/fatal.nim(39) sysFatal
Error: unhandled exception: over- or underflow [OverflowError]

Cmd:

./slap overflow.slap

overflow.slap:

let op = 2;
while(1 == 1)
{
        op = op * op * op * op;
}

Compiler does not compile to `new` keyword

Code:

class Car {
    new(color, style, brand) {
        self.color = color;
        self.brand = brand;
        &style = style;
    }

    getColor() {
        return self.color;
    }
}

$blackMazda = Car("Black", "SUV", "Mazda");

println(blackMazda.getColor());
println(blackMazda.style);
blackMazda.color = "black";
println(blackMazda.color);

Compiled (formatted):

/*
	Compiled by the SLAP compiler!
*/

class Car {
	constructor(color, style, brand) {
		this.color = color;
		this.brand = brand;
		this.style = style;
	};
	getColor() {
		return this.color;
	}
}

var blackMazda = Car("Black", "SUV", "Mazda");           // <- This should be `new Car(...)`

console.log(blackMazda.getColor());

console.log(blackMazda.style);

blackMazda.color = "black";

console.log(blackMazda.color);


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.