Giter Club home page Giter Club logo

javascriptlint's Introduction

Overview

This is a fork of Matthias Miller's JavaScript Lint. For the original, see:

http://javascriptlint.com/

This tool has two important features that are uncommon among JavaScript lint tools:

  • It does not conflate style with lint. Style refers to arbitrary code formatting rules (like leading whitespace rules). Lint refers to potential program correctness issues (like missing "break" statements inside a switch). The line is certainly fuzzy, as in the case of JavaScript semicolon style, but that's why:

  • It's configurable. Each individual warning can be turned on or off, and warnings can be overridden for individual lines of code. This is essential for cases where potentially dangerous behavior is being deliberately used carefully.

If you want a style checker, see http://github.com/davepacheco/jsstyle.

Synopsis

# make install
...
# build/install/jsl
usage: jsl [options] [files]

options:
  -h, --help          show this help message and exit
  --conf=CONF         set the conf file
  --profile           turn on hotshot profiling
  --recurse           recursively search directories on the command line
  --enable-wildcards  resolve wildcards in the command line
  --dump              dump this script
  --unittest          run the python unittests
  --quiet             minimal output
  --verbose           verbose output
  --nologo            suppress version information
  --nofilelisting     suppress file names
  --nosummary         suppress lint summary
  --help:conf         display the default configuration file

You can define a configuration file for jsl to enable or disable particular warnings and to define global objects (like "window"). See the --help:conf option.

Supported Platforms

This branch of JSL has been tested on:

  • SmartOS (illumos-based), both 32-bit and 64-bit.
  • Mac OS X Snow Leopard, Lion, and Mountain Lion.
  • Debian Squeeze (6.0.5).

All of these use Python 2.6 or later.

History

This version forked from the Subversion repo at revision 302 (2011-04-06). I'll happily look at incorporating new patches from upstream, though the project has been pretty quiet for the last many months.

The main purpose of this fork is to fix building on illumos-based systems. Rather than fix the complex spidermonkey build system to work on illumos, I stripped out a bunch of unnecessary pieces and Makefiles and wrote a new set of Makefiles. The result now builds on Mac OS X and Linux as well.

javascriptlint's People

Contributors

bahamat avatar davepacheco avatar melloc avatar trentm 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

Watchers

 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

javascriptlint's Issues

jsl barfs on leading "#!' line

jsl barfs with "illegal_character" when processing a file that starts with #! (a shebang). This is coming from spidermonkey.

node supports this, so jsl should support it by replacing this line with a blank line (to keep the line number count accurate).

jsl:fallthru doesn't allow spaces in comment

When you've got a case statement that you want to allow fall through you have to use:

/*jsl:fallthru*/

(with no spaces) and can't use:

/* jsl:fallthru */

which seems especially unfriendly of jsl.

array on LHS handled poorly

With this file:

#! /usr/bin/env node

function foo() {
    return ['a', 'b']
}

[v1, v2] = foo();
console.log([v1, v2])

jsl fails miserably

$ PYTHONPATH=.:build ./javascriptlint/jsl fail
JavaScript Lint
Developed by Matthias Miller (http://www.JavaScriptLint.com)
/home/mgerdts/javascriptlint/fail
/home/mgerdts/javascriptlint/fail(4): warning: missing semicolon
Traceback (most recent call last):
  File "./javascriptlint/jsl", line 14, in <module>
    javascriptlint.main()
  File "/home/mgerdts/javascriptlint/javascriptlint/jsl.py", line 142, in main
    profile_func(_lint, paths, conf_, options.printlisting)
  File "/home/mgerdts/javascriptlint/javascriptlint/jsl.py", line 66, in _profile_disabled
    func(*args, **kwargs)
  File "/home/mgerdts/javascriptlint/javascriptlint/jsl.py", line 32, in _lint
    lint.lint_files(paths, lint_error, conf=conf_, printpaths=printpaths)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 340, in lint_files
    lint_file(path, 'js', None)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 331, in lint_file
    _lint_script_parts(script_parts, lint_cache[normpath], _lint_error, conf, import_script)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 540, in _lint_script_parts
    report_native, report_lint, import_callback)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 495, in _lint_script_part
    _lint_node(root, visitors)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 639, in _lint_node
    _lint_node(child, visitors)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 639, in _lint_node
    _lint_node(child, visitors)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 639, in _lint_node
    _lint_node(child, visitors)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 639, in _lint_node
    _lint_node(child, visitors)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 635, in _lint_node
    visitor(node)
  File "/home/mgerdts/javascriptlint/javascriptlint/lint.py", line 569, in onpush
    ret = visitor(node)
  File "/home/mgerdts/javascriptlint/javascriptlint/warnings.py", line 417, in useless_assign
    if value and value.kind == tok.NAME and node.atom == value.atom:
UnboundLocalError: local variable 'value' referenced before assignment

From the error message, it is clear that value is used before assignment. The correct fix is dependent on node version. In older versions of node, it seems arrays on the LHS are not allowed. node v9.3.0 is fine with it.

$ node --version
v0.12.3
$ ./fail
/home/mgerdts/javascriptlint/fail:7
[v1, v2] = foo();
^
ReferenceError: Invalid left-hand side in assignment
    at exports.runInThisContext (vm.js:73:16)
    at Module._compile (module.js:443:25)
    at Object.Module._extensions..js (module.js:478:10)
    at Module.load (module.js:355:32)
    at Function.Module._load (module.js:310:12)
    at Function.Module.runMain (module.js:501:10)
    at startup (node.js:129:16)
    at node.js:814:3

# node --version
v9.3.0
[root@buglets ~]# ./fail
[ 'a', 'b' ]

linker error: libjs.a

Error Message

ld -shared build/nodepos.o build/pyspidermonkey.o -Lspidermonkey/src/build -ljs -o build/pyspidermonkey.so
ld: spidermonkey/src/build/libjs.a(jsapi.o): relocation R_X86_64_32S against `js_XMLObjectOps' can
not be used when making a shared object; recompile with -fPIC spidermonkey/src/build/libjs.a: could
not read symbols: Bad value

My System

Ubuntu 10.04 LTS
Linux GranImmobi 2.6.32-40-generic #87-Ubuntu SMP Tue Mar 6 00:56:56 UTC 2012 x86_64 GNU/Linux

Patch

diff --git a/spidermonkey/src/Makefile b/spidermonkey/src/Makefile
index b809650..9698834 100644
--- a/spidermonkey/src/Makefile
+++ b/spidermonkey/src/Makefile
@@ -41,7 +41,7 @@ OBJECTS = $(CSRCS:%.c=$(BUILDDIR)/%.o)
CFLAGS += -Wall -Wno-format -O
CPPFLAGS += -DXP_UNIX -O -DXP_UNIX -DSVR4 -DSYSV -DSOLARIS
-DHAVE_LOCALTIME_R -UDEBUG -DNDEBUG -UDEBUG_dap -DEDITLINE \

  • -I$(BUILDDIR)
  • -I$(BUILDDIR) -fPIC

all: $(BUILDDIR)/libjs.a

Fails to compile on M1 Mac

Error:

gcc -arch x86_64 -fno-strict-aliasing -O -fPIC -shared -lpython2.7  build/nodepos.o build/pyspidermonkey.o -L/opt/pkg/lib -Lspidermonkey/src/build -ljs -o build/pyspidermonkey.so
ld: warning: ignoring file /opt/pkg/lib/libpython2.7.dylib, building for macOS-x86_64 but attempting to link with file built for macOS-arm64

`which` is useless for finding command paths

I've found that PY_EXEC=$(shell which python2.7) is extremely terrible.

  • which always exits 0
  • which emits errors on stdout
  • make will define PY_EXEC as an empty string even if there is no output.

This means that PY_EXEC will always be set to something, even if it's garbage, and later ifndef PY_EXEC will never evaluate.

A better option for macOS is type -a --path (because we need to detect possibly multiple pythons, and omit /usr/bin/python. For other systems command -v does a better job.

Instead of ifndef PY_EXEC we need to use ifeq ($(PY_EXEC),).

doesn't flag undeclared use of InternalError

The version of javascriptlint in master right now treats "InternalError" as one of the built-in globals, similar to RangeError or TypeError:

https://github.com/davepacheco/javascriptlint/blob/040bf5e429969ae42d976b570fd64c9e17fab20f/javascriptlint/lint.py#L30

This appears to be a non-standard class used by Firefox:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/InternalError

It would probably be better to remove it from the list of built-in globals and have people using Firefox add it as a definition in their project-specific configuration file.

Right now, if you have (say) Node code that uses an InternalError class, javascriptlint will fail to identify cases where that name hasn't been properly declared.

does not build on OS X El Capitan with pkgsrc python 2.7

On OS X 10.11.6 using python 2.7.11 delivered from Joyent's pkgsrc trunk, javascriptlint doesn't build. It spews a ton of warnings first, then bails out:

$ make install
mkdir -p build
(cd spidermonkey/src && CC="gcc -arch i386" CFLAGS="-fno-strict-aliasing -O -fPIC" /Applications/Xcode.app/Contents/Developer/usr/bin/make)
mkdir -p build
gcc -arch i386 -fno-strict-aliasing -O -fPIC -Wall -Wno-format -O -DXP_UNIX -O -DXP_UNIX -DSVR4 -DSYSV -DSOLARIS -DHAVE_LOCALTIME_R -UDEBUG -DNDEBUG -UDEBUG_dap -DEDITLINE -Ibuild -o build/jscpucfg.o -c jscpucfg.c
gcc -arch i386 -fno-strict-aliasing -O -fPIC -Wall -Wno-format -O -o build/jscpucfg build/jscpucfg.o
build/jscpucfg > build/jsautocfg.h
gcc -arch i386 -fno-strict-aliasing -O -fPIC -Wall -Wno-format -O -DXP_UNIX -O -DXP_UNIX -DSVR4 -DSYSV -DSOLARIS -DHAVE_LOCALTIME_R -UDEBUG -DNDEBUG -UDEBUG_dap -DEDITLINE -Ibuild -o build/jskwgen.o -c jskwgen.c
gcc -arch i386 -fno-strict-aliasing -O -fPIC -Wall -Wno-format -O -o build/jskwgen build/jskwgen.o
build/jskwgen > build/jsautokw.h
gcc -arch i386 -fno-strict-aliasing -O -fPIC -Wall -Wno-format -O -DXP_UNIX -O -DXP_UNIX -DSVR4 -DSYSV -DSOLARIS -DHAVE_LOCALTIME_R -UDEBUG -DNDEBUG -UDEBUG_dap -DEDITLINE -Ibuild -o build/jsapi.o -c jsapi.c
jsapi.c:465:15: warning: shifting a negative signed value is undefined
      [-Wshift-negative-value]
        *vp = JSVAL_VOID;
              ^~~~~~~~~~
...
<scratch space>:236:1: note: expanded from here
js_static_assert_line_1153
^
42 warnings generated.
gcc -arch i386 -fno-strict-aliasing -O -fPIC -Wall -Wno-format -O -DXP_UNIX -O -DXP_UNIX -DSVR4 -DSYSV -DSOLARIS -DHAVE_LOCALTIME_R -UDEBUG -DNDEBUG -UDEBUG_dap -DEDITLINE -Ibuild -o build/prmjtime.o -c prmjtime.c
ar rv build/libjs.a build/jsapi.o build/jsarena.o build/jsarray.o build/jsatom.o build/jsbool.o build/jscntxt.o build/jsdate.o build/jsdbgapi.o build/jsdhash.o build/jsdtoa.o build/jsemit.o build/jsexn.o build/jsfun.o build/jsgc.o build/jshash.o build/jsinterp.o build/jsiter.o build/jslock.o build/jslog2.o build/jslong.o build/jsmath.o build/jsnum.o build/jsobj.o build/jsopcode.o build/jsparse.o build/jsprf.o build/jsregexp.o build/jsscan.o build/jsscope.o build/jsscript.o build/jsstr.o build/jsutil.o build/jsxdrapi.o build/jsxml.o build/prmjtime.o
ar: creating archive build/libjs.a
a - build/jsapi.o
a - build/jsarena.o
a - build/jsarray.o
a - build/jsatom.o
a - build/jsbool.o
a - build/jscntxt.o
a - build/jsdate.o
a - build/jsdbgapi.o
a - build/jsdhash.o
a - build/jsdtoa.o
a - build/jsemit.o
a - build/jsexn.o
a - build/jsfun.o
a - build/jsgc.o
a - build/jshash.o
a - build/jsinterp.o
a - build/jsiter.o
a - build/jslock.o
a - build/jslog2.o
a - build/jslong.o
a - build/jsmath.o
a - build/jsnum.o
a - build/jsobj.o
a - build/jsopcode.o
a - build/jsparse.o
a - build/jsprf.o
a - build/jsregexp.o
a - build/jsscan.o
a - build/jsscope.o
a - build/jsscript.o
a - build/jsstr.o
a - build/jsutil.o
a - build/jsxdrapi.o
a - build/jsxml.o
a - build/prmjtime.o
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: build/libjs.a(jslock.o) has no symbols
echo "#define XP_UNIX" > spidermonkey/src/build/js_operating_system.h
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute 'real_prefix'
gcc -arch i386 -o build/nodepos.o -c -fno-strict-aliasing -O -fPIC -DNDEBUG -D_REENTRANT -Ispidermonkey/src -Ispidermonkey/src/build -I/usr/include  -I/opt/pkg/include/python2.7 javascriptlint/pyspidermonkey/nodepos.c
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute 'real_prefix'
gcc -arch i386 -o build/pyspidermonkey.o -c -fno-strict-aliasing -O -fPIC -DNDEBUG -D_REENTRANT -Ispidermonkey/src -Ispidermonkey/src/build -I/usr/include  -I/opt/pkg/include/python2.7 javascriptlint/pyspidermonkey/pyspidermonkey.c
Traceback (most recent call last):
  File "<string>", line 1, in <module>
AttributeError: 'module' object has no attribute 'real_prefix'
gcc -arch i386 -fno-strict-aliasing -O -fPIC -shared /opt/pkg/Python  build/nodepos.o build/pyspidermonkey.o -Lspidermonkey/src/build -ljs -o build/pyspidermonkey.so
clang: error: no such file or directory: '/opt/pkg/Python'
make: *** [build/pyspidermonkey.so] Error 1

It looks like the Makefile tries to find the Python prefix relative to what Python reports as sys.prefix. In my case, that's "/opt/pkg", but it looks like it should be /opt/pkg/lib/python2.7.

The linter fails badly on incomplete control comments

I use JSL with Emacs flymake, and when you start writing a control comment and the check is triggered before the comment is complete, the linter exits with a traceback:

  File ".../javascriptlint/lint.py", line 73, in _parse_control_comment
    keyword = control_comment.lower().split()[0]
IndexError: list index out of range

and thus the flymake-mode gets turned off.

I fixed the issue in my own branch of the tool: since it's under darcs VC, it's not easy for me to provide a git patch, moreover you dropped the test suite so my patch would not apply cleanly.

Anyway, I basically rewrote the _parse_control_comment() in lint.py:

def _parse_control_comment(comment):
    """ Returns None or (keyword, parms) """
    atom = comment.atom.strip()
    if atom.lower().startswith('jsl:'):
        control_comment = atom[4:]
    elif atom.startswith('@') and atom.endswith('@'):
        control_comment = atom[1:-1]
    else:
        return None

    control_comment_lower = control_comment.lower()
    for keyword in ('ignoreall',
                    'ignore',
                    'end',
                    'option explicit',
                    'import',
                    'fallthru',
                    'pass',
                    'declare',
                    'unused',
                    'content-type'):
        if control_comment_lower.startswith(keyword):
            break
    else:
        return None

    parms = control_comment[len(keyword):].strip()
    return (comment, keyword, parms)

As you can see, I also chose a different way of recognizing the "keyword", since the upstream way of using a split() and checking the presence in a dictionary seemed weak to me, given the existence of "option explicit" that contains a space...

For the curious, my branch can be fetched with

darcs get http://darcs.metapensiero.it/our/lele/javascriptlint

segfault on duplicate arguments

javascriptlint segfaults on the following file:

function a(err, data, data) {
    return data;
}

On SmartOS with Python 2.6:

% build/install/jsl foo.js
JavaScript Lint
Developed by Matthias Miller (http://www.JavaScriptLint.com)
/home/cody/src/javascriptlint-original/foo.js
/home/cody/src/javascriptlint-original/foo.js(3): warning: duplicate_formal
zsh: segmentation fault (core dumped)  build/install/jsl foo.js

On Mac OS X with Python 2.7:

% build/install/jsl foo.js
JavaScript Lint
Developed by Matthias Miller (http://www.JavaScriptLint.com)
/Users/cody.mello/src/javascriptlint/foo.js
/Users/cody.mello/src/javascriptlint/foo.js(3): warning: duplicate_formal
zsh: segmentation fault  build/install/jsl foo.js

The stack of the SmartOS core file is:

% pfexec mdb /var/cores/core.python2.6.32761             
Loading modules: [ libumem.so.1mdb: couldn't load pydb functions: No such file or directory
mdb: libpython2.6.so.1.0 module failed to initialize
 libc.so.1 ld.so.1 ]
> ::stack
libpython2.6.so.1.0`tupleiter_next+0x23(84c520c, 84b3c40, 63, 0, 2, 8520628)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x20b5(85204d4, 0, 84a99bc, 0, 10, 83f6920)
libpython2.6.so.1.0`PyEval_EvalCodeEx+0x7cd(84aeb60, 84a99bc, 0, 851e6a8, 2, 851e6b0)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x495c(851e554, 0, 84a99bc, 0, 1, 851e870)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x4ae8(851e714, 0, 84a99bc, 0, 2, 84efed0)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x4ae8(84efcd4, 0, 84a99bc, 0, fef22510, fef4af00)
libpython2.6.so.1.0`PyEval_EvalCodeEx+0x7cd(84ae848, 84a99bc, 0, 8389da8, 9, 8389dcc)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x495c(8389c14, 0, 84a99bc, 0, fef22510, fef4af00)
libpython2.6.so.1.0`PyEval_EvalCodeEx+0x7cd(84ae968, 84a99bc, 0, 84f3190, 5, 84f31a4)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x495c(84f3014, 0, 84a99bc, 0, 84bf380, 81fdf8c)
libpython2.6.so.1.0`PyEval_EvalCodeEx+0x7cd(84ae6e0, 84a99bc, 0, 84f3340, 3, 84f334c)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x495c(84f31d4, 0, 84a99bc, 0, fef22510, fef4a9c0)
libpython2.6.so.1.0`PyEval_EvalCodeEx+0x7cd(84ae728, 84a99bc, 0, 84f36a4, 2, 84f36ac)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x495c(84f3554, 0, 81f98ac, 0, fee59f4a, feed9690)
libpython2.6.so.1.0`PyEval_EvalCodeEx+0x7cd(81ef0b0, 81f98ac, 0, 84b82e0, 3, 8172cf8)
libpython2.6.so.1.0`function_call+0x194(84b5304, 84b82d4, 84c02d4, fea9a65d, 80c0010, 0)
libpython2.6.so.1.0`PyObject_Call+0x5c(84b5304, 84b82d4, 84c02d4, feac2000, 168, 80c0010)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x286e(84f6e14, 0, 81f98ac, 0, 84b9a8c, 81ff728)
libpython2.6.so.1.0`PyEval_EvalCodeEx+0x7cd(81f5530, 81f98ac, 0, 828da44, 4, 828da54)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x495c(828d8d4, 0, 81f98ac, 0, fef41c50, 80c0010)
libpython2.6.so.1.0`PyEval_EvalFrameEx+0x4ae8(81ac094, 0, 815e24c, 815e24c, 81fd94c, 8165608)
libpython2.6.so.1.0`PyEval_EvalCodeEx+0x7cd(8165608, 815e24c, 815e24c, 0, 0, 0)
libpython2.6.so.1.0`PyEval_EvalCode+0x63(8165608, 815e24c, 815e24c, 8173c88, feeca0a5, 81fd700)
libpython2.6.so.1.0`run_mod+0x4f(824c1f8, 8047659, 815e24c, 815e24c, 804741c, 8173c88)
libpython2.6.so.1.0`PyRun_FileExFlags+0x97(fed61c30, 8047659, 101, 815e24c, 815e24c, 1)
libpython2.6.so.1.0`PyRun_SimpleFileExFlags+0xdc(fed61c30, 8047659, 1, 804741c, feed803f, 804741c)
libpython2.6.so.1.0`PyRun_AnyFileExFlags+0x7f(fed61c30, 8047659, 1, 804741c, 80474a0, fefdb8fe)
libpython2.6.so.1.0`Py_Main+0xccf(3, 8047518, 133f, 1f80, 80474cc, feffb0a8)
main+0x27(3, 8047518, 8047528, feffb0a8, 804750c, 8050c92)
_start+0x83(3, 8047640, 8047659, 804766b, 0, 8047672)

The stack just shows functions from libpython2.6.so.1.0, so I'm not sure if this is a problem with the spidermonkey module, or something else.

Incorrect unreferenced_argument errors

Code example:

var loadData = function (event, context) {
    if (context && context.hasActionChanged()) {
        return;
    }};
}

Actual result: jsLint gives erroneous warning for the first argument of the function, if it's not used and it's not last. See below:
{code}/details.js(127): warning: argument declared but never referenced: event (unreferenced_argument){code}

Expected result: jsLint should give a warning only for the arguments that are not used and are located after the last argument, which is used.

Fails to compile on macOS 12

Error:

ld: cannot link directly with dylib/framework, your binary is not an allowed client of /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Python.framework/Versions/2.7/lib/libpython2.7.tbd for architecture x86_64

Recommendation from Apple is to use your own python.

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.