Source code for course "How to create your own programming language"
Go to file
2016-07-29 18:43:06 +03:00
examples Добавлен пример twitch tools 2016-07-25 17:33:37 +03:00
gradle/wrapper Обновлены файлы проекта 2016-02-25 23:18:09 +02:00
src Добавлен модуль forms 2016-07-29 18:43:06 +03:00
.gitignore Обновлены файлы проекта 2016-02-25 23:18:09 +02:00
.travis.yml Исправлен travis.yml 2016-07-24 12:34:30 +03:00
build.gradle Встраивание констант из модулей 2016-07-24 14:30:55 +03:00
gradlew Обновлены файлы проекта 2016-02-25 23:18:09 +02:00
gradlew.bat Обновлены файлы проекта 2016-02-25 23:18:09 +02:00
LICENSE Обновлены файлы проекта 2016-02-25 23:18:09 +02:00
program.own Добавлена функция std::try 2016-06-19 13:25:18 +03:00
proguard.properties Полная миграция в Gradle проект 2016-07-24 11:58:04 +03:00
README.md Обновлён README 2016-07-16 11:54:21 +03:00
settings.gradle Полная миграция в Gradle проект 2016-07-24 11:58:04 +03:00
tests.own Добавлены функции для работы с файлами 2016-06-19 12:31:41 +03:00
visitor.own Оператор include 2016-02-19 12:24:33 +02:00

OwnLang

Build Status

Free Pro Desktop
Free Pro v1.2.0

OwnLang - dynamic functional programming language inspired by Scala and Python. Available for PC, Android and Java ME devices.

Key features

Function values

Functions are values, so we can store them to variables for operating.

operations = {
  "+" : def(a,b) = a+b,
  "-" : def(a,b) = a-b,
  "*" : def(a,b) = a*b,
  "/" : ::division
}
def division(v1, v2) {
  if (v2 == 0) return "error"
  return v1 / v2
}

for operation : operations {
  println operation(2, 3)
}

Pattern Matching

Pattern matching with value pattern, tuple pattern, list pattern and optional condition.

def factorial(n) = match n {
  case 0: 1
  case n if n < 0: 0
  case _: n * factorial(n - 1)
}

def fizzbuzz(limit = 100) {
  for i = 1, i <= limit, i++ {
    println match [i % 3 == 0, i % 5 == 0] {
      case (true, false): "Fizz"
      case (false, true): "Buzz"
      case (true, true): "FizzBuzz"
      case _: i
    }
  }
}

Functional data operations

Operate data in functional style.

use "std"
use "functional"

nums = [1,2,3,4,5,6,7,8,9,10]
nums = filter(nums, def(x) = x % 2 == 0)
// Squares of even numbers
squares = map(nums, def(x) = x * x)
foreach(squares, ::echo)
// Sum of squares
sum = reduce(squares, 0, def(x, y) = x + y)
println "Sum: " + sum

Operator overloading

Why not?

use "std"
use "types"
use "math"

def `..`(a, b) = range(a, b - 1)
def `**`(a, b) = int(pow(a, b))
for y : 1 .. 10 {
  println sprintf("2 ^ %d = %d", y, 2 ** y)
}

Network module

Easy async HTTP requests with http module.

use "std"
use "http"
use "functional"

// GET request
http("https://api.github.com/events", def(r) {
  use "json"
  events = jsondecode(r)
})

// POST request
http("http://jsonplaceholder.typicode.com/users", "POST", {
  "name": "OwnLang",
  "versionCode": 10
}, ::echo)

// PATCH request
http("http://jsonplaceholder.typicode.com/users/2", "PATCH", {"name": "Patched Name"}, ::patch_callback)

def patch_callback(v) {
  println v
}

Language specification

Available on GitBook (English and Russian)

Examples

Build

Build using Gradle ./gradlew dist

or Ant ant clean pack

or take a look to latest release for binaries.

Run

To run script use command

java -jar OwnLang.jar -f input.own

or

java -jar OwnLang.jar < input.own

License

MIT - see MIT licence information