GithubHelp home page GithubHelp logo

margelo / react-native-worklets-core Goto Github PK

View Code? Open in Web Editor NEW
458.0 9.0 26.0 1.49 MB

🧵 A library to run JS functions ("Worklets") on separate Threads

Home Page: https://margelo.io

License: MIT License

CMake 0.84% C++ 56.54% Java 2.72% JavaScript 12.81% TypeScript 23.40% Ruby 1.53% Objective-C 0.99% Objective-C++ 1.17%
async background multithreading native react threads worklet worklets hacktoberfest

react-native-worklets-core's Introduction

🧵 react-native-worklets-core

A Worklet runner for React Native.

const worklet = () => {
  'worklet'
  return Math.random()
}

Note

In most cases, react-native-worklets-core shouldn't be used as a standalone dependency but rather as a peer-dependency for other modules such as react-native-vision-camera, react-native-wishlist, or react-native-skia.

Installation

  1. Install the library from npm:
    yarn add react-native-worklets-core
  2. Add the babel plugin to your babel.config.js:
    module.exports = {
      plugins: [
        ["react-native-worklets-core/plugin"],
        // ...
      ],
      // ...
    };
  3. Restart Metro with clean cache:
    yarn start --reset-cache

Usage

See USAGE.md

Contributing

See the contributing guide to learn how to contribute to the repository and the development workflow.

License

MIT

Credits

  • Credits go to Christian Falch for building the initial version of this library. You're amazing! 🤩
  • Credits go to Software Mansion for introducing the concept of Worklets in Reanimated v2. This library is inspired by Reanimated v2 with a few structural changes to the Worklets architecture to make it more flexible for different use-cases, such as integrating it with other C++ libraries like VisionCamera and WishList.

react-native-worklets-core's People

Contributors

bglgwyng avatar caheinz2 avatar chrfalch avatar hannojg avatar janicduplessis avatar jdnichollsc avatar jtklein avatar mattijsf avatar maxpowa avatar mrousavy avatar szymon20000 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  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  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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-native-worklets-core's Issues

ninja: error: manifest 'build.ninja' still dirty after 100 tries

I am trying to use React Native Vision Camera with Frame Processor enabled.

But I encountered this issue when building for Android:

ninja: error: manifest 'build.ninja' still dirty after 100 tries

Some issues say that I need to sync the time, but I didn't make it work.

Plugin: Worklets inside worklets should contain worklet declaration inside parent asString

Given the following test:

const f = function (a: number) {
  "worklet";
  const fn = (b: number) => {
    "worklet";
    return b * 2;
  };
  const wjs = Worklets.createRunInJsFn(fn);
  return wjs(a);
};
console.log("@@@@@@", f.asString);

We get the following output:

function anonymous(a){const{}=jsThis;const fn=function(b){"worklet";return b*2;};const wjs=Worklets.createRunInJsFn(fn);return wjs(a);}

Not sure what we should expect here...?

[Expo] Its possible ability on Expo?

I am currently facing an issue in my SDK 47 Expo environment while trying to declare a native Expo module to use with an AsyncFunction in my demanding task. After an intensive search, I came across this alternative solution that seems to be exactly what I need. However, I am encountering difficulties with installing and using the library in my Expo environment. The problem arises when integrating it within Babel, as it appears to not be functioning correctly.

[Question] Debugging worklets

Hi, really nice addition splitting this from reanimated into a single package.

Are there any plans to support debugging on both "threads"?

[Suggestion] Can proxying be optional?

Thank you for creating such a great library! Recently, while working on my project, I realized that using proxied objects is not always the best approach. I understand that there are pros and cons to using proxied objects versus plain objects. However, in my case, using proxied objects led to more mistakes and took me a long time to figure out why. For example, when using a proxied array, it failed the Array.isArray test, and I couldn't use functions like Object.entries or Object.keys on it. This made it more challenging to write code than with ordinary functions.

I acknowledge that there may be many cases where proxying is useful, which I may not have encountered yet. However, I was wondering if it would be possible to make proxying optional in your library. I am not familiar with the specifics of your implementation, so I am uncertain if this is feasible or not. Nevertheless, if it is possible, having the option to turn off proxying would be beneficial.

🐛 : ios Build error : The 'jsc/JSCRuntime.h' was not found

What's happening?

I'm trying to use the Frame Processors feature of react-native-vision-camera, so I installed react-native-worklets-core following the troubleshooting steps mentioned here.

Platform iOS in Podfile is 13.0 and Swift version is 5.2.

When I only had react-native-vision-camera installed, everything worked fine. However, after installing react-native-worklets-core, I encountered the following issue:

WKTJsRuntimeFactory.h:15:10 'jsc/JSCRuntime.h' file not found

image

babel.config.js

module.exports = api => {
  const babelEnv = api.env();

  const plugins = [
    [
      'babel-plugin-root-import',
      {
        rootPathSuffix: 'src',
        rootPathPrefix: '~',
      },
    ],
    ['module:react-native-dotenv'],
    ['react-native-worklets-core/plugin'],
  ];

  if (babelEnv !== 'development')
    plugins.push(['transform-remove-console', { exclude: ['error', 'warn'] }]);

  return {
    presets: ['module:metro-react-native-babel-preset'],
    plugins,
  };
};

I've reviewed the troubleshooting guide, but found none.
I would greatly appreciate any guidance or relevant resources to help me resolve this issue.

Reproduceable Code

No response

Relevant log output

ios:
/Users/xxxx/xxxxxxx/xxxxxxx/node_modules/react-native-worklets-core/cpp/WKTJsRuntimeFactory.h:15:10 'jsc/JSCRuntime.h' file not found

Camera Device

No response

Device

iOS 16.6.1
Xcode 14.3.1

VisionCamera Version

3.0.0

Package Versions

"react": "18.2.0"
"react-native": "0.71.6"
"react-native-reanimated": "2.17.0", unable to upgrade to 3.2.0 or higher for some reason.
"react-native-vision-camera": "^3.0.0" / "2.15.4" / "2.15.6" , tried 3 versions
"react-native-worklets-core": "^0.2.0"

Can you reproduce this issue in the VisionCamera Example app?

  • I can reproduce the issue in the VisionCamera Example app.

Additional information

If need any other information, please feel free to let me know.

Can i use setInterval inside useWorklet?

Hello! I want to create a timer and I use useState and because of this the js thread frame rate drops to 55 and does not update to 60 fps. So I want to recreate this using worklets. Is it possible?

Current custom hook:

export const useCountdown = (deadline: string) => {
	const countDownDate = useMemo(() => Date.parse(deadline), [deadline]);
	const [countDown, setCountDown] = useState(countDownDate - new Date().getTime());

	useEffect(() => {
		const interval = setInterval(() => {
			setCountDown(countDownDate - new Date().getTime());
		}, 1000);

		return () => clearInterval(interval);
	}, [countDownDate]);

	return getReturnValues(countDown);
};

Runtime error - Unable to resolve module fb/js

I was able to get the example app to run fine but in an existing project I see the following error at runtime:

Usage

import { Worklets } from 'react-native-worklets'

const doWork = (...) => { 'worklet' .... }
const worklet = Worklets.createRunInContextFn(doWork)
const result = await worklet(parm1, parm2)
[metro]   node_modules
[metro]   ../../node_modules
[metro]   ../../../node_modules
[metro]   ../../../../../node_modules
[metro]   2 | import NativeAnimatedHelper from '../NativeAnimatedHelper';
[metro]   3 |
[metro] > 4 | import invariant from 'fbjs/lib/invariant';
[metro]     |                        ^
[metro]   5 | import normalizeColor from 'normalizeColor';

babel.config.js

    '@babel/plugin-proposal-export-default-from',
    'nativewind/babel',
    'transform-remove-console',
    'react-native-reanimated/plugin',
    ['react-native-worklets/plugin'],

React Native Info

  • v0.71.4

Does it support react-native-reanimated?

It seems that the babel transformation for 'worklet' functions is almost similar to what reanimated plugin transforms so will they clash if we use both plugins together? And will react-native-reanimated will also be supported while using this?

Also does it support multiple background threads for running JS functions or create only one?

Incorrect npm version on npmjs

I tried installing this from npm and it says the package hasn't been updated for over 3 years (version 0.0.1-alpha). However, looking at the GitHub code, it looks like it was updated recently. How do I install this from GitHub directly?

Worklets installation not working. Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 17909 (mqt_js)

Hello Team

Thanks for bringing this package. I've been trying to install it in my JavaScript project (no typescript) and I've been having issues not being able to execute the example.
I've installed it, manually linking it (my project has problems with auto-linking, so I manually added it to the MainApplication.java file). It seems to be capturing the function correctly, but it fails with an error Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 17909 (mqt_js) when executing the code.

I'm trying the example as follows:

import { Worklets } from 'react-native-worklets-core'

const fibonacci = (num) => {
        'worklet'
        if (num <= 1) return 1
        return fibonacci(num - 1) + fibonacci(num - 2)
}
              
const worklet = Worklets.createRunInContextFn(fibonacci)
            
worklet(50).then((result) => {
       console.log(`Fibonacci of 50 is ${result}`)
})

There shouldn't be a difference compared to the example typescript one, except for removing the types.

This is the error I see in my console, before it crashes
image

And this is the logcat

09-04 12:07:20.747 17673 17909 F libc    : Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 17909 (mqt_js), pid 17673 (package.name)
09-04 12:07:20.784 18125 18125 F DEBUG   : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
09-04 12:07:20.784 18125 18125 F DEBUG   : Build fingerprint: 'google/sdk_gphone_x86/generic_x86_arm:11/RSR1.201013.001/6903271:user/release-keys'
09-04 12:07:20.784 18125 18125 F DEBUG   : Revision: '0'
09-04 12:07:20.784 18125 18125 F DEBUG   : ABI: 'x86'
09-04 12:07:20.784 18125 18125 F DEBUG   : Timestamp: 2023-09-04 12:07:20-0500
09-04 12:07:20.784 18125 18125 F DEBUG   : pid: 17673, tid: 17909, name: mqt_js  >>> com.app.name <<<
09-04 12:07:20.784 18125 18125 F DEBUG   : uid: 10163
09-04 12:07:20.784 18125 18125 F DEBUG   : signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
09-04 12:07:20.784 18125 18125 F DEBUG   :     eax 00000000  ebx 00004509  ecx 000045f5  edx 00000006
09-04 12:07:20.784 18125 18125 F DEBUG   :     edi f351e81e  esi be2a6130
09-04 12:07:20.784 18125 18125 F DEBUG   :     ebp f4ca6b90  esp be2a60d8  eip f4ca6b99
09-04 12:07:20.786 18125 18125 F DEBUG   : backtrace:
09-04 12:07:20.786 18125 18125 F DEBUG   :       #00 pc 00000b99  [vdso] (__kernel_vsyscall+9)
09-04 12:07:20.786 18125 18125 F DEBUG   :       #01 pc 0005ad68  /apex/com.android.runtime/lib/bionic/libc.so (syscall+40) (BuildId: 6e3a0180fa6637b68c0d181c343e6806)
09-04 12:07:20.786 18125 18125 F DEBUG   :       #02 pc 00076511  /apex/com.android.runtime/lib/bionic/libc.so (abort+209) (BuildId: 6e3a0180fa6637b68c0d181c343e6806)

Is there something I'm missing here?
Also, I'm not using React's new architecture

Thank you!

fix: Avoid blocking calls from Worklet back to JS

When calling a Worklet function from a worklet context to the Javascript context we're blocking the worklet thread until the function has finished. This has been done since we're having some issues calling async from Worklet -> JS due to missing primitives like setImmediate.

We need to find a solution, there are some questions here as well:

  • If return value is not used in the worklet, don't wait for a result?
  • Should we support both sync and async calls?

This is related to the API for the createRunInJsFn method.

Cannot find module 'string-hash-64'

Hi,

I'm using react-native-worklets to test react-native-vision-camera v3.

I'm receiving the following error:

index.js: [babel]: Cannot find module 'string-hash-64'

Before I upgraded to XCode 14.3 it used to work.

Support calling a worklet from one context to another

Failing Test:

call_worklet_in_other_context: () => {
    const ctx = Worklets.createContext("test");
    const workletInTest = Worklets.createRunInContextFn(function (a: number) {
      "worklet";
      return 100 + a;
    }, ctx);

    const worklet = Worklets.createRunInContextFn(function () {
      "worklet";
      return workletInTest(100);
    });
    return ExpectValue(worklet(), 200);
  },

Calling worklet function from Objective C / Java.

In the usage guide you provide an example of calling the worklet from C++. Is it possible to use facebook::jsi (or something else) on the Objective C side of things to call the function without blocking the main thread and receive the returned JS value?

Updated JsiWorkletContext so that it runs decorators in its constructor

Decorators are now running from the ContextApi.createWorkletContext function. They should be run in all context constructors instead, so that we are guaranteed a valid set of decorators independent of wether we use JS or C++.

Also, decorators must be run in the correct context thread - now they are unwrapped directly in the JS thread.

JsiConsoleDecorator EXC_BAD_ACCESS

Hey @chrfalch, awesome work!

I get the following error when using rn-worklets in my custom JSI module:

com.facebook.react.JavaScript (15): EXC_BAD_ACCESS (code=1, address=0xb0c654aab240)

Error above points to a .global method being inaccessible here, for which wrapping with a check fixes the problem:
https://github.com/chrfalch/react-native-worklets/blob/d62d76c20ed7a3bbfebe5623bc976e5c2d9beabd/cpp/decorators/WKTJsiConsoleDecorator.h#L135

Here is a simplified usage snippet:

#include <thread>
#import "WKTJsiWorkletContext.h"
#import "WKTJsiWorklet.h"

void setup(Runtime &jsRuntime, shared_ptr<CallInvoker> jsCallInvoker) {
  auto workletContext = std::make_shared<RNWorklet::JsiWorkletContext>("MyLibrary");
  auto runOnJS = [jsCallInvoker](std::function<void()>&& f) {};
  auto runOnWorklet = [](std::function<void()>&& f) {};
  workletContext = std::make_shared<RNWorklet::JsiWorkletContext>("MyLibrary");
  workletContext->invokeOnWorkletThread([=](RNWorklet::JsiWorkletContext*, Runtime &rt) {});
}

Thanks!

Array/Object processing inside worklet doesn't work

Hi. Could somebody help me to figure out something?
It works well with primitive values but I can't understand whats wrong with my code.

  const result = useSharedValue({})

  const worklet = useWorklet(() => {
    'worklet';

    result.value = {
      ...props.data.reduce((acc, log) => {
        // I'm using .filter, .map and .forEach here
        // returns object
      }, {})
    }
  }, [props.data, result])

  useEffect(() => {
    worklet()
  }, [props.data])

And it doesn't work. I tried console.log(result.value) and it shows There was a problem sending log messages to your development environment [PrettyFormatPluginError: undefined is not a function]

return value from worklets

  1. object spread is not working
  2. array is converted to object
// from worklets
export workletFun = createRunInContextFn(() => {
    'worklet';
    return {test_arr: [1,2]};
})


// rn js
// array is converted to object
const { test_arr } = await workletFun();
console.log(test_arr);
// {"0": 1, "1": 2 }

// object spread not working
const res = await workletFun();
console.log({...res, a: 1})

Running WASM

Could it potentially be used to run a wasm blob parallel to the actual app and communicating with it? 🤔

Build-Error in Android with RN 0.70.1 and Worklets 0.2.2

I get an error while building Android.'
React-Native: 0.70.1
Vision-Camera: 3.5.1
Worklets-Core: 0.2.2

I have set the following flag in "gradle.properties".
hermesEnabled=true

This gives me this error:

Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.
Could not resolve all task dependencies for configuration ':app:debugCompileClasspath'.
Could not find com.facebook.react:hermes-android:.
Required by:
project :app

But if I set Hermes as "false" I get this error:

Could not determine the dependencies of task ':react-native-worklets-core:compileDebugAidl'.
Could not resolve all task dependencies for configuration ':react-native-worklets-core:debugCompileClasspath'.
Could not find com.facebook.react:react-android:.
Required by:
project :react-native-worklets-core

In both cases, Worklets Core cannot load the libs.

Can someone help me please? Everything works fine on iOS, it's just Android.

In callInContext the function parameter is not a valid worklet and cannot be called between contexts or from/to JS from/to a context.

While using:

function RealApp() {
  const fibonacci = (num: number): number => {
    'worklet';
    if (num <= 1) return 1;
    return fibonacci(num - 1) + fibonacci(num - 2);
  };

  const worklet = Worklets.createRunInContextFn(fibonacci);
  worklet(50).then(result => {
    console.log(`Fibonacci of 50 is ${result}`);
  });
}

I get:

In callInContext the function parameter is not a valid worklet and cannot be called between contexts or from/to JS from/to a context.

Running:

Expo: 49

Babel:
module.exports = function (api) {
  api.cache(true);
  return {
    presets: ['babel-preset-expo'],
    plugins: [
      'nativewind/babel',
      'module:react-native-dotenv',
      'react-native-worklets-core/plugin',
      'react-native-reanimated/plugin',
      ['@babel/plugin-transform-flow-strip-types', { loose: true }],
      ['@babel/plugin-proposal-private-methods', { loose: true }],
    ],
  };
};

I did rebuild, prebuild, clean cache, clean pods, removed node modules reinstalled etc..

Array buffers are not supported as shared values

Hi,

Thanks so much for this awesome library. For my project I can't upgrade RN to 0.71+ yet given there are so many performance issues reported so far. I was able to make this library build with RN 0.76 but, unfortunately, I ran into the "Array buffers are not supported as shared values". I was just trying to run the examples. Any advice/help is greatly appreciated!!

Project Info:
RN 0.76 with JSC engine

Unable to find a specification for `react-native-worklets` depended upon by `VisionCamera`

Hi,
I'm trying to install the react-native-vision-camera V3

After installing those:
yarn add [email protected]
yarn add react-native-worklets@https://github.com/chrfalch/react-native-worklets#3ac2fbb
yarn add yarn add @shopify/[email protected]

but when I'm trying to run "npm i react-native-worklets@https://github.com/chrfalch/react-native-worklets#3ac2fbb"
I get " no match found ..."

trying to run only "npm i react-native-worklets"
its finish the installation.

but when I'm trying to run pod install but I get the error:

[!] Unable to find a specification for react-native-worklets depended upon by VisionCamera
You have either:

  • mistyped the name or version.
  • not added the source repo that hosts the Podspec to your Podfile.

Can someone help me with that?
Thanks

Async/Await in Worklet Functions

Is it possible to use async/await within Worklets?

I'm trying to make calls to asynchronous functions outside of the function tagged with the worklet keyword? As a simple example, is it possible to use the Expo FileSystem async functions like copyFileAsync() from within a worklet?

When tried, I get errors like this:

TypeError: Cannot assign to read only property 'message' of object 'SyntaxError: unknown: Unexpected reserved word 'yield'.

Avoid copying the Worklet API to the closure

We should install the Worklet API in each context to avoid copying it as part of building the closure.

This might be a bit tricky, since the closure is set up by the plugin and the Worklet API is created and installed when the app starts up. Maybe some kind of blacklist that can avoid copying certain closure variables?

In callInContext the function parameter is not a valid worklet

trying to use the library in react native

function App() {

  const fibonacci = (num: number): number => {
    'worklet'
    if (num <= 1) return 1
    return fibonacci(num - 1) + fibonacci(num - 2)
  }

  const worklet = Worklets.createRunInContextFn(fibonacci)
  const result = await worklet(50)
  console.log(`Fibonacci of 50 is ${result}`)

}

error

[Error: In callInContext the function parameter is not a valid worklet and cannot be called between
 contexts or from/to JS from/to a context.]

Android build error, trying to read hermesEnabled property added in gradle.properties from react-native 0.71.0

Error:

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/eisodev/rubic/rubic-connect/node_modules/react-native-worklets-core/android/build.gradle' line: 38

* What went wrong:
A problem occurred evaluating project ':react-native-worklets-core'.
> Could not get unknown property 'hermesEnabled' for project ':app' of type org.gradle.api.Project.

Cause:
The hermesEnabled property was only added from react-native version 0.71.0 in gradle.properties (https://react-native-community.github.io/upgrade-helper/?from=0.68.7&to=0.71.0), which you can see toggling the upgrade helper to lower versions than 0.71.0.

Fix for the user:
Add the property to gradle.properties like in the upgrade helper.

Potential fix for the package owner:
Set min version on react-native in peerDependencies, or if you intend to support any version like now (*), make sure you read this prop using the old way too. It's declared (from older upgrade guides) like this:

app/build.gradle

....
project.ext.react = [
    entryFile: "index.js",
    enableHermes: true,  // clean and rebuild if changing
    devDisabledInStaging: true,
]
...
/**
 * Whether to enable the Hermes VM.
 *
 * This should be set on project.ext.react and that value will be read here. If it is not set
 * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
 * and the benefits of using Hermes will therefore be sharply reduced.
 */
def enableHermes = project.ext.react.get("enableHermes", true);

If going by ChatGPT4 (which helped me find the root of this problem). PS! This following code is not vetted nor tested by me!

Instead of directly accessing hermesEnabled, 
the proper way to check if Hermes is enabled in
modern React Native versions is via enableHermes. 
You can update the worklets package's check to:

if (appProject?.ext?.get("react")?.get("enableHermes")) {
    return "hermes"
}

Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'Worklets' could not be found. Verify that a module by this name is registered in the native binary

Hello,

I was wondering if react-native-worklets-core is compatible with Expo?

I created a brand new app with the "npx create-expo-app" command and added react-native-worklets-core using the setup instructions:
https://github.com/margelo/react-native-worklets-core/blob/main/README.md

But when I run npm run android I get the below error after the app starts on the device:

ERROR Invariant Violation: TurboModuleRegistry.getEnforcing(...): 'Worklets' could not be found. Verify that a module by this name is registered in the native binary., js engine: hermes
ERROR Invariant Violation: "main" has not been registered. This can happen if:

  • Metro (the local dev server) is run from the wrong folder. Check if Metro is running, stop it and restart it in the current project.
  • A module failed to load due to an error and AppRegistry.registerComponent wasn't called., js engine: hermes

Attached is a sample app to reproduce the error.

Expo app.zip

Change to use jsThis when calling worklets

Finally found the use case / explanation for using jsThis:

const data = {
  a: 100,
  b: 1000,
  f: function () {
    "worklet";
    return this.a + this.b;
  },
}

Meaning that if we replace the use of this with the closure when calling the function we're off to no good. The function will not evaluate correctly.

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.