Giter Club home page Giter Club logo

luna's Introduction

Luna programming language

Luna is an expressive, minimalistic, elegant programming language implemented in C. With cooperative thread concurrency at its core, async I/O, and influences derived from languages such as Lua, io, Rust, Ruby, and C. Luna favours unification and minimalism over minor obscure conveniences, providing the true convenience of a simple effective language. This includes omitting features which facilitate magic such as getters/setters, method_missing-style delegation etc. This project is very much a work in progress, as I explore the wonderful world of VMs! feel free to join.

Goals

  • fast!
  • small (~2000 SLOC)
  • simple, elegant, explicit
  • small learning curve
  • statically typed with inference
  • high concurrency out of the box via coroutines
  • small embeddable / hackable core
  • ...

Build

To build Luna, simply run:

$ make

Check out the help:

$ ./luna --help

Status

Generalized status:

  • ✔ lexer
  • ✔ parser
  • ✔ test suite
  • ✔ ast
  • ✔ linenoise integration for REPL
  • ◦ register machine
  • ◦ C public/internal apis
  • ◦ garbage collection
  • ◦ continuations
  • ◦ optimizations (TCO etc)
  • ◦ portability
  • ◦ closures
  • ◦ VIM / TM / syntaxes
  • ◦ website
  • ◦ context threading

Typing

Luna is statically typed, however mostly optional thanks to type inference. Some declarations such as function parameters must specify a type:

def greet(name:string)
  ret "Hello " + name
end

Types that can be properly inferred may be, for example function return types as seen above. When fully-qualified the same function would look like this:

def greet(name:string): string
  ret "Hello " + name
end

Function overloading

Luna plans to provide multiple dispatch support. This will drastically cut down on verbosity and fragmentation. For example suppose you have a vec_sum(v) function, in Luna you would simply create a sum(v) function:

def sum(v:vec): int
  ...
end

Thanks to the typing system Luna can choose the correct function to invoke for the given parameters. This technique addresses another fundamental problem of many languages, fragmentation and delocalization. For example it is often tempting to extend native prototypes or classes provided by the host language, such as Array#sum().

Because no such construct exists in Luna you're free to "extend" these types elsewhere simply by defining functions that act on those types, without polluting "global" classes or objects, removing a layer of indirection, as it's often not clear where these additions came from, and they regularly conflict.

Method syntactic sugar

As previously mention Luna has no concept of classes, methods, or prototypes. To increase readability you may invoke functions as if they were methods. For example the following would be equivalent:

cat('urls.txt').grep('https://').print()
print(grep(cat('urls.txt'), 'https://'))

Fork / join

More often than not you want to perform several tasks in parallel, and "join" their results. For this luna provides the & postfix operator, which is syntax sugar for wrapping the expression in a fork() function call:

a = get('http://google.com').grep('<title>') &
b = get('http://likeaboss.com').grep('<title>') &
c = get('http://cuteoverload.com').grep('<title>') &
res = join(a, b, c)

This wraps each statement in a coroutine which may run independently.

Operator precedence

Operator precedence from highest to lowest:

operator                |  associativity
------------------------|---------------
[ ] ( ) .               |  left
++ --                   |  right
! ~ + -                 |  right
* / %                   |  left
+ -                     |  left
<< >>                   |  left
< <= > >=               |  left
== !=                   |  left
&                       |  left
^                       |  left
|                       |  left
&&                      |  left
||                      |  left
?:                      |  right
= += -= /= *= ||= &&=   |  right
not                     |  right
,                       |  left

luna(1)


  Usage: luna [options] [file]

  Options:

    -A, --ast       output ast to stdout
    -T, --tokens    output tokens to stdout
    -h, --help      output help information
    -V, --version   output luna version

  Examples:

    $ luna < some.luna
    $ luna some.luna
    $ luna some
    $ luna

Community

  • irc: #luna-lang on irc.freenode.net

License

MIT

luna's People

Contributors

tj avatar yorkie avatar yawnt avatar z0w0 avatar

Watchers

boot - dud3 avatar

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.