Giter Club home page Giter Club logo

scalagwt-scala's People

Contributors

adriaanm avatar axel22 avatar blair avatar dchenbecker avatar dcsobral avatar dotta avatar dragos avatar drmaciver avatar erikrozendaal avatar gkossakowski avatar heathermiller avatar hubertp avatar jsuereth avatar khernyo avatar kzys avatar lexspoon avatar lindydonna avatar lrytz avatar magarciaepfl avatar milessabin avatar non avatar odersky avatar paulp avatar pedrofurla avatar phaller avatar soc avatar szeiger avatar tiarkrompf avatar vladureche avatar xeno-by 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

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

scalagwt-scala's Issues

Anonymous class methods don't work

The code:

class A

class Test {
  val a = new A {
    def some = "Works"
  } 
  a.some
}

The exception during scalac:

   [scalac] scala.reflect.internal.MissingRequirementError: class scala.runtime.EmptyMethodCache not found.
   [scalac]     at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16)
   [scalac]     at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17)
   [scalac]     at scala.reflect.internal.Definitions$definitions$$anonfun$getModuleOrClass$3.apply(Definitions.scala:697)
   [scalac]     at scala.reflect.internal.Definitions$definitions$$anonfun$getModuleOrClass$3.apply(Definitions.scala:697)
   [scalac]     at scala.reflect.internal.Symbols$Symbol.orElse(Symbols.scala:1773)
   [scalac]     at scala.reflect.internal.Definitions$definitions$.getModuleOrClass(Definitions.scala:696)
   [scalac]     at scala.reflect.internal.Definitions$definitions$.getModuleOrClass(Definitions.scala:705)
   [scalac]     at scala.reflect.internal.Definitions$definitions$.getClass(Definitions.scala:662)
   [scalac]     at scala.reflect.internal.Definitions$definitions$.EmptyMethodCacheClass(Definitions.scala:331)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.mkNewPolyCache$1(CleanUp.scala:246)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.reflectiveMethodCache$1(CleanUp.scala:247)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.cache$1(CleanUp.scala:408)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.lookup$1(CleanUp.scala:409)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.invocation$1(CleanUp.scala:411)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.genDefaultCall$1(CleanUp.scala:419)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.apply(CleanUp.scala:451)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer$$anonfun$callAsReflective$1$1.apply(CleanUp.scala:350)
   [scalac]     at scala.tools.nsc.ast.TreeGen.evalOnce(TreeGen.scala:210)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.callAsReflective$1(CleanUp.scala:350)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:502)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:1245)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:1243)
   [scalac]     at scala.collection.immutable.List.loop$1(List.scala:150)
   [scalac]     at scala.collection.immutable.List.mapConserve(List.scala:166)
   [scalac]     at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:1243)
   [scalac]     at scala.reflect.api.Trees$Transformer.transform(Trees.scala:1157)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:655)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transform$5.apply(Trees.scala:1143)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transform$5.apply(Trees.scala:1141)
   [scalac]     at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:1252)
   [scalac]     at scala.reflect.api.Trees$Transformer.transform(Trees.scala:1140)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:655)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:1227)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transformTrees$1.apply(Trees.scala:1227)
   [scalac]     at scala.collection.immutable.List.loop$1(List.scala:150)
   [scalac]     at scala.collection.immutable.List.mapConserve(List.scala:166)
   [scalac]     at scala.reflect.api.Trees$Transformer.transformTrees(Trees.scala:1227)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:559)
   [scalac]     at scala.reflect.api.Trees$Transformer.transformTemplate(Trees.scala:1229)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:1127)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transform$2.apply(Trees.scala:1126)
   [scalac]     at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:1252)
   [scalac]     at scala.reflect.api.Trees$Transformer.transform(Trees.scala:1125)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:655)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:1245)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transformStats$1.apply(Trees.scala:1243)
   [scalac]     at scala.collection.immutable.List.loop$1(List.scala:150)
   [scalac]     at scala.collection.immutable.List.mapConserve(List.scala:166)
   [scalac]     at scala.reflect.api.Trees$Transformer.transformStats(Trees.scala:1243)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:1121)
   [scalac]     at scala.reflect.api.Trees$Transformer$$anonfun$transform$1.apply(Trees.scala:1121)
   [scalac]     at scala.reflect.api.Trees$Transformer.atOwner(Trees.scala:1252)
   [scalac]     at scala.reflect.api.Trees$Transformer.transform(Trees.scala:1120)
   [scalac]     at scala.tools.nsc.transform.CleanUp$CleanUpTransformer.transform(CleanUp.scala:655)
   [scalac]     at scala.tools.nsc.ast.Trees$Transformer.transformUnit(Trees.scala:204)
   [scalac]     at scala.tools.nsc.transform.Transform$Phase.apply(Transform.scala:30)
   [scalac]     at scala.tools.nsc.Global$GlobalPhase.applyPhase(Global.scala:374)
   [scalac]     at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:344)
   [scalac]     at scala.tools.nsc.Global$GlobalPhase$$anonfun$run$1.apply(Global.scala:344)
   [scalac]     at scala.collection.Iterator$class.foreach(Iterator.scala:690)
   [scalac]     at scala.collection.mutable.ListBuffer$$anon$1.foreach(ListBuffer.scala:319)
   [scalac]     at scala.tools.nsc.Global$GlobalPhase.run(Global.scala:344)
   [scalac]     at scala.tools.nsc.Global$Run.compileUnits(Global.scala:1066)
   [scalac]     at scala.tools.nsc.Global$Run.compileSources(Global.scala:1041)
   [scalac]     at scala.tools.nsc.Global$Run.compile(Global.scala:1154)
   [scalac]     at scala.tools.ant.Scalac.executeInternal(Scalac.scala:618)
   [scalac]     at scala.tools.ant.Scalac.execute(Scalac.scala:566)
   [scalac]     at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
   [scalac]     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   [scalac]     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   [scalac]     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   [scalac]     at java.lang.reflect.Method.invoke(Method.java:601)
   [scalac]     at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
   [scalac]     at org.apache.tools.ant.Task.perform(Task.java:348)
   [scalac]     at org.apache.tools.ant.Target.execute(Target.java:390)
   [scalac]     at org.apache.tools.ant.Target.performTasks(Target.java:411)
   [scalac]     at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
   [scalac]     at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
   [scalac]     at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
   [scalac]     at org.eclipse.ant.internal.launching.remote.EclipseDefaultExecutor.executeTargets(EclipseDefaultExecutor.java:32)
   [scalac]     at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
   [scalac]     at org.eclipse.ant.internal.launching.remote.InternalAntRunner.run(InternalAntRunner.java:424)
   [scalac]     at org.eclipse.ant.internal.launching.remote.InternalAntRunner.main(InternalAntRunner.java:138)

I'm using 0.1-M3.
I would like to test on the latest sources, but the build process seems not straightforward.

By the way, thank you for making Scala+GWT possible!

String.format doesn't work

Here's the output from ant gwtc when trying to use Scala's String.format. I'm guessing an implicit isn't being inserted?

 [java] com.google.gwt.dev.jjs.InternalCompilerException: Unexpected error during visit.
 [java]     at com.google.gwt.dev.jjs.ast.JVisitor.translateException(JVisitor.java:109)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:276)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
 [java]     at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:116)
 [java]     at com.google.gwt.dev.jjs.ast.JReturnStatement.traverse(JReturnStatement.java:39)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor$ListContextImmutable.traverse(JModVisitor.java:170)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.acceptWithInsertRemoveImmutable(JModVisitor.java:336)
 [java]     at com.google.gwt.dev.jjs.ast.JBlock.traverse(JBlock.java:83)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
 [java]     at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:137)
 [java]     at com.google.gwt.dev.jjs.ast.JVisitor.accept(JVisitor.java:133)
 [java]     at com.google.gwt.dev.jjs.ast.JMethodBody.traverse(JMethodBody.java:82)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
 [java]     at com.google.gwt.dev.jjs.ast.JMethod.visitChildren(JMethod.java:426)
 [java]     at com.google.gwt.dev.jjs.ast.JMethod.traverse(JMethod.java:395)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:265)
 [java]     at com.google.gwt.dev.jjs.impl.UnifyAst.mainLoop(UnifyAst.java:890)
 [java]     at com.google.gwt.dev.jjs.impl.UnifyAst.exec(UnifyAst.java:615)
 [java]     at com.google.gwt.dev.jjs.JavaToJavaScriptCompiler.precompile(JavaToJavaScriptCompiler.java:545)
 [java]     at com.google.gwt.dev.jjs.JavaScriptCompiler.precompile(JavaScriptCompiler.java:33)
 [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:278)
 [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:229)
 [java]     at com.google.gwt.dev.Precompile.precompile(Precompile.java:141)
 [java]     at com.google.gwt.dev.Compiler.run(Compiler.java:232)
 [java]     at com.google.gwt.dev.Compiler.run(Compiler.java:198)
 [java]     at com.google.gwt.dev.Compiler$1.run(Compiler.java:170)
 [java]     at com.google.gwt.dev.CompileTaskRunner.doRun(CompileTaskRunner.java:88)
 [java]     at com.google.gwt.dev.CompileTaskRunner.runWithAppropriateLogger(CompileTaskRunner.java:82)
 [java]     at com.google.gwt.dev.Compiler.main(Compiler.java:177)
 [java] Caused by: java.lang.NoSuchMethodError: java.lang.String.format(Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/String;
 [java]     at com.google.gwt.dev.jjs.impl.UnifyAst.translate(UnifyAst.java:1086)
 [java]     at com.google.gwt.dev.jjs.impl.UnifyAst.access$800(UnifyAst.java:120)
 [java]     at com.google.gwt.dev.jjs.impl.UnifyAst$UnifyVisitor.visit(UnifyAst.java:333)
 [java]     at com.google.gwt.dev.jjs.ast.JMethodCall.traverse(JMethodCall.java:240)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.traverse(JModVisitor.java:361)
 [java]     at com.google.gwt.dev.jjs.ast.JModVisitor.accept(JModVisitor.java:273)
 [java]     ... 32 more
 [java]       [ERROR] at Unknown(0): String.format($this.toString(), (Object[]) ((TraversableOnce) args.map(new StringLike$$anonfun$format$1($this), Seq$.MODULE$.canBuildFrom())).toArray(Manifest$.MODULE$.Object()))
 [java]          com.google.gwt.dev.jjs.ast.JMethodCall
 [java]       [ERROR] at Unknown(0): return String.format($this.toString(), (Object[]) ((TraversableOnce) args.map(new StringLike$$anonfun$format$1($this), Seq$.MODULE$.canBuildFrom())).toArray(Manifest$.MODULE$.Object()))
 [java]          com.google.gwt.dev.jjs.ast.JReturnStatement
 [java]       [ERROR] at Unknown(0): {
 [java]   return String.format($this.toString(), (Object[]) ((TraversableOnce) args.map(new StringLike$$anonfun$format$1($this), Seq$.MODULE$.canBuildFrom())).toArray(Manifest$.MODULE$.Object()));
 [java] }
 [java]          com.google.gwt.dev.jjs.ast.JBlock
 [java]       [ERROR] at Unknown(0): {
 [java]   return String.format($this.toString(), (Object[]) ((TraversableOnce) args.map(new StringLike$$anonfun$format$1($this), Seq$.MODULE$.canBuildFrom())).toArray(Manifest$.MODULE$.Object()));
 [java] }
 [java]          com.google.gwt.dev.jjs.ast.JMethodBody
 [java]       [ERROR] at Unknown(0): public static String format(StringLike $this, Seq args);
 [java] 
 [java]          com.google.gwt.dev.jjs.ast.JMethod
 [java] Shutting down PersistentUnitCache thread

Broken handling of pattern matching on AnyVals

Code like this:

  def matchOnPrimitive(x: Any): Int = x match {
    case x: Byte => 0
    case _ => 1
  }

results in broken jribble output:

  public I; matchOnPrimitive(Ljava/lang/Object; x) {
    Ljava/lang/Object; temp1 = x;
    I; $1$;
    if (temp1.<instanceof>(B;))
      {
        $1$ = 0;
      }
    else
      {
        $1$ = 1;
      }
    return $1$;
  }

Note instanceof check with primitive type as an argument.

Run jribble and jvm backends in one run

As discussed before we would like to run jribble backend along with jvm one so we get both jribble files and class files in one compilation run.

We want to do this because we need both class files and jribble files in our current scalagwt-gwt implementation.

This issue is independent of whether we want to package jribble backend as a compiler plug-in or not.

StackOverflow in JS when using nested Scala XML literals

class MyEntryPoint extends EntryPoint {
  def onModuleLoad {
    val xml = <b><i>text</i>text</b>
    RootPanel.get().add(new Label(xml.toString))
  }
}

DevMode works. But when compiled to JS
IE says "Stack overflow at line..."
Chrome says "Uncaught RangeError: Maximum call stack size exceeded"
Looks like the problem is inside xml.toString

But this works fine everywhere:

class MyEntryPoint extends EntryPoint {
  def onModuleLoad {
    val xml = <b>text</b>
    RootPanel.get().add(new Label(xml.toString))
  }
}

Wrong initialization order for objects

Consider following code

object A {
  val x = new Foo {
    println(y)
  }
  val y = 10
}

class Foo

When compiled using jvm backend it will print 0 because y is not initialized before x is initialized so it prints default value. However, when compiled to jribble it will fail with NPE because reference to y is expanded to A.y which means that we need an instance of A at the time constructor of A is being executed. Given current implementation, this instance is not available.

Reference to java.lang.Float.NaN leads to broken jribble output

Following snippet

    val NaN_FLOAT  = java.lang.Float.NaN
    val NEG_INF_FLOAT = java.lang.Float.NEGATIVE_INFINITY
    val POS_INF_FLOAT = java.lang.Float.POSITIVE_INFINITY

will lead to following (broken jribble output)

    F; NaN_FLOAT = NaNF;
    F; NEG_INF_FLOAT = -InfinityF;
    F; POS_INF_FLOAT = InfinityF;

In order to fix it we need to unroll inlining of constants for these cases in jribble backend.

Enumerations are broken

Not sure if this is intended or not. I'm using milestone 2, and scalac-client is equivalent to scalac in that ant file. I have my build split up into server and client classpaths so that I can separate things out.

[scalac-client] Compiling 5 source files to /Users/jhartman/code/orgchart/war/WEB-INF/jribble
[scalac-client] /Users/jhartman/code/orgchart/shared/src/josh/shared/Seniority.scala:3: error: not found: type Enumeration
[scalac-client] object Seniority extends Enumeration {
[scalac-client] ^
[scalac-client] /Users/jhartman/code/orgchart/shared/src/josh/shared/Seniority.scala:4: error: not found: type Value
[scalac-client] type Seniority = Value

Move building scala-library-gwt.jar to separate project

It's been already discussed and it's seems that everybody agrees that moving hairy logic that prepares scala-library-gwt.jar out of scalagwt-scala project is a good idea.

Specific changes will include:

  1. Creating a new project called scalagwt-library
  2. Moving all logic responsible for building jdk2ikvm plugin and preparing the library into scalagwt-library
  3. Making sure that output of git diff master..scalagwt command gets significantly smaller at the end of the process

Once this is done, scalagwt-scala should build without any external dependencies again.

Wrong variable names in try..catch statement of jribble output

Following code snippet:

  def catchAndPassToLambda {
    try { true } catch { case ex: Exception => val f = () => ex }
  }

results in jribble output where variable holding exception is named ex but referenced as ex$2. See below:

member {
  type: Method
  modifiers {
    isPublic: true
  }
  method {
    name: "catchAndPassToLambda"
    returnType {
      type: Void
    }
    body {
      type: Block
      block {
        statement {
          type: Try
          tryStat {
            block {
              type: Block
              block {
              }
            }
            catch {
              tpe {
                pkg: "java.lang"
                name: "Exception"
              }
              param: "ex"
              body {
                type: Block
                block {
                  statement {
                    type: VarDef
                    varDef {
                      tpe {
                        type: Named
                        namedType {
                          pkg: "scala"
                          name: "Function0"
                        }
                      }
                      name: "f"
                      initializer {
                        type: NewObject
                        newObject {
                          clazz {
                            name: "Try$$anonfun$1"
                          }
                          signature {
                            name: "new"
                            owner {
                              name: "Try$$anonfun$1"
                            }
                            paramType {
                              type: Named
                              namedType {
                                name: "Try"
                              }
                            }
                            paramType {
                              type: Named
                              namedType {
                                pkg: "java.lang"
                                name: "Exception"
                              }
                            }
                            returnType {
                              type: Named
                              namedType {
                                name: "Try$$anonfun$1"
                              }
                            }
                          }
                          argument {
                            type: ThisRef
                          }
                          argument {
                            type: VarRef
                            varRef {
                              name: "ex$2"
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

Support for Java enums in binary form (class files) is broken

Let's say we've got JavaEnum.java:

public enum JavaEnum { X }

and following Y.scala:

class Y {
  def foo = JavaEnum.X
}

Compile JavaEnum first with javac JavaEnum.java so there class file created for it and then we compile with scalac:

scalac -target:jribble Y.scala

you'll notice that jribble output is broken:

public class LY; extends Ljava/lang/Object; implements Lscala/ScalaObject; {

  public LJavaEnum; foo() {
    return value X;
  }

  public this() {
    (Ljava/lang/Object;::super()V;)();
  }
}

but if you supply java source file as argument to scalac:

scalac -target:jribble Y.scala JavaEnum.java

then jribble output seems to be correct:

public class LY; extends Ljava/lang/Object; implements Lscala/ScalaObject; {

  public LJavaEnum; foo() {
    return LJavaEnum;.X;
  }

  public this() {
    (Ljava/lang/Object;::super()V;)();
  }
}

Escaping of Char values is broken

class Constants {
  def chars = {
    val minChar = Char.MinValue
    val maxChar = Char.MaxValue
  }
}

results in broken jribble output because values are not escaped.

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.